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

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

