ECCUBE4.0.3でこちらと同じ問題に遭遇してしまいました。
ShoppingController.php内の以下のコード部分でnullが入るようです。
注文手続き画面に項目追加したい
(略)
public function checkout(Request $request)
(略)
var_dump($form->getViewData()); //☆この部分ではnullはなし
$form->handleRequest($request);
var_dump($form->getViewData());exit; //☆この部分でnullが代入される
Customize\Form\Extension\Shopping\OrderTypeExtension で項目を追加したのに、そして注文確認画面まではちゃんとその追加項目を取り回しできているのに、checkoutの$form->handleRequestでnullが入っちゃって、結果、注文情報に保存されない…
どうにもわからなかったので力業で対応してみました
app/Customize/Form/Extension/Shopping/OrderTypeExtension.php
(ここではreceipt_nameという項目を追加しています)
<?php namespace Customize\Form\Extension\Shopping; use Eccube\Common\EccubeConfig; use Eccube\Form\Type\Shopping\OrderType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Validator\Constraints as Assert; class OrderTypeExtension extends AbstractTypeExtension { private $eccubeConfig; public function __construct(EccubeConfig $eccubeConfig) { $this->eccubeConfig = $eccubeConfig; } /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $config = $this->eccubeConfig; $builder ->add('receipt_name', TextType::class, [ 'required' => false, 'constraints' => [ new Assert\Length( ['min' => 0, 'max' => $config['eccube_name_len'] ] ) ], ]) ->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit']) ; } public function onPreSubmit(FormEvent $event) { // ShoppingControllerのcheckoutでhandleRequestの後にreceipt_nameが消える問題の対応 $data = $event->getData(); $receipt_name = $event->getForm()->get('receipt_name')->getData(); if( !isset($data['receipt_name']) ){ $data['receipt_name'] = $receipt_name ; } $event->setData($data); } /** * {@inheritdoc} */ public function getExtendedType() { return OrderType::class; } }
PRE_SUBMITというイベントでformの中身を確認して、receipt_nameがあれば入れ直しています
わざわざこんなソースを書かないといけないのは、きっと何かおかしい…
なにか大きな勘違いをしてるのかもしれないけど、でもとりあえずこれで問題は回避できました