[ECCUBE4] OrderTypeに項目追加したいんだけど…

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;
}
}
<?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; } }
<?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があれば入れ直しています

わざわざこんなソースを書かないといけないのは、きっと何かおかしい…
なにか大きな勘違いをしてるのかもしれないけど、でもとりあえずこれで問題は回避できました

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です