バージョン選択

フォーラム

メニュー

オンライン状況

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

PR

デザインテンプレート EC-CUBE3.0版が登場!
広告掲載について

サイト内検索

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

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
hata
投稿日時: 2017/6/9 15:21
対応状況: −−−
一人前
登録日: 2015/8/3
居住地: 宮城県
投稿: 141
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
居住地: 愛媛県
投稿: 306
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の機能やデザインのカスタマイズ承ります。

hata
投稿日時: 2017/6/9 15:46
対応状況: −−−
一人前
登録日: 2015/8/3
居住地: 宮城県
投稿: 141
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
居住地: 愛媛県
投稿: 306
Re: プラグインで呼び出し元の後続処理を中断させたい
いえいえ、こちらこそ”へー”です。笑


----------------
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

h_tanaka
投稿日時: 2017/6/16 9:45
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 306
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の機能やデザインのカスタマイズ承ります。

hata
投稿日時: 2017/6/16 11:05
対応状況: −−−
一人前
登録日: 2015/8/3
居住地: 宮城県
投稿: 141
Re: プラグインで呼び出し元の後続処理を中断させたい
そうでしたか。
初期表示のときのルートはどこを通っているでしょうか?
フックポイントでそれと同じ条件に変更できるならスルーできるかも知れませんがどうでしょうか。
無理強いはしません。
h_tanaka
投稿日時: 2017/6/16 11:21
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 306
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の機能やデザインのカスタマイズ承ります。

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

 



ログイン


EC-CUBEペイメント

クレジットカード情報の非保持化対応

統計情報

総メンバー数は19,766名です
総投稿数は82,463件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1632
4
yuh
1389
5
red
1064
6
fukap
907
7
shutta
827
8 ramrun 789
9
tsuji
784
10
umebius
712
11
tao_s
651
12 sumida 638
13
homan
633
14
468
630
15 karin 609
16 DELIGHT 571
17
patapata
502
18
flealog
483
19 tonton 436
20
ecbg
387


ネットショップの壺

EC-CUBEガイドブック
Copyright© LOCKON CO.,LTD. All Rights Reserved.