Orderエンティティ拡張時、FormAppendを利用するとデータが登録されない
- Dominant language
- PHP
- Stars
- 788
- Forks
- 719
- Avg merge
- 4d 4h
- Merged PRs (30d)
- 39
Description
## 概要(Overview)
注文時に選択する項目を追加するために、Orderエンティティを拡張する際、
FormAppend を使用すると、受注情報に追加項目の値が保存されない。
- 例:のし、ラッピング等
## 期待する内容(Expect) or 要望 (Requirement)
FormAppend を利用しても受注情報に値が追加されること
## 再現手順(Procedure)
1. Orderエンティティに項目を追加し、FormAppend を記述する
2. 注文ページ(Shopping/index.twig)に入力欄を追加する
3. 確認画面まではDBに値が保持されているが、注文を完了すると値がクリアされる
### 解析内容
- 注文処理(`ShoppingController::checkout`)では、`createForm`のパラメータに
`'skip_add_form' => true`を指定しているため、`OrderType::buildForm`の処理はスキップされる(form項目は追加されない)
- `src/Eccube/Form/Extension/DoctrineOrmExtension.php::buildForm`の下記処理にて、FormAppendを利用している項目があると $form に追加される
```
/** @var \ReflectionProperty[] $props */
$props = $meta->getReflectionProperties();
foreach ($props as $prop) {
$anno = $this->reader->getPropertyAnnotation($prop, FormAppend::class);
if ($anno) {
$options = is_null($anno->options) ? [] : $anno->options;
$options['eccube_form_options'] = [
'auto_render' => (true === $anno->auto_render),
'form_theme' => $anno->form_theme,
'style_class' => $anno->style_class ? $anno->style_class : 'ec-select',
];
if (!isset($form[$prop->getName()])) {
$form->add($prop->getName(), $anno->type, $options);
}
}
}
```
- 注文処理の下記にて、項目がクリアされる
```
$form->handleRequest($request);
```
- クリアされる理由は関連情報を参照
### 環境 (environment)
+ EC-CUBE: 4.0.2
+ PHP: 7.2.15
+ DB:
- MySQL 5.7.25
## 関連情報 (Ref)
- [php - Symfony2 - How to stop Form->handleRequest from nulling fields that don't exist in post data - Stack Overflow](https://stackoverflow.com/questions/25291607/symfony2-how-to-stop-form-handlerequest-from-nulling-fields-that-dont-exist)
Contributor guide
Assessment
This issue has not been assessed yet.