Labo

EC-CUBE3 分室

【3.0.15】ご注文完了画面で商品情報を取得する方法

2018年03月24日 / 投稿者名:chiharu


今回は知り合いからの相談内容についてです。
知り合いから以下の内容について相談を受けました。
 「ご注文完了画面で商品情報が取れないが何とかならないだろうか」
詳しく話を聞いてみると「google アナリティクス eコマース」での設定をしたいとのことでした。
 
返答としては「今後に仕様変更が発生することを考えると有料でもプラグイン対応をしたほうが良いのでは」と伝えました。
プラグインであれば Google側の仕様変更などについてもアップデートで対応してくれることが多いですから便利です。
今後を考えるとイニシャルコストを支払う方が良いと考えています。
知り合いもその内容には納得してくれました。
 
まぁ、知り合いを冒険させる訳には行かないためプラグインを進めましたが内容的には興味がある部分です。
実際に今までのカスタマイズでも「注文完了時に商品情報が取れればいいのになぁ」と思うことは度々ありました。
せっかくなので今回の記事の題材として見たいと思います。
 
 
■ご注文完了画面で商品情報を取得する方法
 
 ●ファイル
  <インストールフォルダ>/src/Eccube/Controller/ShoppingController.php
 ●ファンクション
  complete
 ●参考行目
  308行目ぐらいから
  ※
   既存のカスタマイズ内容は顧慮してません。
   該当ファイルは初期の状態からカスタマイズをしています。
 ●変更内容

    /**
     * 購入完了画面表示
     */
    public function complete(Application $app, Request $request)
    {
        // 受注IDを取得
        $orderId = $app['session']->get($this->sessionOrderKey);

        $event = new EventArgs(
            array(
                'orderId' => $orderId,
            ),
            $request
        );
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE, $event);

        if ($event->getResponse() !== null) {
            return $event->getResponse();
        }

        // 受注に関連するセッションを削除
        $app['session']->remove($this->sessionOrderKey);
        $app['session']->remove($this->sessionMultipleKey);
        // 非会員用セッション情報を空の配列で上書きする(プラグイン互換性保持のために削除はしない)
        $app['session']->set($this->sessionKey, array());
        $app['session']->set($this->sessionCustomerAddressKey, array());

        log_info('購入処理完了', array($orderId));

        return $app->render('Shopping/complete.twig', array(
            'orderId' => $orderId,
        ));
    }

 ↓

    /**
     * 購入完了画面表示
     */
    public function complete(Application $app, Request $request)
    {
        // 受注IDを取得
        $orderId = $app['session']->get($this->sessionOrderKey);

        // 受注データの取得
        $orderData= $app['eccube.repository.order']->find($orderId);

        $event = new EventArgs(
            array(
                'orderId' => $orderId,
            ),
            $request
        );
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE, $event);

        if ($event->getResponse() !== null) {
            return $event->getResponse();
        }

        // 受注に関連するセッションを削除
        $app['session']->remove($this->sessionOrderKey);
        $app['session']->remove($this->sessionMultipleKey);
        // 非会員用セッション情報を空の配列で上書きする(プラグイン互換性保持のために削除はしない)
        $app['session']->set($this->sessionKey, array());
        $app['session']->set($this->sessionCustomerAddressKey, array());

        log_info('購入処理完了', array($orderId));

        return $app->render('Shopping/complete.twig', array(
            'orderId' => $orderId,
            'orderData' => $orderData,
        ));
    }

 ●概要説明
  該当部分を見ると確かに購入商品の情報を取得している様子はありませんね。
  まぁ、受注処理時にセッション情報を削除しているので当たり前と云えば当たり前ですね。
  下手に情報を残しておくとリロード対策なども手間が増えてますからね。
 
  今回はセッション情報が使用できないため受注情報からデータを取得するようにしています。

        // 受注データの取得
        $orderData = $app['eccube.repository.order']->find($orderId);

  この部分ですね。
  $orderId にて受注情報をすべて取得します。
  今回必要なのは商品情報だけですが「大は小を兼ねる」の精神で行きたいと思います(笑)
 
  また、出力情報としての受注情報をtwigに引き渡す設定を行います。

        return $app->render('Shopping/complete.twig', array(
            'orderId' => $orderId,
            'orderData' => $orderData,
        ));

  この部分で引き渡しています。
  ここに追加した「orderData」と云う変数名にて受注情報を使用することができます。
  「$event->getResponse()」の処理の場合も何か動きはあるのかしれませんが、今回はtwigを対象とするので確認していません(笑)
 
  出力するためのテンプレートには以下の内容で情報の確認をしています。
  <対象のtwigファイルの保存フォルダ>/template/default/Shopping/complete.twig

{% block main %}

{% for odDetail in orderData.OrderDetails %}
{{ dump(odDetail) }}
{% endfor %}

 
 
  とりあえず今回は {% block main %} のすぐ下に対象となる受注商品データをダンプで表示しています。
  「orderData」は受注データ全体なので今回は「OrderDetails」(受注商品詳細)だけを取得する必要があります。
  通常であれば「{{ dump(orderData.OrderDetails) }}」で情報を表示できそうですが、商品情報を個別に取得する必要があります。
  loop文にて{{ dump(odDetail) }}の形にすれば商品の詳細情報をdumpすることができます。
 
  使用方法は色々あるかと思うのでテンプレート表示内容は各自で検討してください(笑)
  ちなみに上記の形で変更して頂いた場合は以下の記述で項目内容を取得できると思います。
 
   商品名   : {{ odDetail.productName }}
   商品コード : {{ odDetail.productCode }}
   単価    : {{ odDetail.price }}
   数量    : {{ odDetail.quantity }}
 
  ここで少し注意が必要な項目として商品名や商品コードは dump 出力した変数名をそのまま指定しても表示されません。
  注意しましょう。
 
 
ということで今回は終わりにしたいと思います。
有難うございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

* Copy This Password *

* Type Or Paste Password Here *

*

コメント欄にコードを挿入したい場合は、[php][/php] を使ってください。