Labo

[EC-CUBE 2.12.1] カート情報に任意のテキストを加えたい

2012年07月15日 / 投稿者名:fukap


開発コミュニティに「カートセッションに入れる方法がわからない」といった質問があったので、適当な返答をした手前、実際にやってみました。
商品詳細ページに、任意のテキストを入れるテキストボックスを作成し、とりあえずカートセッションに入れる方法です。

 

1.data/Smarty/templates/default/products/detail.tpl に以下のようなコードを挿入。
  挿入する場所は、フォームの開始タグから終了タグの間で適当に。私は、数量ブロックの下に挿入しました。

                <!--★任意のテキスト★-->
                <dl class="quantity">
                    <dt>任意のテキスト:</dt>
                    <dd><input type="text0" class="box300" name="text0" value="<!--{$arrForm.text0.value|default:"ご自由に記入ください"|h}-->" maxlength="<!--{$smarty.const.INT_LEN}-->" style="<!--{$arrErr.text0|sfGetErrorColor}-->" />
                        <!--{if $arrErr.text0 != ""}-->
                            <br /><span class="attention"><!--{$arrErr.text0}--></span>
                        <!--{/if}-->
                    </dd>
                </dl>

2.data/class/pages/products/LC_Page_Products_Detail.php の lfInitParam() を以下のように修正して、任意のテキストを受け取るようにする。
  MTEXT_LEN で、MAX_LENGTH_CHECK を入れているので、初期値だと200文字までです。

    /* パラメーター情報の初期化 */
    function lfInitParam(&$objFormParam) {
        $objFormParam->addParam('規格1', 'classcategory_id1', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('規格2', 'classcategory_id2', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('管理者ログイン', 'admin', INT_LEN, 'a', array('ALNUM_CHECK','MAX_LENGTH_CHECK'));
        $objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('EXIST_CHECK', 'ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('お気に入り商品ID', 'favorite_product_id', INT_LEN, 'n', array('ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('商品規格ID', 'product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('任意のテキスト', 'text0', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
        // 値の取得
        $objFormParam->setParam($_REQUEST);
        // 入力値の変換
        $objFormParam->convParam();
        // 入力情報を渡す
        return $objFormParam->getFormParamList();
    }

3.data/class/pages/products/LC_Page_Products_Detail.php の action() で、158行目付近の以下の部分を修正。

$objCartSess->addProduct($product_class_id, $this->objFormParam->getValue('quantity'), $this->objFormParam->getValue('text0'));

4.data/class/pages/cart/LC_Page_Cart.php の lfInitParam() を以下のように修正して、任意のテキストを受け取るようにする。

    /**
     * ユーザ入力値の処理
     *
     * @return object
     */
    function lfInitParam($arrRequest) {
        $objFormParam = new SC_FormParam_Ex();
        $objFormParam->addParam('カートキー', 'cartKey', INT_LEN, 'n', array('NUM_CHECK','MAX_LENGTH_CHECK'));
        $objFormParam->addParam('カートナンバー', 'cart_no', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('任意のテキスト', 'text0', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
        // PC版での値引き継ぎ用
        $objFormParam->addParam('カテゴリID', 'category_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        // スマートフォン版での数量変更用
        $objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        // 値の取得
        $objFormParam->setParam($arrRequest);
        // 入力値の変換
        $objFormParam->convParam();
        return $objFormParam;
    }

5.data/class/SC_CartSession.php の addProduct() を以下のように修正して、カートセッションに格納する。

    // カートへの商品追加
    function addProduct($product_class_id, $quantity, $text0) {
        $objProduct = new SC_Product_Ex();
        $arrProduct = $objProduct->getProductsClass($product_class_id);
        $productTypeId = $arrProduct['product_type_id'];
        $find = false;
        $max = $this->getMax($productTypeId);
        for ($i = 0; $i <= $max; $i++) {

            if ($this->cartSession[$productTypeId][$i]['id'] == $product_class_id) {
                $val = $this->cartSession[$productTypeId][$i]['quantity'] + $quantity;
                if (strlen($val) <= INT_LEN) {
                    $this->cartSession[$productTypeId][$i]['quantity'] += $quantity;
                }
                $find = true;
            }
        }
        if (!$find) {
            $this->cartSession[$productTypeId][$max+1]['id'] = $product_class_id;
            $this->cartSession[$productTypeId][$max+1]['quantity'] = $quantity;
            $this->cartSession[$productTypeId][$max+1]['cart_no'] = $this->getNextCartID($productTypeId);
            $this->cartSession[$productTypeId][$max+1]['text0'] = $text0;
        }
    }

6.data/class/pages/cart/LC_Page_Cart.php の action() 内に以下のコードを記述し、カートセッションを吐いてみる。
  記述場所は、カートセッションのインスタンス生成以降に。

echo '<pre>';
var_dump($objCartSess);
echo '</pre>';

7.「カゴの中を見る」(現在のカゴの中)ページをブラウザで表示し、任意のテキストが格納されているのを確認。

object(SC_CartSession_Ex)#14 (2) {
  ["key_tmp"]=>
  NULL
  ["cartSession"]=>
  &array(1) {
    [1]=>
    array(1) {
      [1]=>
      array(4) {
        ["id"]=>
        string(2) "10"
        ["quantity"]=>
        string(1) "1"
        ["cart_no"]=>
        int(1)
        ["text0"]=>
        string(30) "ご自由に記入ください"
      }
    }
  }
}

という感じで、カートセッションにざっくり格納完了です。
カートセッションに入れた値は、さらに注文情報テーブル(dtb_order)や注文詳細情報テーブル(dtb_order_detail)に格納し、
注文メールや管理側の注文情報、MYページなどに出力することが多いのかなと思います。

[EC-CUBE 2.12.1] カート情報に任意のテキストを加えたい への16件のコメント

  1. aoyagi より:

    記述通りにやってみたのですが、
    6の結果がtext0だけ NULL となってしまいます。
    quantity等の値は正しく出力されています。

  2. fukap より:

    どこか抜けているところはありませんか?
    例えばaddProduct関数にtext0は引き渡されていますか?
    またaddProduct関数でtext0は受け取っていますか?

  3. 肉うどん より:

    2.11.1でもこの方法を試みたいのですが、
    できますでしょうか?

  4. fukap より:

    上記のコードでできるかわかりませんが、
    カート情報に任意のテキストを加えるのは、どのバージョンでもできると思います。

  5. 肉うどん より:

    Ec-cube 2.11.1で試してみて、
    エラーがでた場合、お教えいただいてもよろしいでしょうか?

  6. 川口嘉則 より:

    こんにちは、データベース(MySQL)に関する記載がないのですが、このままだとうまく行かないのではありませんか、もしお願いできるのなら教えていただけませんか>

  7. fukap より:

    商品詳細に設置したテキストボックスなどの値をカートセッションに格納するにはどうすれば良いかを試みたコードですので、データベースへの値のインサートまでは行っていません。カートセッション格納の参考にしていただけたらと思います。

  8. megane より:

    echo ”;
    var_dump($objCartSess);
    echo ”;
    どこに記述するのかわかりません、教えてください。

  9. fukap より:

    data/class/pages/cart/LC_Page_Cart.php の action() 内 の最後の方に書いてみてはどうでしょうか?

  10. megane より:

    >data/class/pages/cart/LC_Page_Cart.php の action() 内 の最後の方に書いてみてはどうでしょうか?

    やってみます、ありがとうございます。

  11. megane より:

    >「カゴの中を見る」(現在のカゴの中)ページをブラウザで表示し、任意のテキストが格納されているのを確認。

    6.
    まで終わったのですが、どのように確認するのか?
    >object(SC_CartSession_Ex)#14 (2) {
    以下はどこで確認できますか?

  12. yumyum より:

    2.12系で商品詳細にテキスト入力を追加する方法が分からず大変困っていました。
    非常に参考になりました。ありがとうございます。
    データベースに入れるのは私には難しくて諦めたのですが、order_mail.tplで表示出来ればこちら側でも入力内容を確認できると思い試みたのですが、うまくいきません。
    だと表示されませんでした。表示する方法をご教示いただけると助かります。
    よろしくお願いします。

  13. yumyum より:

    すみません、最後2行の冒頭、「<!–{$item.text0}–>だと表示されませんでした」です。

  14. fukap より:

    ご質問、ありがとうございます。

    受注メールは、受注情報テーブルや受注配送先テーブルなどに格納されたデータを取り出し、
    テンプレートに渡していたように記憶しています。
    まずはphpMyAdminなどのデータベース管理ツールを使って、
    新規で作成したカラムに、目的のデータが挿入されているか確認してみてはどうでしょうか。

    本カスタマイズは応用範囲が大変広く、無償サポートにも限界がありますので、
    これ以上のサポートについては、有償対応とさせてください。

  15. ekda より:

    2.11.4で試したところ、うまくいきました。
    どころでこのロジックの場合、同じ商品を別々にカートに入れた場合は、先にカートに入れた追加項目がセッションに残るのでしょうか。

  16. fukap より:

    ちょっと試していませんが、
    たぶんこのロジックだと、最初にカートに入れた商品の追加項目しか
    セッションに残らないのではないかと思います。
    実サイトで使用するにはいくつか問題があると思いますので、
    あくまでセッションに任意のオプション情報を入れる際の参考コードということで、
    よろしくお願いします。

コメントを残す

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

* Copy This Password *

* Type Or Paste Password Here *

*

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