バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
hata
投稿日時: 2017/6/9 15:21
対応状況: −−−
長老
登録日: 2015/8/3
居住地: 宮城県(2017/09末引退)
投稿: 156
Re: プラグインで呼び出し元の後続処理を中断させたい
カート画面の頭にピンクの帯で出るアレですか?
あればテンプレート側に仕込みが必要なので、template/default/Cart/index.twig
の以下から必要なところをパクってtemplate/default/Product/detail.twig
のイイところに突っ込んでやればいいと思います。
                {% set productStr = app.session.flashbag.get('eccube.front.request.product') %}
                {% for error in app.session.flashbag.get('eccube.front.request.error')  %}
                    {% set idx = loop.index0 %}
                    {% if productStr[idx] is defined %}
                    <div id="cart_box__message--{{ loop.index }}" class="message">
                        <p class="errormsg bg-danger">
                            <svg class="cb cb-warning"><use xlink:href="#cb-warning" /></svg>
                            {{ error|trans({'%product%':productStr[idx]})|nl2br }}
                        </p>
                    </div>
                    {% else %}
                    <div id="cart_box__message--{{ loop.index }}" class="message">
                        <p class="errormsg bg-danger">
                            <svg class="cb cb-warning"><use xlink:href="#cb-warning" /></svg>{{ error|trans|nl2br }}
                        </p>
                    </div>
                    {% endif %}
                {% endfor %}
h_tanaka
投稿日時: 2017/6/9 15:34
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1638
Re: プラグインで呼び出し元の後続処理を中断させたい
hataさん
ありがとうございます!

処理の方見ながら悩んでましたが、twig側に表示領域がないだけだったんですね。

次の実装でうまくいきました!

event.yml
# 商品詳細
Product/detail.twig:
    - [onRenderProductDetail, NORMAL]


Event.php
    /**
     * 商品詳細ページにエラーメッセージを表示する.
     *
     * @param TemplateEvent $event
     */
    public function onRenderProductDetail(TemplateEvent $event)
    {
        $app = $this->app;
        $source = $event->getSource();

        $search = '<!-- ▼item_detail▼ -->';
        $replace = '{% for error in app.session.flashbag.get("eccube.front.request.error")  %}
                        <div id="cart_box__message--{{ loop.index }}" class="message">
                            <p class="errormsg bg-danger">
                                <svg class="cb cb-warning"><use xlink:href="#cb-warning" /></svg>{{ error|trans|nl2br }}
                            </p>
                        </div>
                    {% endfor %}'.$search;
        $source = str_replace($search, $replace, $source);

        $event->setSource($source);
    }


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

hata
投稿日時: 2017/6/9 15:46
対応状況: −−−
長老
登録日: 2015/8/3
居住地: 宮城県(2017/09末引退)
投稿: 156
Re: プラグインで呼び出し元の後続処理を中断させたい
さっきみたらaddRequestError()の処理はこんなでした。
src/Eccube/Application/ApplicationTrait.php
    public function addRequestError($message, $namespace = 'front')
    {
        $this['session']->getFlashBag()->set('eccube.' . $namespace . '.request.error', $message);
    }
twig側に表示部分があるのは知っていましたが、メッセージの登録の仕組みがこんな風になってるから
(twig側でapp.session.flashbag.getのパラメータに使っている文字列をキーにメッセージ登録)
取り出せるんですねー。へー。
おかげさまで勉強になりました。
h_tanaka
投稿日時: 2017/6/9 15:50
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1638
Re: プラグインで呼び出し元の後続処理を中断させたい
いえいえ、こちらこそ”へー”です。笑


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

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

カート追加処理前に mode を強制的に変更し、カート追加処理をさせない以下の実装のやり方、EC-CUBE 3.0.11 以降では有効ですが、3.0.10 以前では無効でした。

Event.php

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


原因は、
src/Eccube/Controller/ProductController.php
における条件分岐で、3.0.10 以前では add_cart を判定していないためです。

src/Eccube/Controller/ProductController.php 3.0.11〜

                if ($addCartData['mode'] === 'add_favorite') {
                } elseif ($addCartData['mode'] === 'add_cart') {
                }


src/Eccube/Controller/ProductController.php 〜3.0.10

                if ($addCartData['mode'] === 'add_favorite') {
                } else {
                }


これはどうしようもないので、プラグインの対応バージョンを 3.0.11 以降とすることにします。


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

hata
投稿日時: 2017/6/16 11:05
対応状況: −−−
長老
登録日: 2015/8/3
居住地: 宮城県(2017/09末引退)
投稿: 156
Re: プラグインで呼び出し元の後続処理を中断させたい
そうでしたか。
初期表示のときのルートはどこを通っているでしょうか?
フックポイントでそれと同じ条件に変更できるならスルーできるかも知れませんがどうでしょうか。
無理強いはしません。
h_tanaka
投稿日時: 2017/6/16 11:21
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1638
Re: プラグインで呼び出し元の後続処理を中断させたい
なるほど!

フックポイントの後、条件分岐だけを抜粋すると次のような感じでした。

src/Eccube/Controller/ProductController.php
        if ($request->getMethod() === 'POST') {
            if ($form->isValid()) {
                if ($addCartData['mode'] === 'add_favorite') {
                } else {
                }
            }
        } else {
        }


そこで、プラグインのイベント処理において、
$request->request->set('mode', null);   // カート追加処理中断

の代わりに、
$request->setMethod('GET');   // カート追加処理中断

をすることで 3.0.10 でもカート追加処理を中断させることができました。
リクエストメソッドを変更するのは恐る恐るでしたが、Symfony ではメソッドによらずリクエストオブジェクトが共通化されているためかいまのところ問題なく動作しています。


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

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


 



ログイン


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

統計情報

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

投稿数ランキング

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