開発コミュニティに「カートセッションに入れる方法がわからない」といった質問があったので、適当な返答をした手前、実際にやってみました。
商品詳細ページに、任意のテキストを入れるテキストボックスを作成し、とりあえずカートセッションに入れる方法です。
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ページなどに出力することが多いのかなと思います。
記述通りにやってみたのですが、
6の結果がtext0だけ NULL となってしまいます。
quantity等の値は正しく出力されています。
どこか抜けているところはありませんか?
例えばaddProduct関数にtext0は引き渡されていますか?
またaddProduct関数でtext0は受け取っていますか?
2.11.1でもこの方法を試みたいのですが、
できますでしょうか?
上記のコードでできるかわかりませんが、
カート情報に任意のテキストを加えるのは、どのバージョンでもできると思います。
Ec-cube 2.11.1で試してみて、
エラーがでた場合、お教えいただいてもよろしいでしょうか?
こんにちは、データベース(MySQL)に関する記載がないのですが、このままだとうまく行かないのではありませんか、もしお願いできるのなら教えていただけませんか>
商品詳細に設置したテキストボックスなどの値をカートセッションに格納するにはどうすれば良いかを試みたコードですので、データベースへの値のインサートまでは行っていません。カートセッション格納の参考にしていただけたらと思います。
echo ”;
var_dump($objCartSess);
echo ”;
どこに記述するのかわかりません、教えてください。
data/class/pages/cart/LC_Page_Cart.php の action() 内 の最後の方に書いてみてはどうでしょうか?
>data/class/pages/cart/LC_Page_Cart.php の action() 内 の最後の方に書いてみてはどうでしょうか?
やってみます、ありがとうございます。
>「カゴの中を見る」(現在のカゴの中)ページをブラウザで表示し、任意のテキストが格納されているのを確認。
6.
まで終わったのですが、どのように確認するのか?
>object(SC_CartSession_Ex)#14 (2) {
以下はどこで確認できますか?
2.12系で商品詳細にテキスト入力を追加する方法が分からず大変困っていました。
非常に参考になりました。ありがとうございます。
データベースに入れるのは私には難しくて諦めたのですが、order_mail.tplで表示出来ればこちら側でも入力内容を確認できると思い試みたのですが、うまくいきません。
だと表示されませんでした。表示する方法をご教示いただけると助かります。
よろしくお願いします。
すみません、最後2行の冒頭、「<!–{$item.text0}–>だと表示されませんでした」です。
ご質問、ありがとうございます。
受注メールは、受注情報テーブルや受注配送先テーブルなどに格納されたデータを取り出し、
テンプレートに渡していたように記憶しています。
まずはphpMyAdminなどのデータベース管理ツールを使って、
新規で作成したカラムに、目的のデータが挿入されているか確認してみてはどうでしょうか。
本カスタマイズは応用範囲が大変広く、無償サポートにも限界がありますので、
これ以上のサポートについては、有償対応とさせてください。
2.11.4で試したところ、うまくいきました。
どころでこのロジックの場合、同じ商品を別々にカートに入れた場合は、先にカートに入れた追加項目がセッションに残るのでしょうか。
ちょっと試していませんが、
たぶんこのロジックだと、最初にカートに入れた商品の追加項目しか
セッションに残らないのではないかと思います。
実サイトで使用するにはいくつか問題があると思いますので、
あくまでセッションに任意のオプション情報を入れる際の参考コードということで、
よろしくお願いします。