Blog スタッフブログ

EC-CUBE システム開発

[EC-CUBE]Orderのカラム追加と購入時データ保存について

システム開発担当のTFです。

※EC-CUBE4系統対応

やり方

  • Orderにカラム追加
  • フォーム定義と追加

メモ

skip_add_form の対応必要
ショッピングの確認から購入実行時は、skip_add_formのパラメータが追加され、フォームデータ飛ばさない仕様ぽい
のでOrderにカラム足して購入時に保存要る時、この辺の処理必要になる
skip_add_form でフォーム生成しないをいれてないと、フォームある認定されて?、この場合、デフォルトのnullになる

レジに進む で dtb_order ができる
確認する で 値入る
  確認画面ではform情報がhiddenとかでも飛ばしてなさそうで、skip_add_formのパラメータが追加され、フォームデータ飛ばない仕様ぽい
注文する で バリデーションとかは入るが、フォーム周りスキップで 値入って確定( この際に、skip_add_formの対応無いと、データが入らない )

OrderItemは下記
[EC-CUBE]EC-CUBE4のOrderItemのカラム追加と購入時データの保存方法
[EC-CUBE]OrderItemに独自カラム追加した場合の注意点

サンプル

<?php

namespace Customize\Entity;

use Eccube\Annotation\EntityExtension;
use Doctrine\ORM\Mapping as ORM;

/**
 * @EntityExtension("Eccube\Entity\Order")
 */
trait OrderTrait
{
	/**
	 * @var int
	 *
	 * @ORM\Column(name="resource_recovery_flg", type="smallint", nullable=true, options={"unsigned":true,"default":0})
	 */
	private $resource_recovery_flg = 0;
	
	/**
     * {@inheritdoc}
     */
    public function setResourceRecoveryFlg($resourceRecoveryFlg)
    {
        $this->resource_recovery_flg = $resourceRecoveryFlg;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getResourceRecoveryFlg()
    {
        return $this->resource_recovery_flg;
    }
}
// プロジェクト直下に移動
cd プロジェクトのパス

// Proxy作成
php bin/console eccube:generate:proxies

// キャッシュ削除
php bin/console cache:clear --no-warmup
// テーブルに反映
php bin/console doctrine:schema:update --dump-sql --force
<?php

namespace Customize\Form\Extension;

use Eccube\Entity\Order;
use Eccube\Form\Type\Shopping\OrderType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Validator\Constraints\NotBlank;

class OrderExtention extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
		// スキップ時は、フォーム生成しない
        if (!$options['skip_add_form']) {
			$builder->add("resource_recovery_flg",Type\ChoiceType::class,[
				'expanded' => false,
				'multiple' => false,
				'required' => false,
				'choices' => ['いいえ'=>'0', 'はい'=>'1'],
			]);
		}
		
		
		$builder->addEventListener(FormEvents::POST_SET_DATA,
                                   function (FormEvent $event) {
            /** @var Order $data */
            $Order = $event->getData();
            $form = $event->getForm();
        });

        $builder->addEventListener(FormEvents::PRE_SUBMIT,
                                   function (FormEvent $event) {
			$options = $event->getForm()->getConfig()->getOptions();

            // 注文確認->注文処理時はフォームは定義されない.
            if ($options['skip_add_form']) {
                /** @var Order $Order */
                $Order = $event->getForm()->getData();
                return;
            } else {
                $data = $event->getData();
                $form = $event->getForm();

                /** @var Order $Order */
                $Order = $event->getForm()->getData();
            }
        });
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return OrderType::class;
    }
}
<!-- 省略 -->
	<div class="ec-input {{ has_errors(form.resource_recovery_flg) ? ' error' }}">
		{{ form_widget(form.resource_recovery_flg) }}
		{{ form_errors(form.resource_recovery_flg) }}
	</div>
<!-- 省略 -->