バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

 > プラグイン > プラグイン側のフォーム項目追加について

プラグイン

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ikemoto
投稿日時: 2016/6/6 6:26
対応状況: −−−
一人前
登録日: 2015/10/2
居住地:
投稿: 79
プラグイン側のフォーム項目追加について
お世話になっております。
現在プラグインにて、商品登録画面に項目を追加しています。

onAdminProductEditInitialize のイベントにて
$b = $event->getArgument('builder');
$b->add('test_product','text',array('mapped'=>false));

とし、この内容を画面に表示しています。

入力された内容を
onAdminProductEditComplete のイベントにて

$p = $event->getArgument('Product');
$pe = $p->getProductExt();
$pe->setTestProduct($form['test_product']->getdata());

$app['orm.em']->persist($pe);
$app['orm.em']->flush();

…とすることでプラグイン側で追加した
ProductExtエンティティにセットして登録することが出来ました。

その後、関連商品プラグインを導入したところ、
そちら側の登録処理の部分で行っている
$form->isValid() (→app/Plugin/RelatedProduct/Event.phpの91行目)
でエラーが発生し、その原因がこちらで追加した項目の箇所です。

エラー内容が
フィールドグループに追加のフィールドを含んではなりません。
"{{ extra_fields }}" => "test_product"
…となっています。

このエラーを回避するにはどう対応すれば上手く行くでしょうか??
DELIGHT
投稿日時: 2016/6/6 10:15
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: プラグイン側のフォーム項目追加について
Event.phpの81行目
$builder = $app['form.factory']->createBuilder('admin_product');

にてフォームを初期化し、そのまま90行目の
if ($form->isValid()) {

でバリデーションを行なっています。

このフォームにはtest_productフィールドは存在しませんが、送信されたデータの中にtest_productが存在するため今回のエラーが発生しています。

https://github.com/EC-CUBE/ec-cube/blob/3.0.10/src/Eccube/Controller/Admin/Product/ProductController.php#L264

この辺りを参考にして、関連商品プラグイン側でもadmin.product.edit.initializeイベントを発生させてフォームにtest_productを追加するのがいいと思います。



以下余談、3.0.9のプラグイン機構の変更は後方互換性はありますが、3.0.9未満[も]対応するプラグインと3.0.9以降専用プラグインの共存は難しいものになっていますね…。


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

ikemoto
投稿日時: 2016/8/5 20:27
対応状況: −−−
一人前
登録日: 2015/10/2
居住地:
投稿: 79
allow_extra_fields のオプション付与の方法
ご回答いただいていたのに長い間お礼も申し上げずにすみませんでした。
しばらくEC-CUBEの作業をする余裕が全くなかったのでここを除くことも、ろくにできていませんでした。

また作業に着手できるようになりましたので、この問題を何とかしようといろいろやってみたのですが…。

おっしゃるとおり、
こちらが追加したデータがリクエストのパラメーターに入っているが、
関連商品プラグイン側では既存のパラメータ+自分のプラグイン側で追加したデータについてバリデートをしているため、
こちらのプラグインから追加したデータは異物と認識(そりゃそうですよね…)

というわけで、これが理由で
関連商品プラグイン側のEvent.php registerRelatedProduct内

$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
 …

の箇所にて引っかかってしまうわけで…

今のところ
 $form->handleRequest($request); の箇所をコメントアウトして、その代わりに
リクエストパラメータとフォームパラメータをarray_intersect_keyにて両方にパラメータがある分だけに絞り込み。
これでこちらが追加した分のパラメータがひとまず消滅するのでextra fieldについての問題は解消。
ただ、そうすると一緒にトークンまでなくなってしまうので後付けでリクエストパラメータから拾って追加。
それをフォームにバインドし、あとの$form->isValid()に流す…

という力技で乗り切りましたが、できれば自分のプラグインならともかく、
ほかの人の作った方のプラグインに手は入れたくなかった…バージョンアップの時にそこの箇所手作業で直さにゃいかんし…。

その他に考えたのが、フォームビルダでallow_extra_fieldsオプションを設定して
extra fieldを許容してしまうという方法ですが、これって何処で指定すればよいのでしょうか…
サンプルを見てもこれって何処で設定できるの??でしたので。

もしご存じの方がいらしたらご教授ください。
ただ、セキュリティ的には良くないと思うので使うかどうかは悩みどころではあるのですが。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は88,946名です
総投稿数は110,018件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
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.