投稿者 |
スレッド |
h_tanaka |
投稿日時: 2017/6/5 11:47
対応状況: −−−
|
神   登録日: 2016/7/22 居住地: 愛媛県 投稿: 1423 |
商品登録ページの拡張フォームで 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 居住地: 愛媛県 投稿: 1423 |
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 居住地: 愛媛県 投稿: 1423 |
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 居住地: 愛媛県 投稿: 1423 |
Re: 商品登録ページの拡張フォームで product_id を取得したい すみません、前のページから読み込み直したらうまくいきました! ---------------- EC-CUBE 《プラチナ》ランクパートナー トエビス株式会社 田中 宏典 EC-CUBEの機能やデザインのカスタマイズ承ります。
|
|
|
h_tanaka |
投稿日時: 2017/6/5 15:30
対応状況: 解決済
|
神   登録日: 2016/7/22 居住地: 愛媛県 投稿: 1423 |
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の機能やデザインのカスタマイズ承ります。
|
|
|