「EC-CUBEカスタマイズ!注文情報に項目追加する」では、EC-CUBE2.13をカスタマイズして注文情報に項目を追加する方法を説明します。
EC-CUBEで商品を購入した際に登録される注文情報(dtb_order)にラッピングの有無という項目を追加してみましょう
DBに項目を追加する
注文情報は dtb_order テーブルに入りますので、このテーブルに項目を追加します。
あと、dtb_order_temp にも同じ項目を追加します。
というのも、まず dtb_order_temp にデータが書き込まれ、最終的に購入完了まで行くと
dtb_order_temp の内容が、dtb_order にコピーされるようになっているからです。
dtb_order、dtb_order_temp 両方のテーブルに同じ項目名を同じ型で追加します。
この例では wrapping という項目を追加します。
dtb_order テーブルにはよく見ると、 memo01~10 の項目があります。
普段使用していてもここにデータが入っているところは見かけないので予備項目だな memo01~10はクレジットカード決済などのモジュールやプラグインで使用されます。 独自項目の保存先として使ってしまうと、モジュールやプラグインを導入した際に不具合が起こってしまうので独自項目の保存先はカラムを追加しましょう |
クラスの修正
修正は、LC_Page_Shopping_Payment_Ex.php に行います。
パラメータに項目追加
LC_Page_Shopping_Payment.php から setFormParams メソッドをコピーしてきて項目を追加します
$objFormParam->setParam($arrShipping); よりも前に以下を追加します。
$objFormParam->addParam(‘ラッピング有無’, ‘wrapping’, STEXT_LEN, ‘KVa’, array(‘SPTAB_CHECK’, ‘MAX_LENGTH_CHECK’));
public function lfInitParam(&$objFormParam, $deliv_only, &$arrShipping) { $objFormParam->addParam('配送業者', 'deliv_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK')); $objFormParam->addParam('ポイント', 'use_point', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK', 'ZERO_START')); $objFormParam->addParam('その他お問い合わせ', 'message', LTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK')); $objFormParam->addParam('ポイントを使用する', 'point_check', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '2'); if ($deliv_only) { $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK')); } else { $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK')); foreach ($arrShipping as $val) { $objFormParam->addParam('お届け時間', 'deliv_time_id' . $val['shipping_id'], INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK')); $objFormParam->addParam('お届け日', 'deliv_date' . $val['shipping_id'], STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK')); } } // ラッピング有無を追加 $objFormParam->addParam('ラッピング有無', 'wrapping', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK')); $objFormParam->setParam($arrShipping); $objFormParam->convParam(); }
ここで追加する項目の第2引数はDBに追加したカラム名と同じにしておきます。
同じにしないと、DBへのインサート処理の部分もカスタマイズが必要になってきますので、同じにしておきましょう
また、このパラメータに追加しないと同じくDBインサートへの処理の部分にカスタマイズが必要になってきます。
登録データの設定
画面で設定する場合
shopping/payment.tpl にフォーム項目として追加してください、
この時、input タグの name はDBに追加したカラム名と同じにしておきます。
クラスで設定する場合
LC_Page_Shopping_Payment_Ex.php に追加します。
LC_Page_Shopping_Payment.php から action メソッドをコピーしてきます、
case ‘confirm の パラメーター情報の初期化 処理の後に
$objFormParam->setValue(“wrapping”, “ラッピングする”);
などのようにしてパラメータにセットしてあげます。
// 登録処理 case 'confirm': // パラメーター情報の初期化 $this->setFormParams($objFormParam, $_POST, $this->is_download, $this->arrShipping); $this->arrErr = $this->lfCheckError($objFormParam, $this->arrPrices['subtotal'], $this->tpl_user_point); // ラッピング有無 $objFormParam->setValue("wrapping", "ラッピングする"); $deliv_id = $objFormParam->getValue('deliv_id'); if (strval($deliv_id) !== strval(intval($deliv_id))) { $deliv_id = $this->arrDeliv[0]['deliv_id']; $objFormParam->setValue('deliv_id', $deliv_id); } $arrSelectedDeliv = $this->getSelectedDeliv($objCartSess, $deliv_id); $this->arrPayment = $arrSelectedDeliv['arrPayment']; $this->arrDelivTime = $arrSelectedDeliv['arrDelivTime']; $this->img_show = $arrSelectedDeliv['img_show']; if (empty($this->arrErr)) { $this->saveShippings($objFormParam, $this->arrDelivTime); $this->lfRegistData($this->tpl_uniqid, $objFormParam->getDbArray(), $objPurchase, $this->arrPayment); // 正常に登録されたことを記録しておく $objSiteSess->setRegistFlag(); // 確認ページへ移動 SC_Response_Ex::sendRedirect(SHOPPING_CONFIRM_URLPATH); SC_Response_Ex::actionExit(); } break;
DBに書き込まれない場合
上記のようにやったのにDBに書き込まれない場合、以下を確認してみてください
・dtb_orderテーブル、dtb_order_tempテーブルの両方に同じ名前でカラムが追加されていますか?
・追加したDBテーブルカラム名の前後にスペースが入っていませんか?
(テキストからコピーしてカラム名にセットした時にスペースが入っていると、別のカラムと判断されてしまいます。
使用しているDBによるのかもしれませんが、postgreSQLでは別と判断されるみたいです。
ええ、私はやってしまいました。)
・DBに追加したカラム名、クラスで追加したパラメータ項目名(addParamの第2引数)、画面のinputタグのname属性名が全ておなじになっていますか?
まとめ
いかがでしたか、独自項目の追加はハードルが高いと思われがちですが、DBカラム名、フォーム名、パラメータ名を合わせることで元々の機能を活かすことで、ちょっとしたカスタマイズで項目を追加することが出来ます。
コメントを残す