[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ページなどに出力することが多いのかなと思います。