タグ: カスタマイズ

【EC-CUBE】ギフト・熨斗対応オプション追加のカスタマイズ

概要

  • ギフト包装の種類は、管理画面>基本情報管理>マスタデータ管理で変更可能にする。
  • ギフト包装が有料の場合にも対応する。ただし、有料ギフト包装の金額はポイント対象外。
  • ギフト包装の金額は、管理画面>基本情報管理>マスタデータ管理で変可能にする。
  • MYページの購入履歴画面や注文完了メール内に、選択したギフト包装の種類と金額を載せる。
  • ロジックの変更はあるが、それは全部継承で対応する方針で親のクラスには手を入れない。

データベースの変更と追加

DBは、mtb_*がマスタ系のデータとなっており、mtb_*の名称のものは、管理画面>システム設定>マスタデータ管理で変更できるが、mtb_pref、mtb_zip、mtb_constants はマスタ管理からはずされている。(それについての記載は、LC_Page_Admin_Basis_Masterdata.php::getMasterDataNames() にある。)

ギフト包装の種類のマスタテーブルを作る

DBへmtb_giftテーブルを追加し、
id smallint(6)  NOT NULL  default値:0
name text
rank smallint(6)  NOT NULL  default値:0
のフィールドを作り、プライマリーキーをidにする

下記SQL文でも作成できる。

CREATE TABLE `mtb_gift` (
  `id` smallint(6) NOT NULL default ‘0’,
  `name` text,
  `rank` smallint(6) NOT NULL default ‘0’,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ギフト包装の税込金額を定数で設定する

DBのmtb_constantsテーブル最後尾にフィールドを1行追加し、
GIFT_PRICE 200 523 ギフト包装の税込価格
というように、値をセットする。

上記の場合、
1つ目のidが定数名。
2つ目のnameに入れるのが定数の値。今回の場合はギフト包装の税込金額を200円とした。
3番目のrankに入れるのが管理画面での表示順。今入っているレコードの最大+1だと一番下に表示される。
4番目のremarkに入れるのが管理画面でパラメータ入力欄の上に灰色で小さく出るパラメータの説明文

下記SQL文でも作成できる。

INSERT INTO `mtb_constants` values(‘GIFT_PRICE’, ‘200’, ‘523’, ‘ギフト包装の税込価格’);

次に、管理画面>システム設定>パラメータ設定へアクセスし、値は変えなくていいので、そのまま一度「この内容で登録する」ボタンをクリックする。

これによって、マスタテーブルから値を読み出して定数設定を行うPHPファイルにDBで変更した値がセットされ、DBの内容をキャッシュしているファイルが更新される。(=/data/cache/mtb_*.php)

ギフト包装の種類を入力。

先に作成したmtb_giftに管理画面からギフト包装の種類を登録していく。

管理画面>システム設定>マスタデータ管理で、先ほど作成したmtb_giftを選択し、ギフト包装の種類を順番に登録。(ID=0はギフトなしとして使うので、登録せず、1から登録すること。)

受注データ内に、ギフト情報をどのように格納するかを考える。

受注テーブル(dtb_order)や、一時的な受注テーブル(dtb_order_temp)で、text型のmemo1~memo10という汎用項目として使える列があり、memo1~4あたりは既に使ってるらしいので、memo09とmemo10を使ってギフト情報を格納する。(作業は後に)

memo09・・・ギフト包装の種類。0はギフト包装なし。
memo10・・・受注したときのギフト包装の価格。

ここまでで、ギフト包装の価格の変更も管理画面でのパラメータ設定でできるようになった。

お支払方法・お届け時間等の指定画面

購入フローのお支払方法・お届け時間等の指定画面でギフト選択のリストが表示されるようにする。

PCサイトのテンプレートの修正

/data/Smarty/templates/default/shopping/payment.tpl

に以下のコードを追加。(ver.2.3.2の場合L89あたりがよい。表示させたい位置でOK。)

<div class=”payarea02″>
<h3><img src=”<!–{$TPL_DIR}–>img/shopping/subtitle04.gif” width=”670″ height=”33″ alt=”ギフト包装と熨斗の指定” /></h3>
<p>ギフト包装をご希望の方は、選択してください。</p>
<div>
<!–{assign var=key value=”memo09″}–>
<span class=”attention”><!–{$arrErr[$key]}–></span>
<select name=”<!–{$key}–>” style=”<!–{$arrErr[$key]|sfGetErrorColor}–>”>
<option value=”0″ selected=”selected”>ギフトなし</option>
<!–{html_options options=$arrGift selected=$arrForm[$key].value}–>
</select>
</div>
</div>

ギフト包装と熨斗の指定用のタイトル画像も作ること。

モバイルサイトのテンプレートの修正

data/Smarty/templates/default/mobile/shopping/deliv_date.tpl

に以下のコードを追加。(ver.2.3.2の場合L41あたりがよい。表示させたい位置でOK。)

■ギフト包装と熨斗の指定<br />
<!–{assign var=key value=”memo09″}–>
<!–{if $arrErr[$key] != “”}–>
<font color=”red”><!–{$arrErr[$key]}–></font>
<!–{/if}–>
<select name=”<!–{$key}–>”>
<option value=”0″>ギフトなし</option>
<!–{html_options options=$arrGift selected=$arrForm[$key].value}–>
</select>

ショッピング用ページクラスの拡張

/data/class_extends/page_extends/shopping/LC_Page_Shopping_Payment_Ex.php

init()、lfInitParam()、lfSetOrderTempData()のコードを追加する。

L47(ver.2.3.2の場合)
    function init() {
        parent::init();
のあたりから、

    function init() {
        parent::init();
        $this->tpl_title = “お支払方法・お届け時間・ギフト包装の指定”;
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrGift = $masterData->getMasterData( “mtb_gift”,
                                array( “id”, “name”, “rank” ) );
    }

    function lfInitParam() {
        parent::lfInitParam();
        $this->objFormParam->addParam( “ギフト・のし”, “memo09”, INT_LEN, “n”, array( “MAX_LENGTH_CHECK”, “NUM_CHECK”) );
       
    }

    //一時受注テーブルからの情報を格納する
    function lfSetOrderTempData($uniqid) {

        $objQuery = new SC_Query();
        $col = “payment_id, use_point, deliv_time_id, message, point_check, deliv_date, memo09”;
        $from = “dtb_order_temp”;
        $where = “order_temp_id = ?”;
        $arrRet = $objQuery->select($col, $from, $where, array($uniqid));
        // DB値の取得
        $this->objFormParam->setParam($arrRet[0]);
        return $this->objFormParam;
    }

とコードを追加。

ご入力内容の確認画面

注文内容の欄に、前の画面で選択したギフト包装の種類と価格を含めるようにし、ギフトなしの場合はこの行自体を表示させないようにする。

PCサイトのテンプレートの修正

/data/Smarty/templates/default/shopping/confirm.tpl

L103あたりから(手数料の下へ:表示させたい場所へ入れてOK)(ver.2.3.2の場合)

<!–{if $arrData.memo09 gt 0}–>
        <tr>
          <th colspan=”4″ class=”resulttd”>ギフト包装 : <!–{$arrGift[$arrData.memo09]}–></th>
          <td class=”pricetd”><!–{$smarty.const.GIFT_PRICE|number_format}–>円</td>
        </tr>
<!–{/if}–>

モバイルサイトのテンプレートの修正

/data/Smarty/templates/default/mobile/shopping/confirm.tpl

L49あたりから(配送先の下へ:表示させたい場所へ入れてOK)(ver.2.3.2の場合)

<!–{if $arrData.memo09 gt 0}–>
■ギフト包装(<!–{$arrGift[$arrData.memo09]}–>):<!–{$smarty.const.GIFT_PRICE|number_format}–><br><!–{/if}–>

<br>

L84あたりにもフォーム用のコードを1行追加。

<input type=”hidden” name=”memo09″ value=”<!–{$arrData.memo09}–>”>

ページクラスの拡張

/data/class_extends/page_extends/admin/order/LC_Page_Shopping_Confirm_Ex.php

init()以下へコードを追加。L48あたりから。

    function init() {
        parent::init();
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrGift = $masterData->getMasterData( “mtb_gift”,
                                array( “id”, “name”, “rank” ) );
    }

会計ロジックの拡張

/data/class_extends/helper_extends/SC_Helper_DB_Ex.php

L36からの
class SC_Helper_DB_Ex extends SC_Helper_DB {
(この間にコードを追加)

    /**
     * 集計情報を元に最終計算を行う.
     *
     * @param array $arrData 各種情報
     * @param LC_Page $objPage LC_Page インスタンス
     * @param SC_CartSession $objCartSess SC_CartSession インスタンス
     * @param array $arrInfo 店舗情報の配列
     * @param SC_Customer $objCustomer SC_Customer インスタンス
     * @return array 最終計算後の配列
     */
    function sfTotalConfirm($arrData, &$objPage, &$objCartSess, $arrInfo, $objCustomer = “”) {
        $arrData = parent::sfTotalConfirm($arrData, &$objPage, &$objCartSess, $arrInfo, $objCustomer = “”);
       
        // ギフト包装の計算。0はギフト包装なしのこと。
        if ( intval( $arrData[“memo09”] ) > 0 ) {
            $arrData[‘payment_total’] += GIFT_PRICE;
            $arrData[‘memo10’] = GIFT_PRICE;
        } else {
            $arrData[‘memo10’] = 0;
        }
       
        return $arrData;
    }

購入履歴画面

PCサイトのテンプレートの修正

/data/Smarty/templates/default/mypage/history.tpl

L88あたり(手数料の下あたり:表示させたい場所へ入れてOK)(ver.2.3.2の場合)

<!–{if $arrDisp.memo09 != “” && $arrDisp.memo09 gt 0}–>
      <tr>
        <th colspan=”4″ class=”resulttd”>ギフト包装 : <!–{$arrGift[$arrDisp.memo09]}–></th>
        <td class=”pricetd”><!–{$arrDisp.memo10|escape|number_format}–>円</td>
      </tr>
<!–{/if}–>

モバイルサイトのテンプレートの修正

/data/Smarty/templates/default/mobile/mypage/history_detail.tpl

L55あたり(ご注文内容の下あたり:表示させたい場所へ入れてOK)(ver.2.3.2の場合)

<!–{if $arrDisp.memo09 != “” && $arrDisp.memo09 gt 0}–>
【ギフト包装】(<!–{$arrGift[$arrDisp.memo09]}–>):<!–{$arrDisp.memo10|escape|number_format}–>円<br>
<!–{/if}–>
<br>

ページクラスの拡張

PCページ用のクラス

/data/class_extends/page_extends/mypage/LC_Page_Mypage_History_Ex.php

init()、lfGetOrderData()コードの追加。

L46あたりから。(ver.2.3.2の場合)

    function init() {
        parent::init();
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrGift = $masterData->getMasterData( “mtb_gift”,
                                array( “id”, “name”, “rank” ) );
    }

    //受注詳細データの取得
    function lfGetOrderData($order_id) {
        //受注番号が数字であれば
        if(SC_Utils_Ex::sfIsInt($order_id)) {
            // DBから受注情報を読み込む
            $objQuery = new SC_Query();
            $col = “order_id, create_date, payment_id, subtotal, tax, use_point, add_point, discount, “;
            $col .= “deliv_fee, charge, payment_total, deliv_name01, deliv_name02, deliv_kana01, deliv_kana02, “;
            $col .= “deliv_zip01, deliv_zip02, deliv_pref, deliv_addr01, deliv_addr02, deliv_tel01, deliv_tel02, deliv_tel03, deliv_time_id, deliv_date, memo09, memo10 “;
            $from = “dtb_order”;
            $where = “order_id = ?”;
            $arrRet = $objQuery->select($col, $from, $where, array($order_id));
            $arrOrder = $arrRet[0];
            // 受注詳細データの取得
            $arrRet = $this->lfGetOrderDetail($order_id);
            $arrOrderDetail = SC_Utils_Ex::sfSwapArray($arrRet);
            $arrData = array_merge($arrOrder, $arrOrderDetail);
        }
        return $arrData;
    }

モバイルサイト用にもおなじように拡張。

/data/class_extends/page_extends/mypage/LC_Page_Mypage_HistoryDetail_Ex.php

L50あたりから。 ※モバイル用のinitであることに注意。その上にPC用のinitがある!

    function mobileInit() {
        parent::mobileInit();
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrGift = $masterData->getMasterData( “mtb_gift”,
                                array( “id”, “name”, “rank” ) );
    }

    //受注詳細データの取得
    function lfGetOrderData($order_id) {
        //受注番号が数字であれば
        if(SC_Utils_Ex::sfIsInt($order_id)) {
            // DBから受注情報を読み込む
            $objQuery = new SC_Query();
            $col = “order_id, create_date, payment_id, subtotal, tax, use_point, add_point, discount, “;
            $col .= “deliv_fee, charge, payment_total, deliv_name01, deliv_name02, deliv_kana01, deliv_kana02, “;
            $col .= “deliv_zip01, deliv_zip02, deliv_pref, deliv_addr01, deliv_addr02, deliv_tel01, deliv_tel02, deliv_tel03, deliv_time_id, deliv_date, memo09, memo10 “;
            $from = “dtb_order”;
            $where = “order_id = ?”;
            $arrRet = $objQuery->select($col, $from, $where, array($order_id));
            $arrOrder = $arrRet[0];
            // 受注詳細データの取得
            $arrRet = $this->lfGetOrderDetail($order_id);
            $arrOrderDetail = SC_Utils_Ex::sfSwapArray($arrRet);
            $arrData = array_merge($arrOrder, $arrOrderDetail);
        }
        return $arrData;
    }

受注完了メール

受注完了メールにも選択したギフト包装の種類と価格を載せる。

———————————————————–

小 計 ¥ 3,021 (うち消費税 ¥144)

値引き ¥ 1,195

送 料 ¥ 1,000

手数料 ¥ 300

ギフト包装:包装+リボン ¥ 200

===============================================================

合 計 ¥ 3,703

===============================================================

PCサイト用受注完了メールテンプレートの修正

/data/Smarty/templates/default/mail_templates/order_mail.tpl

L70あたり。

ギフト包装:<!–{$arrOrder.gift_type}–> ¥ <!–{$arrOrder.gift_price|number_format|default:0}–>

モバイルサイト用受注完了メールテンプレートの修正

/data/Smarty/templates/default/mobile/mail_templates/order_mail.tpl

L54(一番最後)に。

ギフト包装:<!–{$arrOrder.gift_type}–> ¥ <!–{$arrOrder.gift_price|number_format|default:0}–>

受注完了メール送信ロジックの拡張

/data/class_extends/helper_extends/SC_Helper_Mail_EX.php

class SC_Helper_Mail_Ex extends SC_Helper_Mail {
(この間にコードを追加。)
}

SC_Helper_Mail.phpのCLASSからソースをコピーしてきてSC_Helper_Mail_EX.php内で編集している。

    function SC_Helper_Mail_Ex() {
        parent::SC_Helper_Mail();
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrGift = $masterData->getMasterData( “mtb_gift”,
                                array( “id”, “name”, “rank” ) );
    }

 

    /* 受注完了メール送信 */
    function sfSendOrderMail($order_id, $template_id, $subject = “”, $header = “”, $footer = “”, $send = true) {

        $objPage = new LC_Page();
        $objSiteInfo = new SC_SiteInfo();
        $arrInfo = $objSiteInfo->data;
        $objPage->arrInfo = $arrInfo;

        $objQuery = new SC_Query();

        if($subject == “” && $header == “” && $footer == “”) {
            // メールテンプレート情報の取得
            $where = “template_id = ?”;
            $arrRet = $objQuery->select(“subject, header, footer”, “dtb_mailtemplate”, $where, array(‘1’));
            $objPage->tpl_header = $arrRet[0][‘header’];
            $objPage->tpl_footer = $arrRet[0][‘footer’];
            $tmp_subject = $arrRet[0][‘subject’];
        } else {
            $objPage->tpl_header = $header;
            $objPage->tpl_footer = $footer;
            $tmp_subject = $subject;
        }

        // 受注情報の取得
        $where = “order_id = ?”;
        $arrRet = $objQuery->select(“*”, “dtb_order”, $where, array($order_id));
        $arrOrder = $arrRet[0];
        $arrOrderDetail = $objQuery->select(“*”, “dtb_order_detail”, $where, array($order_id));

        $objPage->Message_tmp = $arrOrder[‘message’];

        // 顧客情報の取得
        $customer_id = $arrOrder[‘customer_id’];
        $arrRet = $objQuery->select(“point”, “dtb_customer”, “customer_id = ?”, array($customer_id));
        $arrCustomer = isset($arrRet[0]) ? $arrRet[0] : “”;

        $objPage->arrCustomer = $arrCustomer;
        $objPage->arrOrder = $arrOrder;

        //その他決済情報
        if($arrOrder[‘memo02’] != “”) {
            $arrOther = unserialize($arrOrder[‘memo02’]);

            foreach($arrOther as $other_key => $other_val){
                if(SC_Utils_Ex::sfTrim($other_val[“value”]) == “”){
                    $arrOther[$other_key][“value”] = “”;
                }
            }

            $objPage->arrOther = $arrOther;
        }

        // 都道府県変換
        $objPage->arrOrder[‘deliv_pref’] = $this->arrPref[$objPage->arrOrder[‘deliv_pref’]];

        // ギフト包装変換
        $objPage->arrOrder[‘gift_type’] = $this->arrGift[$arrOrder[‘memo09’]];
        $objPage->arrOrder[‘gift_price’] = $arrOrder[‘memo10’];

        $objPage->arrOrderDetail = $arrOrderDetail;

        $objCustomer = new SC_Customer();
        $objPage->tpl_user_point = $objCustomer->getValue(‘point’);

        $objMailView = new SC_SiteView();
        // メール本文の取得
        $objMailView->assignobj($objPage);
        $body = $objMailView->fetch($this->arrMAILTPLPATH[$template_id]);

        // メール送信処理
        $objSendMail = new SC_SendMail_Ex();
        $bcc = $arrInfo[‘email01’];
        $from = $arrInfo[‘email03’];
        $error = $arrInfo[‘email04’];

        $tosubject = $this->sfMakeSubject($objQuery, $objMailView,
                                             $objPage, $tmp_subject);

        $objSendMail->setItem(”, $tosubject, $body, $from, $arrInfo[‘shop_name’], $from, $error, $error, $bcc);
        $objSendMail->setTo($arrOrder[“order_email”], $arrOrder[“order_name01″] . ” “. $arrOrder[“order_name02″] .” 様”);
        // 送信フラグ:trueの場合は、送信する。
        if($send) {
            if ($objSendMail->sendMail()) {
                $this->sfSaveMailHistory($order_id, $template_id, $tosubject, $body);
            }
        }

        return $objSendMail;
    }

    // テンプレートを使用したメールの送信
    function sfSendTplMail($to, $subject, $tplpath, &$objPage) {
        $objMailView = new SC_SiteView();
        $objSiteInfo = new SC_SiteInfo();
        $arrInfo = $objSiteInfo->data;
        // メール本文の取得
        $objPage->tpl_shopname=$arrInfo[‘shop_name’];
        $objPage->tpl_infoemail = $arrInfo[‘email02’];
        $objMailView->assignobj($objPage);
        $body = $objMailView->fetch($tplpath);
        // メール送信処理
        $objSendMail = new SC_SendMail_Ex();
        $to = mb_encode_mimeheader($to);
        $bcc = $arrInfo[‘email01’];
        $from = $arrInfo[‘email03’];
        $error = $arrInfo[‘email04’];
        $objSendMail->setItem($to, $subject, $body, $from, $arrInfo[‘shop_name’], $from, $error, $error, $bcc);
        $objSendMail->sendMail();
    }

    // 通常のメール送信
    function sfSendMail($to, $subject, $body) {
        $objSiteInfo = new SC_SiteInfo();
        $arrInfo = $objSiteInfo->data;
        // メール送信処理
        $objSendMail = new SC_SendMail_Ex();
        $bcc = $arrInfo[‘email01’];
        $from = $arrInfo[‘email03’];
        $error = $arrInfo[‘email04’];
        $objSendMail->setItem($to, $subject, $body, $from, $arrInfo[‘shop_name’], $from, $error, $error, $bcc);
        $objSendMail->sendMail();
    }

    //件名にテンプレートを用いる
    function sfMakeSubject(&$objQuery, &$objMailView, &$objPage, $subject){

        $arrInfo = $objQuery->select(“*”,”dtb_baseinfo”);
        $arrInfo = $arrInfo[0];
        $objPage->tpl_shopname=$arrInfo[‘shop_name’];
        $objPage->tpl_infoemail=$subject;
        $objMailView->assignobj($objPage);
        $mailtitle = $objMailView->fetch(‘mail_templates/mail_title.tpl’);
        $ret = $mailtitle.$subject;
        return $ret;
    }

    // メール配信履歴への登録
    function sfSaveMailHistory($order_id, $template_id, $subject, $body) {
        $sqlval[‘subject’] = $subject;
        $sqlval[‘order_id’] = $order_id;
        $sqlval[‘template_id’] = $template_id;
        $sqlval[‘send_date’] = “Now()”;
        if (!isset($_SESSION[‘member_id’])) $_SESSION[‘member_id’] = “”;
        if($_SESSION[‘member_id’] != “”) {
            $sqlval[‘creator_id’] = $_SESSION[‘member_id’];
        } else {
            $sqlval[‘creator_id’] = ‘0’;
        }
        $sqlval[‘mail_body’] = $body;

        $objQuery = new SC_Query();
        $objQuery->insert(“dtb_mail_history”, $sqlval);
    }

管理側受注管理

管理画面>受注管理>受注管理>受注履歴編集 で、ギフト包装の情報を見たり、変更できたりできるようにする。

有料に設定したid=1以上のギフト包装から、ギフトなしに変更(その逆も)して「計算結果の確認」や「この内容で変更する」を押したときに金額が変わることにも対応する。

管理画面>受注管理>ステータス管理 で受注番号を選択して出るポップアップのほうも対応する。

テンプレートの修正

※以下の2つは、管理画面用のテンプレートなので、カスタムテンプレートを使用している場合でも、defaultのテンプレートセットに変更を加えなければ、反映されないことに注意!

/data/Smarty/templates/default/admin/order/edit.tpl

L347あたりから。(手数料の下へ:表示させたい場所へ入れてOK)(ver.2.3.2の場合)

<tr bgcolor=”#ffffff” class=”fs12n”>
<td colspan=”5″ align=”right”>ギフト包装 : 
<!–{assign var=key value=”memo09″}–>
<span class=”red12″><!–{$arrErr[$key]}–></span>
<select name=”<!–{$key}–>” style=”<!–{$arrErr[$key]|sfGetErrorColor}–>”> 
<option value=”0″>ギフトなし</option>
<!–{html_options options=$arrGift selected=$arrForm[$key].value}–>
</td>
<td align=”right”><!–{$arrForm.memo10.value|number_format}–> 円</td>
</tr>

/data/Smarty/templates/default/admin/order/disp.tpl

L258あたりから。(手数料の下へ:表示させたい場所へ入れてOK)(ver.2.3.2の場合)

<tr bgcolor=”#ffffff” class=”fs12n”>
<td colspan=”4″ align=”right”>ギフト包装 :
<!–{if $arrDisp.memo09 != “” && $arrDisp.memo09 gt 0}–>
    <!–{$arrGift[$arrDisp.memo09]}–>
<!–{else}–>
    ギフトなし
<!–{/if}–>
</td>
<td align=”right”><!–{$arrDisp.memo10|number_format}–> 円</td>
</tr>

ページクラスの拡張

/data/class_extends/page_extends/admin/order/LC_Page_Admin_Order_Edit_Ex.php

init()、lfInitParam()、lfCheek()のコードを追加。L48あたりから。

    function init() {
        parent::init();
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrGift = $masterData->getMasterData( “mtb_gift”,
                                array( “id”, “name”, “rank” ) );
    }

    function lfInitParam() {
        parent::lfInitParam();
        $this->objFormParam->addParam(“ギフト・のし”, “memo09”, INT_LEN, “n”, array(“EXIST_CHECK”, “MAX_LENGTH_CHECK”, “NUM_CHECK”), ‘0’ );
        $this->objFormParam->addParam(“ギフト包装料金”, “memo10” );
    }

    /* 計算処理 */
    function lfCheek($arrInfo) {
        $arrErr = parent::lfCheek( $arrInfo );
        $arrVal = $this->objFormParam->getHashArray();
       
        // ギフト包装料金の計算。合計とお支払い合計を計算しなおしす。0はギフト包装なしのこと。
        if ( intval( $_POST[“memo09”] ) > 0 ) {
            // 合計
            $arrVal[‘total’] += GIFT_PRICE;
            // お支払い合計
            $arrVal[‘payment_total’] = $arrVal[‘total’] – ($arrVal[‘use_point’] * POINT_VALUE);
            $arrVal[‘memo10’] = GIFT_PRICE;
        } else {
            $arrVal[‘memo10’] = 0;
        }
       
       
        $this->objFormParam->setParam( $arrVal );
       
        return $arrErr;
       
    }

以上。

修正・アップロードするファイル一覧

  1.  /data/Smarty/templates/default/shopping/payment.tpl
  2.  /data/Smarty/templates/default/shopping/confirm.tpl
  3.  /data/Smarty/templates/default/mypage/history.tpl
  4.  /data/Smarty/templates/default/mail_templates/order_mail.tpl

 

  1.  /data/Smarty/templates/default/admin/order/edit.tpl
  2.  /data/Smarty/templates/default/admin/order/disp.tpl

 

  1. /data/Smarty/templates/default/mobile/shopping/deliv_date.tpl
  2.  /data/Smarty/templates/default/mobile/shopping/confirm.tpl
  3.  /data/Smarty/templates/default/mobile/mypage/history_detail.tpl
  4.  /data/Smarty/templates/default/mobile/mail_templates/order_mail.tpl

 

  1. /data/class_extends/page_extends/shopping/LC_Page_Shopping_Payment_Ex.php /data/class_extends/page_extends/shopping/LC_Page_Shopping_Confirm_Ex.php
  2.  /data/class_extends/page_extends/mypage/LC_Page_Mypage_History_Ex.php
  3.  /data/class_extends/page_extends/mypage/LC_Page_Mypage_HistoryDetail_Ex.php
  4.  /data/class_extends/page_extends/admin/order/LC_Page_Admin_Order_Edit_Ex.php

 

  1. /data/class_extends/helper_extends/SC_Helper_DB_Ex.php
  2.  /data/class_extends/helper_extends/SC_Helper_Mail_EX.php

参考:http://d.hatena.ne.jp/yuhei_kagaya/20080822

【EC-CUBE】メルマガの配信予約機能を使う(cron)

メルマガはデフォルトでは、配信設定したときに配信される。

これを、CRONを使って予約配信に変更し、30分ごとにメール配信予約ができるようにする。(*利用しているサーバがCRONによるJOBの予約に対応していること。)

その1)サーバのコンパネなどで下記コマンドのCRON設定を行う。

0,30 * * * * cd /(ECCUBEへのパス=/data/install.phpで確認すると良い)/html/admin/mail/; /usr/local/php/bin/php -f /(ECCUBEへのパス=/data/install.phpで確認すると良い)/html/admin/mail/sendmail.php 2>&1 > /dev/null

ちなみにcPanelの場合は、CRON設定画面でAdvanced(Unix Style)をクリック→
1つ目のフォーム:*/30
2つ目のフォーム:*
3つ目のフォーム:*
4つ目のフォーム:*
5つ目のフォーム**
6つ目のフォーム*cd /(ECCUBEへのパス=/data/install.phpで確認すると良い)/html/admin/mail/; /usr/local/php/bin/php -f /(ECCUBEへのパス=/data/install.phpで確認すると良い)/html/admin/mail/sendmail.php 2>&1 > /dev/null
を入力。

/usr/local/php/bin/phpは、/usr/bin/phpの場合もあるので、サーバのパスを確認すること。
Add Cronjobボタンをクリックして登録。上のフォームには、CRONが実行されたときに実行結果を送りたい管理者のメアドを入力しておく。

その2)EC-CUBE設定を行う。

管理画面→システム設定→パラメータ設定で、
[MELMAGA_BATCH_MODE]のパラメータを「false」から「true」へ変更。

管理画面→メルマガ管理でメールの配信を設定していくと、途中で予約配信の時間指定ができるようになっているので、30分単位で時間を入れて予約。毎時0分/30分に配信予約が入っているかの確認がCRONで送られてくる。

携帯メールの場合など設定を間違って夜中にお客さんのところにメールが届いた、といったミスが無いように、最初によくチェックしておくこと。

あとは、メルマガ配信予約で日時指定のときに、日につきの数値が入ってしまうバグがrので、/data/class/pages/admin/mail/LC_Page_Admin_Mail.phpの
292行目あたり「$this->arrNowDate[‘day’] = isset($_POST[‘send_day’]) ? $_POST[‘send_month’] : “”;」となってしまっているのを、「$this->arrNowDate[‘day’] = isset($_POST[‘send_day’]) ? $_POST[send_day] : “”;」と修正する。

【EC-CUBE】商品一覧ページの商品の並べ替え降順を追加する

一覧ページの並べ替えリンクで、価格順に昇順だけでなく降順を追加する。
新着順も同様に変更可能。

その1)/data/Smarty/templates/default/list.tplに降順並べ替え用のリンクを追加

L69あたりから(ver.2.3.2例)のソースに価格降順用のソースを追記。「価格順」のソースをコピペして編集すればOK。

 <!–件数ここから–>
  <!–{if $tpl_linemax > 0}–>
  <ul class=”pagenumberarea”>
    <li class=”left”><span class=”pagenumber”><!–{$tpl_linemax}–></span>件の商品がございます。</li>
    <li class=”center”><!–{$tpl_strnavi}–></li>
    <li class=”right”><!–{if $orderby != ‘price’}–>
        <a href=”javascript:fnModeSubmit(”, ‘orderby’, ‘price’)”>価格順</a>
    <!–{else}–>
        <strong>価格順</strong>
    <!–{/if}–>&nbsp;
  <!–{if $orderby != ‘price2’}–>
        <a href=”javascript:fnModeSubmit(”, ‘orderby’, ‘price2’)”>価格降順</a>
    <!–{else}–>
        <strong>価格降順</strong>
    <!–{/if}–>&nbsp;
    <!–{if $orderby != “date”}–>
        <a href=”javascript:fnModeSubmit(”, ‘orderby’, ‘date’)”>新着順</a>
    <!–{else}–>
        <strong>新着順</strong>
    <!–{/if}–>
    </li>
  </ul><!–件数ここまで–>
  <!–{else}–>
    <!–{include file=”frontparts/search_zero.tpl”}–>
  <!–{/if}–>

その2)/data/class/pages/products/LC_Page_Products_List.phpに価格降順用のソースを追記。

こちらも同様に、上の「価格順」のソースをコピペして編集すればOK。

L393あたりから

        //価格順
        case ‘price’:
            $col = “DISTINCT price02_min, product_id, product_code_min, product_code_max,”
                . ” name, comment1, comment2, comment3,”
                . ” main_list_comment, main_image, main_list_image,”
                . ” price01_min, price01_max, price02_max,”
                . ” stock_min, stock_max, stock_unlimited_min, stock_unlimited_max,”
                . ” point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee,”
                . ” status, product_flag, create_date, del_flg”;
            $from = “vw_products_allclass AS T1”;
            $order = “price02_min, product_id”;
            break;

というソースがあるので、その下にコピーして下記のように編集。

        //価格順
        case ‘price2’:
            $col = “DISTINCT price02_min, product_id, product_code_min, product_code_max,”
                . ” name, comment1, comment2, comment3,”
                . ” main_list_comment, main_image, main_list_image,”
                . ” price01_min, price01_max, price02_max,”
                . ” stock_min, stock_max, stock_unlimited_min, stock_unlimited_max,”
                . ” point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee,”
                . ” status, product_flag, create_date, del_flg”;
            $from = “vw_products_allclass AS T1”;
            $order = “price02_min DESC, product_id”;
            break;

これで、追加OK。新着順を古いものから並べたいときは、同様の手順でその下の「新着順」のコードをコピペして、一番下の「$order = “create_date DESC, product_id”;」を「$order = “create_date, product_id”;」(DESCを削除)とすればよい。

【EC-CUBE】データベース内の文字化け対策

DBを作ったら、先にphpMyAdminでDBに接続。

上のタブで、SQLを開き、まずは、

status

または、

show variables like “char%”;

と打ち込んで、現在の文字コードを確認。

サーバの設定にあたる「character_set_server」以外をUTF8に揃える。

ので、

set names utf8;
または、
alter database 〜DB名 character set utf8; (←たぶんこっち。)

で変更。確認して変更されていればOK。

これで変更できない場合は、phpMyAdminのトップページなどから、「照合順序」で変えればいいかと。

character_set_serverは、サーバの設定なので、個別には変更できないが、専用サーバなどであれば、my.conf等で変更可能。

my.cnfの[mysqld]のところにdefault-character-set=utf8と書いておけばOK。

2.3.2以前の場合は、それだけでは、システム動作時に文字化けに戻ってしまうので、

data/class/SC_DbConn.php

L64~
$this->conn = $objDbConn; 
の手前に、

if (DB_TYPE == 'mysql') {
$objDbConn->query('SET NAMES utf8');
}

を追加。(参考:http://svn.ec-cube.net/open_trac/changeset/17559)この場合、my.cnfの設定は必要ない。

【EC-CUBE】新着商品をブロックで表示する

1)まずはオススメ商品のPHPソース3つをコピーして新着商品用にファイル名変更。

  • /data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Best5.php
  • /data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Best5_Ex.php
  • /frontparts/bloc/best5.php

をそれぞれコピーし、Best5のところをNewに変更する。

  • /data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_New.php
  • /data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_New_Ex.php
  • /frontparts/bloc/new.php

2)PHPソースの中の変数などBest5→Newへbest5→newへ置き換えする。(数箇所ある)

3)LC_Page_FrontParts_Bloc_New.phpのソースを変更。(Ver.2.3RC1の場合L55~)

    function process() {

        if (defined(“MOBILE_SITE”) && MOBILE_SITE) {
            $objView = new SC_MobileView();
        } else {
            $objView = new SC_SiteView();
        }
        $objSiteInfo = $objView->objSiteInfo;

~(中略:この中身を下記ソースに入れ替え)

        $objView->display($this->tpl_mainpage);
    }

———-(モバイルについて記載している↓この手前まで)
    /**
     * モバイルページを初期化する.
———-

  function process() {
if (defined(“MOBILE_SITE”) && MOBILE_SITE) {
$objView = new SC_MobileView();
} else {
$objView = new SC_SiteView();
}
$objSiteInfo = $objView->objSiteInfo;

// 基本情報を渡す
$objSiteInfo = new SC_SiteInfo();
$this->arrInfo = $objSiteInfo->data;
$objQuery = new SC_Query();

//検索したい商品のステータスを設定
//NEW→1, 残りわずか→2, ポイント2倍→3, オススメ→4, 限定品→5
$productFlag = 1;

//検索する商品のステータスをランダムに決定し、表示させたい場合は以下のコメントを外してください。
//$id_count = $objQuery->count(mtb_status);
//$productFlag = rand(1,$id_count);

$this->statusName =$objQuery->get(“mtb_status_image”, “name”, “id={$productFlag}”);

//表示する商品の件数
$listCount = 8;

$ret = “”;
$arrTmp[$productFlag] = “1”;

for($i = 1; $i <= $productFlag; $i++) {
if($arrTmp[$i] == “1”) {
$ret.= “1”;
} else {
$ret.= “_”;
}
}

if($ret != “”) {
$ret.= “%”;
}
//$col = “dtb_products.product_id, dtb_products.name, dtb_products.main_image,
// MIN(dtb_products_class.price02) AS price02_min, MAX(dtb_products_class.price02) AS price02_max”;
//$from = “dtb_products INNER JOIN dtb_products_class using(product_id)”;
//$where = “product_flag LIKE \”{$ret}\””;
//$groupby = “product_id”;
//$this->groupby=$objQuery->setgroupby($groupby);
//商品の表示はupdate_dateが新しい順
//$order = “dtb_products.update_date DESC”;
//$this->order=$objQuery->setorder($order);

$col = “DISTINCT price02_min, product_id, price02_max, main_list_image, status, product_flag, name”;
$from = “vw_products_allclass AS T1”;
$where = “del_flg = 0 AND status = 1 AND product_flag LIKE ‘{$ret}'”;
//商品の表示はproduct_id逆順
$order = “product_id DESC”;
$this->order=$objQuery->setorder($order);

$arrFlagList = $objQuery->select($col, $from, $where);

//商品の表示をランダムに抽出する場合は以下のコメントを外してください。
//srand((double)microtime()*1000000); //乱数生成器を初期化
//shuffle($arrFlagList);

$this->arrFlagProducts = array_slice($arrFlagList, 0, $listCount);
//この変数名をテンプレの値の呼び出しに使うので注意。

$objSubView = new SC_SiteView();
$objSubView->assignobj($this);
$objSubView->display($this->tpl_mainpage);
}

元のソースの最後のほうの商品検索functionは不要なので、削除。

4)上記の3つのファイルをアップロード。

5)新着商品用のブロックを作り、DBを修正する。

まず、管理画面で「デザイン管理」→「ブロック編集」でブロック名「新着商品表示」/ファイル名「new(.tpl)」を作成する。
内容は、おすすめ商品用ブロック(best5.tpl)をコピーして保存。

phpMyAdminでデータベースを開いて、「dtb_bloc」テーブルの中を見ると、新商品用ブロックのデータ、NEWが追加されているので、その中の、php_path(最初はnullとなっている)に「frontparts/bloc/new.php」と値をセット。

各ファイルの中で変数名がEC-CUBEのバージョンアップによって変更になったりすることがある。そのときは、BEST5のソースを参考にして、適宜調整するとよい。

例えば、$arrBest5は→$arrFlagProductsとなる。

これでOK。ブロックのレイアウトは表示したいように適宜変更。

参考:http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=1276&forum=6