バージョン選択

フォーラム

メニュー

オンライン状況

50 人のユーザが現在オンラインです。 (43 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 49
tattsu もっと...

サイト内検索

プラグイン > 開発について > 拡張した ShippingType でエンティティを取得したい

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2018/5/22 9:35
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
拡張した ShippingType でエンティティを取得したい
EC-CUBE3.0.16

管理画面の受注登録ページにおいて、お届け先フォームを拡張したいと思っています。

標準の OrderType を拡張して、AdminOrderTypeExtension を作成したときは、次のように $options['data'] で Order エンティティを取得できました。
AdminOrderTypeExtension.php
class AdminOrderTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $Order = $options['data'];
    }

    public function getExtendedType()
    {
        return 'order';
    }
}


同様に、標準の ShippingType を拡張して、AdminShippingTypeExtension を作成したときに、Shipping エンティティを取得するにはどうすればよいでしょうか?
AdminShippingTypeExtension.php
class AdminShippingTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $Shipping = $options['data'];    // ★ 取得できない
    }

    public function getExtendedType()
    {
        return 'shipping';
    }
}


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

minori
投稿日時: 2018/5/23 14:32
対応状況: −−−
常連
登録日: 2017/10/12
居住地:
投稿: 40
Re: 拡張した ShippingType でエンティティを取得したい
イベントリスナーを使えばできると思います。
$event->getData()でShippingエンティティが取得できるはずです。

$builder
    ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        // Shippingエンティティを取得
        $Shipping = $event->getData();
    });
h_tanaka
投稿日時: 2018/5/24 16:04
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 拡張した ShippingType でエンティティを取得したい
minori 様
ありがとうございます。

ただ、ご提案どおりに実装しましたが、とれてくる $Shipping が null になってしまうようです。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

umebius
投稿日時: 2018/5/24 17:12
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 拡張した ShippingType でエンティティを取得したい
h_tanaka 様の拡張の目的がイベントリスナーのタイミングで実現できるものなのかどうか分からないのですが
フォームで送信されたデータをShippingエンティティとして取得するのであれば下記のようにすればできるかと思います。

$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
                    // Shippingエンティティを取得
                    $Shipping = $event->getData();

                });


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

umebius
投稿日時: 2018/5/24 17:21
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 拡張した ShippingType でエンティティを取得したい
一方、送信前データなら下のような形でしょうか。
目的に合っているか分かりませんし、検証もしておりませんがご容赦ください。

 
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
                    // Shippingエンティティを取得
                    $form = $event->getForm();
                    $Shipping = $form->getData();

                })


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

h_tanaka
投稿日時: 2018/5/24 17:47
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 拡張した ShippingType でエンティティを取得したい
umebius 様
ありがとうございます。

お届け先のFormを拡張して国情報と電話番号情報を追加したいと思っています。
なので、SUBMITのタイミングではないんです。。

イベントリスナー考慮前のソースを記載いたします。

class AdminShippingTypeExtension extends AbstractTypeExtension
{
    public $app;

    public function __construct(\Silex\Application $app)
    {
        $this->app = $app;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $app = $this->app;
        $Shipping = $options['data'];    // ★ 取得できない

        $country_id = 392; // 日本
        $telCustom = null;
        if (!is_null($Shipping)) {
            $Country = $Shipping->getCountry();
            if ($Country) {
                $country_id = $Country->getId();
            }

            $plgShipping = $app['eccube.plugin.custom.repository.shipping']->findOneBy(array('Shipping' => $Shipping));
            if (!is_null($plgShipping)) {
                $telCustom = $plgShipping->getTelCustom();
            }
        }

        $builder
            ->add('country', 'eccube_country', array(
                'required' => false,
                'data' => $app['orm.em']->getReference("Eccube\Entity\Master\Country", $country_id),
            ))
            ->add('zip', 'zip', array(
                'required' => false,
            ))
            ->add('tel', 'tel', array(
                'required' => false,
            ))
            ->add(
                $builder->create('tel_custom', 'text', array(
                        'label' => '電話番号',
                        'required' => true,
                        'mapped' => false,
                        'constraints' => array(
                            new Assert\Regex(array(
                                'pattern' => "/^[\+\d-() ]+$/u",
                            )),
                        ),
                        'data' => $telCustom,
                    ))
                    ->addEventSubscriber(new \Eccube\EventListener\ConvertKanaListener())
            );
    }

    public function getExtendedType()
    {
        return 'shipping';
    }
}


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

umebius
投稿日時: 2018/5/25 7:58
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 拡張した ShippingType でエンティティを取得したい
h_tanaka 様

目的によって使用するイベントは異なりますが、PRE_SET_DATA、POST_SET_DATA、PRE_SUBMITあたりでフォームを追加するのは常套手段かと思います。

EC-CUBE既存のコードの引用になりますが、下記のようにすれば追加できるのではないでしょうか。


$builder
            ->addEventListener(FormEvents::PRE_SET_DATA, function ($event) use ($app) {
                /** @var \Eccube\Entity\Shipping $data */
                $data = $event->getData();
                /** @var \Symfony\Component\Form\Form $form */
                $form = $event->getForm();

                // お届け日を取得
                $deliveryDates = $app['eccube.service.shopping']->getFormDeliveryDates($data->getOrder());

                // 配送業者
                // 商品種別に紐づく配送業者を取得
                $delives = $app['eccube.service.shopping']->getDeliveriesOrder($data->getOrder());

                $deliveries = array();
                foreach ($delives as $Delivery) {
                    foreach ($data->getShipmentItems() as $item) {
                        $productType = $item->getProductClass()->getProductType();
                        if ($Delivery->getProductType()->getId() == $productType->getId()) {
                            $deliveries[] = $Delivery;
                        }
                    }
                }

                $deliveryTimes = null;
                $delivery = $data->getDelivery();
                if ($delivery) {
                    $deliveryTimes = $delivery->getDeliveryTimes();
                }

                $form
                    ->add('delivery', 'entity', array(
                        'class' => 'Eccube\Entity\Delivery',
                        'property' => 'name',
                        'choices' => $deliveries,
                        'data' => $delivery,
                        'constraints' => array(
                            new Assert\NotBlank(),
                        ),
                    ))
                    ->add('shippingDeliveryDate', 'choice', array(
                        'choices' => $deliveryDates,
                        'required' => false,
                        'empty_value' => '指定なし',
                        'mapped' => false,
                    ))
                    ->add('deliveryTime', 'entity', array(
                        'class' => 'Eccube\Entity\DeliveryTime',
                        'property' => 'deliveryTime',
                        'choices' => $deliveryTimes,
                        'required' => false,
                        'empty_value' => '指定なし',
                        'empty_data' => null,
                    ));
            })






->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
                /** @var \Eccube\Entity\Shipping $data */
                $data = $event->getData();
                /** @var \Symfony\Component\Form\Form $form */
                $form = $event->getForm();

                if (is_null($data)) {
                    return;
                }

                $quantity = 0;
                $Order = $data->getOrder();
                $shippings = $Order->getShippings();
                if (count($shippings) > 1) {
                    // お届け先を複数に分割していた場合、登録されている個数を設定
                    foreach ($data->getShipmentItems() as $ShipmentItem) {
                        $quantity += $ShipmentItem->getQuantity();
                    }
                }

                $form['quantity']->setData($quantity);

            })


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

h_tanaka
投稿日時: 2018/5/25 12:08
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 拡張した ShippingType でエンティティを取得したい
umebius 様ご提示のコードでは、
$data = $event->getData();

にて$Shippingが取得できているようですが、同様の方法で取得できなかったんです。


class AdminShippingTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
               $form = $event->getForm();
                $Shipping = $event->getData();
dump($Shipping);    // ★ null になっている
            });
    }

    public function getExtendedType()
    {
        return 'shipping';
    }
}


うーん、なぜでしょう。。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

minori
投稿日時: 2018/5/28 18:33
対応状況: −−−
常連
登録日: 2017/10/12
居住地:
投稿: 40
Re: 拡張した ShippingType でエンティティを取得したい
PRE_SET_DATAのタイミングで取得出来るデータは
フォーム生成時に初期値として渡されたデータです。

コントローラーでは
$app['form.factory']->createBuilder('order', $TargetOrder)
でフォームを生成していますので、
$TargetOrderにShippingのデータを持っていれば
取得できると思うのですが・・・。

ShippingTypeのExtensionを実装したことがありますが、
PRE_SET_DATAのタイミングでShippingエンティティの情報が取得できました。

受注編集の場合でも、イベントリスナーで
Shippingエンティティを取得できないのでしょうか?
h_tanaka
投稿日時: 2018/5/29 11:34
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 拡張した ShippingType でエンティティを取得したい
minori 様

コントローラーで dump してみたところ、Shipping エンティティが出力されました。

$ss = $TargetOrder->getShippings();
foreach ($ss as $s1) {
    dump($s1);
}

        $builder = $app['form.factory']
            ->createBuilder('order', $TargetOrder);


しかし、前のコメントのように、ShippingType を拡張したクラスで PRE_SET_DATA のタイミングでエンティティを取得しようとしても変数がnullになっているようなんです。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,286名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.