WEBサイト制作・アプリ開発・システム開発・ブランディングデザイン制作に関するご相談はお気軽にご連絡ください。
構想段階からじっくりとヒアリングし、お客様の課題にあわせたアプローチ手法でお客様の“欲しかった”をカタチにしてご提案いたします。
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>
<!-- 省略 -->