Blog スタッフブログ

EC-CUBE システム開発

[EC-CUBE]OrderItemに独自カラム追加した場合の注意点

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

※EC-CUBE4.0.4

メモ

OrderItemのTraitで、 auto_renderをfalseにしている場合、
管理画面の受注編集でフォームを追加しないと、編集保存で値がクリアされた( バージョンや他カスタマイズの影響の可能性も有り )
auto_renderをtrue にするか 手動でフォーム追加 必要と思われる
フォームによる編集をしない場合でも、hiddenで飛ばす必要があると思われる

サンプル

<?php

namespace Customize\Entity;

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

/**
  * @EntityExtension("Eccube\Entity\OrderItem")
 */
trait OrderItemTrait
{
    /**
     * @ORM\Column(name="delivered", type="boolean", nullable=true, options={"default" = false})
	 * @Eccube\FormAppend(
	 *     auto_render=false,
	 * )
     */
    public $delivered;
	
	/**
     * @ORM\Column(name="delivery_date", type="datetimetz", nullable=true)
	 * @Eccube\FormAppend(
	 *     auto_render=false,
	 * )
     */
    public $delivery_date;
	
	
	/**
	 * @return boolean
	 */
	public function getDelivered()
	{
		return ( !empty($this->delivered) ) ? true : false;
	}

	/**
	 * @param boolean|null $delivered
	 *
	 * @return OrderItem
	 */
	public function setDelivered(bool $delivered = null)
	{
		$this->delivered = $delivered;
		
		return $this;
	}
	
	/**
	 * @param \DateTime|null $orderDate
	 *
	 * @return OrderItem
	 */
	public function setDeliveryDate($deliveryDate = null)
	{
		$this->delivery_date = $deliveryDate;

		return $this;
	}

	/**
	 * Get delivery_date.
	 *
	 * @return \DateTime|null
	 */
	public function getDeliveryDate()
	{
		return $this->delivery_date;
	}
}
<?php

namespace Customize\Form\Extension\Admin;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;

use Eccube\Form\Type\Admin\OrderItemType;

use Symfony\Component\Form\Extension\Core\Type;

class OrderItemTypeExtension extends AbstractTypeExtension
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
		$builder->add("delivered",Type\ChoiceType::class,[
			'expanded' => false,
			'multiple' => false,
			'required' => false,
			'choices' => ['未発送'=>'0', '発送済み'=>'1'],
		]);
		
		$builder->add('delivery_date',Type\DateTimeType::class, [
                'widget' => 'single_text',
				'required' => false,
            ]);
    }

	/**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return OrderItemType::class;
    }
	
	/**
     * {@inheritdoc}
     */
    public static function getExtendedTypes(): iterable
    {
        yield OrderItemType::class;
    }
}
{# 省略 #}

{# このループ内に追加 #}
{% for orderItemForm in form.OrderItems %}

	{# 省略 #}
	
	{# 表示し、セレクト #}
	{{ form_widget(orderItemForm.delivered) }}
	{# 非表示で値の保持 #}
	{{ form_widget(orderItemForm.delivery_date, { 'type': 'hidden' }) }}
	
	{# 省略 #}

{% endfor %}

{# 省略 #}