EC-CUBE:期間を限定して商品を販売する

下記書籍をもとに書いています。詳しくは本をお読みください。

1 データベース、dtb_productsテーブルに販売終了日と販売開始日のカラムを追加する。
——————————————-
フィールド:endsell_date
種別:datetime
NULL:チェックする(デフォルト値をNULLにしておかないと未登録の際、買い物かごが表示されなくなる)

フィールド:arrival_date
種別:datetime
NULL:チェックする(デフォルト値をNULLにしておかないと未登録の際、買い物かごが表示されなくなる)
——————————————-

2 カートセッションの管理のためのクラス変更
■data/class/SC_CartSession.phpに追加する場合は、function checkProductsメソッド内の最後に追加。

 /*
 * 販売開始、販売終了チェック
 */
 if($item['productsClass']["arrival"] == "0") {
 $tpl_message .= "※「" . $product['name'] . "」は販売開始前のため購入はできません。\n";
 } else if($item['productsClass']["endsell"] == "0") {
 $tpl_message .= "※「" . $product['name'] . "」は販売終了のため購入はできません。\n";
 }

3 商品関連処理のためのクラス変更
■data/class/SC_Product.phpに追加する場合

 function listsメソッド内に追加

 ,endsell_date
 ,arrival_date
 ,(SELECT CASE WHEN coalesce(endsell_date, NOW()) = NOW() THEN 1 WHEN endsell_date >= NOW() THEN 1 ELSE 0 END) AS endsell, (SELECT CASE WHEN coalesce(arrival_date,NOW()) = NOW() THEN 1 WHEN NOW() >= arrival_date THEN 1 ELSE 0 END) AS arrival

 function alldtlSQLメソッド内に追加

 ,dtb_products.endsell_date
 ,dtb_products.arrival_date
 ,(SELECT CASE WHEN coalesce(dtb_products.endsell_date, NOW()) = NOW() THEN 1 WHEN dtb_products.endsell_date >= NOW() THEN 1 ELSE 0 END) AS endsell
 ,(SELECT CASE WHEN coalesce(dtb_products.arrival_date,NOW()) = NOW() THEN 1 WHEN NOW() >= dtb_products.arrival_date THEN 1 ELSE 0 END) AS arrival

4 「販売終了日」と「販売開始日」を登録できるようにする

(1)管理画面の商品登録に「販売終了日」と「販売開始日」項目を追加
■data/class/pages/admin/products/LC_Page_Admin_Products_Product.phpに追加する場合

 function actionメソッド内に追加

 $objDate = new SC_Date_Ex();

 同じくfunction actionメソッド内に追加

 $this->arrYear = $objDate->getYear();
 $this->arrMonth = $objDate->getMonth();
 $this->arrDay = $objDate->getDay();

 function lfInitFormParamメソッド内に追加

 $objFormParam->addParam("販売終了年", "endsell_year", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
 $objFormParam->addParam("販売終了月", "endsell_month", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
 $objFormParam->addParam("販売終了日", "endsell_day", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
 $objFormParam->addParam("販売開始年", "arrival_year", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
 $objFormParam->addParam("販売開始月", "arrival_month", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
 $objFormParam->addParam("販売開始日", "arrival_day", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));

 function lfCheckError_Editメソッド内に追加

 $objErr->doFunc(array("販売開始日","販売終了日", "arrival_year", "arrival_month", "arrival_day", "endsell_year", "endsell_month", "endsell_day"), array("CHECK_SET_TERM"));

  function lfGetProductData_FromDBメソッド内に追加

 // 販売終了日
 if(isset($arrProduct[0]['endsell_date'])){
 $arrProduct[0]['endsell_year'] = substr($arrProduct[0]['endsell_date'], 0,4);
 $arrProduct[0]['endsell_month'] = substr($arrProduct[0]['endsell_date'], 5,2);
 $arrProduct[0]['endsell_day'] = substr($arrProduct[0]['endsell_date'], 8,2);
 }
 // 販売開始日
 if(isset($arrProduct[0]['arrival_date'])){
 $arrProduct[0]['arrival_year'] = substr($arrProduct[0]['arrival_date'], 0,4);
 $arrProduct[0]['arrival_month'] = substr($arrProduct[0]['arrival_date'], 5,2);
 $arrProduct[0]['arrival_day'] = substr($arrProduct[0]['arrival_date'], 8,2);
 }

 function lfRegistProductメソッド内に追加

 "endsell_date", "arrival_date",

 同じくfunction lfRegistProductメソッド内に追加

 if(!SC_Utils_Ex::isBlank($arrList['endsell_year'])) {
 $sqlval['endsell_date'] = $arrList['endsell_year'] . '/'
 . $arrList['endsell_month'] . '/'
 . $arrList['endsell_day']
 . ' 23:59:59';
 }else{
 $sqlval['endsell_date'] = "";
 }
 if(!SC_Utils_Ex::isBlank($arrList['arrival_year'])) {
 $sqlval['arrival_date'] = $arrList['arrival_year'] . '/'
 . $arrList['arrival_month'] . '/'
 . $arrList['arrival_day']
 . ' 00:00:00';
 }else{
 $sqlval['arrival_date'] = "";
 }

(2)下記テンプレートファイルを編集
 ■data/Smarty/templates/admin/products/product.tpl
 ■data/Smarty/templates/admin/products/confirm.tpl

5 「販売終了日」と「販売開始日」をフロントページで表示する

(1)下記商品一覧ページを編集
 PC ■data/Smarty/templates/default/products/list.tpl
 携帯 ■data/Smarty/templates/mobile/products/list.tpl
 スマートフォン ■data/Smarty/templates/sphone/products/list.tpl

(2)下記商品詳細ページを編集
 PC ■data/Smarty/templates/default/products/detail.tpl
 携帯 ■data/Smarty/templates/mobile/products/detail.tpl
 スマートフォン ■data/Smarty/templates/sphone/products/detail.tpl

【補足】


<!--{if $arrProduct.arrival == 1 && $arrProduct.endsell == 1}--><!--▼販売期間中なら「買い物かご」を表示する-->

●買い物かご●

<!--{elseif $arrProduct.arrival != 1}--><!--▼販売期間前なら-->

<div class="alignC attentionSt">販売開始までもうしばらくお待ちください。</div>

<!--{elseif $arrProduct.endsell != 1}--><!--▼販売終了後なら-->

<div class="alignC attentionSt">販売期間は終了いたしました。</div>

<!--{/if}-->