バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

プラグイン > 開発について > 商品登録ページの拡張フォームで product_id を取得したい

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2017/6/5 11:47
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
商品登録ページの拡張フォームで product_id を取得したい
EC-CUBE 3.0.14

管理画面の商品登録ページで、拡張フォームの作成時に product_id を取得するにはどうすればよいでしょうか?

いまのところ次のように実装していますが、
MissingOptionsException in OptionsResolver.php line 779:
The required option "data" is missing.
というエラーになってしまいます。

class ProductTypeExtension extends AbstractTypeExtension
{
    public $app;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $app = $this->app;
        if (!$app->isGranted('ROLE_ADMIN')) {
            return;
        }

        $product_id = $options['data']->getId();
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setRequired('data');
    }

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


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

nyorai
投稿日時: 2017/6/5 14:20
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 商品登録ページの拡張フォームで product_id を取得したい
FormEventで取得するのが良いかなと思います。


       ...

        $app = $this->app;

        if (!$app->isGranted('ROLE_ADMIN')) {
            return;
        }

        // use Symfony\Component\Form\FormEvent;
        // use Symfony\Component\Form\FormEvents;
        $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($app) {
            
                $Product = $event->getData();

                // 新規登録時は空のエンティティのためidは取得できない
                if ($Product->getId()) {
                    return;
                }

                $product_id = $Product->getId();
                
                ...
            }
        );



Formのイベントのタイミングはいくつかありますが、ここではPOST_SET_DATAを使っています。

実行されるタイミングは以下のフォームを生成している箇所ですね。ここでセットされたProductエンティティが、$event->getData()で取得できます。
https://github.com/EC-CUBE/ec-cube/blob/3.0.14/src/Eccube/Controller/Admin/Product/ProductController.php#L263
h_tanaka
投稿日時: 2017/6/5 14:39
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
Re: 商品登録ページの拡張フォームで product_id を取得したい
nyoraiさん、
ご回答ありがとうございます。

そして説明不足ですみません。
取得した product_id を用いてフォームを作成しようとしています。
この場合はどのようにすればよろしいでしょうか?


        $product_id = $options['data']->getId();
        $TestProduct = $app['eccube.plugin.test.repository.test_product']->findOneBy(array('product_id' => $product_id));

        $builder->add('plg_test_id', 'choice', array(
            'mapped' => false,
            'required' => true,
            'choices' => array('__unselected' => '選択してください') + $seTests,
            'data' => $TestProduct->getId(),
            'constraints' => array(
                new Assert\NotBlank(),
                new Assert\NotEqualTo(array(
                    'value' => '__unselected',
                    'message' => 'form.type.select.notselect'
                )),
            ),
        ))


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

nyorai
投稿日時: 2017/6/5 14:58
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 商品登録ページの拡張フォームで product_id を取得したい
イベントの中で追加すればよいですよ。


       ...

        $app = $this->app;

        if (!$app->isGranted('ROLE_ADMIN')) {
            return;
        }

        // use Symfony\Component\Form\FormEvent;
        // use Symfony\Component\Form\FormEvents;
        $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($app) {
            
                $Product = $event->getData();

                // 新規登録時は空のエンティティのためidは取得できない
                if ($Product->getId()) {
                    return;
                }

                $product_id = $Product->getId();
                
                $form = $event->getForm();
		$form->add('plg_test_id'...
                ...
            }
        );


$event->getForm()でFormを取得して、builderと同じようにaddすればよいです。



h_tanaka
投稿日時: 2017/6/5 15:09
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
Re: 商品登録ページの拡張フォームで product_id を取得したい
nyoraiさん
そんな方法があったんですね!

ただ、$event->getData() で $Product が取得できないようです。。
どこか間違っていますでしょうか?

ちなみに、商品新規登録時ではなく商品編集時です。

FatalErrorException in ProductTypeExtension.php line 32:
Error: Call to a member function getId() on null


    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $app = $this->app;
        if (!$app->isGranted('ROLE_ADMIN')) {
            return;
        }

        $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($app) {
            $Product = $event->getData();
            $product_id = $Product->getId();
            if (!$product_id) {
                return;
            }
            
            …
        });
    }


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

h_tanaka
投稿日時: 2017/6/5 15:25
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
Re: 商品登録ページの拡張フォームで product_id を取得したい
すみません、前のページから読み込み直したらうまくいきました!


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

h_tanaka
投稿日時: 2017/6/5 15:30
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
Re: 商品登録ページの拡張フォームで product_id を取得したい
最終的に次のようなコードになりました。


class ProductTypeExtension extends AbstractTypeExtension
{
    public $app;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $app = $this->app;
        if (!$app->isGranted('ROLE_ADMIN')) {
            return;
        }

        $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($app) {
            $Product = $event->getData();
            if (!$Product) {
                return;
            }
            $product_id = $Product->getId();
            if (!$product_id) {
                return;
            }

            $default = null;
            $TestProduct = $app['eccube.plugin.test.repository.test_product']->findOneBy(array('product_id' => $product_id));
            if ($TestProduct) {
                $default = $TestProduct->getId();
            }

            $Tests = $app['eccube.repository.xxxxx']->findBy(array(), array('rank' => 'DESC'));
            if (empty($Tests) || !is_array($Tests)) {
                return;
            }
            $selTests = array();
            foreach ($Tests as $Test) {
                $selTests[$Test->getId()] = $Test;
            }

            $form = $event->getForm();

            $form->add('plg_test_id', 'choice', array(
                'mapped' => false,
                'required' => true,
                'choices' => array('__unselected' => '選択してください') + $seTests,
                'data' => $TestProduct->getId(),
                'constraints' => array(
                    new Assert\NotBlank(),
                    new Assert\NotEqualTo(array(
                        'value' => '__unselected',
                        'message' => 'form.type.select.notselect'
                    )),
                ),
            ))
        });
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
    }

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


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

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


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1295
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
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.