バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

プラグイン > 開発について > プラグインで呼び出し元の後続処理を中断させたい

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2017/6/9 11:17
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
プラグインで呼び出し元の後続処理を中断させたい
EC-CUBE 3.0.14

プラグインのイベント処理後に、呼び出し元の後続の処理を中断させることは可能でしょうか?

商品をカートに入れるタイミングで、プラグイン内でカートに入れることができるかどうかを判定し、カートに入れることができない商品の場合は、後続のカートへの追加処理を中断させたいと思っています。

src/Eccube/Controller/ProductController.php
において、カートへの追加処理は273行目にあるので、プラグインの処理を実行するイベントのタイミングは、その前の231行目にしようと思っています。
EccubeEvents::FRONT_PRODUCT_DETAIL_INITIALIZE

以下、プラグインでの実装です。
event.yml
# カート追加
front.product.detail.initialize:
    - [onFrontProductDetailInitialize, NORMAL]


Event.php

    public function onFrontProductDetailInitialize(EventArgs $event)
    {
         ...    

        if ($request->getMethod() === 'POST') {
            $form = $builder->getForm();
            $form->handleRequest($request);
            if ($form->isValid()) {
                $addCartData = $form->getData();
                if ($addCartData['mode'] === 'add_cart') {
                    $BaseInfo = $app['eccube.repository.base_info']->get();
                    if ($BaseInfo->getOptionMultipleShipping() != Constant::ENABLED) {
                        if (!$this->canAddProduct($Product->getId())) {  // 判定処理
                            ...  // ここでエラーを発生させたい
                        }
                    }
                }
            }
        }
    }


エラーを発生させた場合は、呼び出し元でcatchされないためにそのままシステムエラーとなりました。

                        if (!$this->canAddProduct($Product->getId())) {
                            throw new CartException('cart.product.type.kind');
                        }


エラー発生の代わりに次のように実装しましたが、後続の処理は実行されてしまいました。

                        if (!$this->canAddProduct($Product->getId())) {
                            $app->addRequestError('cart.product.type.kind');
                            $app->redirect($app->url('cart'));
                            return;
                        }


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

468
投稿日時: 2017/6/9 13:13
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: プラグインで呼び出し元の後続処理を中断させたい
returnではなく、exitで処理を終了させた場合は、
リダイレクトされませんか?
試していないので、どうなるかわかりませんが・・・。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

hata
投稿日時: 2017/6/9 13:32
対応状況: −−−
長老
登録日: 2015/8/3
居住地: 宮城県(2017/09末引退)
投稿: 156
Re: プラグインで呼び出し元の後続処理を中断させたい
requestのモードをadd_favoriteとadd_cart以外にしてしまうことができればスルーできないでしょうか...
add_cart_failedとか。

#中断させられなかった場合の提案です#
h_tanaka
投稿日時: 2017/6/9 13:34
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: プラグインで呼び出し元の後続処理を中断させたい
468さん
phpの処理自体が終了してしまうので、真っ白のページが表示されますね。。


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

h_tanaka
投稿日時: 2017/6/9 13:39
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: プラグインで呼び出し元の後続処理を中断させたい
hataさん

いいアイデアだと思ったのですが、次のようにしてみたらエラーになりました。


AlreadySubmittedException in Form.php line 314:
You cannot change the data of a submitted form.


                        if (!$this->canAddProduct($Product->getId())) {
                            $addCartData['mode'] = null;
                            $form->setData($addCartData);
                            return;
                        }


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

h_tanaka
投稿日時: 2017/6/9 13:43
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: プラグインで呼び出し元の後続処理を中断させたい
次でも同じエラーになりました。

                        if (!$this->canAddProduct($Product->getId())) {
                            $app->redirect($app->url('cart'));
                            $form->get('mode')->setData(null);
                            return;
                        }


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

h_tanaka
投稿日時: 2017/6/9 14:03
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: プラグインで呼び出し元の後続処理を中断させたい
form送信前なら mode を変更できるかと思い、
app/Plugin/Test/Form/Extension/AddCartTypeExtension.php
を作成し、次のように実装したところ、エラーにはなりませんでしたが、mode を変更することはできませんでした。

class AddCartTypeExtension 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::PRE_SUBMIT, function (FormEvent $event) use ($app) {

            $form = $event->getForm();

            $form->get('mode')->setData('hoge');    // 変更されない

            $form['mode']->setData('hoge');    // 変更されない

            $addCartData = $form->getData();
            $addCartData['mode'] = null;
            $form->setData($addCartData);    // 変更されない
            
            var_dump($form->get('mode')->getData());
        });
    }

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


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

hata
投稿日時: 2017/6/9 14:13
対応状況: −−−
長老
登録日: 2015/8/3
居住地: 宮城県(2017/09末引退)
投稿: 156
Re: プラグインで呼び出し元の後続処理を中断させたい
onFrontProductDetailInitializeのスキップさせたいケースでrequestの中のmodeを変えてみてください。
$request = $event->getRequest();
$request->request->set('mode', 'add_cart_failed');
h_tanaka
投稿日時: 2017/6/9 14:20
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: プラグインで呼び出し元の後続処理を中断させたい
hataさん
最初のコードで判定処理の部分をご指定のコードに変えたらいけました!
ありがとうございます!

Event.php

                        if (!$this->canAddProduct($Product->getId())) {
                            $request->request->set('mode', null);
                            return;
                        }


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

h_tanaka
投稿日時: 2017/6/9 15:12
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: プラグインで呼び出し元の後続処理を中断させたい
あとはカートページでは
                            $app->addRequestError('cart.product.type.kind');

とすればエラーメッセージが出てたのですが、商品詳細ページで同じようにエラーメッセージを表示する方法がわからないです。
それがわかればばっちりなんですが。。


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

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


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
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.