タグ: PHP

【EC-CUBE】携帯用詳細コメントを追加する

データベースに携帯用コメントカラムを追加し、商品登録時に、携帯用には別の詳細説明を登録し、PCサイトの説明と別にする。

  • データベースにカラム(フィールド)追加
  • 商品登録のPHPスクリプト追加
  • 管理画面の商品登録・確認テンプレートを修正
  • モバイル用詳細テンプレートを修正

その1)データベースへのカラム追加

phpMyAdminでDBへアクセスし、dtb_productsの最後へ1カラム追加。

カラム名「comment7」
データ型「text」

※残りのフィールドは先のデータを参照。

その2)商品登録PHPの修正。

/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_Product_Ex.php

/data/class/pages/admin/products/LC_Page_Admin_Products_Product.phpからlfRegistProduct関数 (=商品登録関数)をコピー(L387~L493:ver.2.3.2の場合)し、LC_Page_Admin_Products_Product_Ex.phpの「デストラクタ」の下(L68:ver.2.3.2の場合※最後の「}」の手前へ。)へ貼り付け。
ソースを一部編集する。

貼り付けたソースのL78あたりにcomment7(=携帯用コメント)を追加。

 “comment4”, “comment5”, “comment6”, “comment7”, “main_list_comment”,

L97あたりにも1行追加。

$sqlval[‘comment7’] = $arrList[‘comment7’];

LC_Page_Admin_Products_Product.phpからLC_Page_Admin_Products_Product_Ex.phpへ、lfErrorCheck関数もコピー。(L546~L609:ver.2.3.2の場合)
lfRegistProduct関数の下に貼り付け。

貼り付けたソースのL183あたり
$objErr->doFunc(array(“詳細-メインコメント”, “main_comment”, $this->arrAllowedTag), array(“HTML_TAG_CHECK”));
の下に2行追加。

$objErr->doFunc(array(“携帯用詳細コメント”, “comment7”, LLTEXT_LEN), array(“SPTAB_CHECK”, “MAX_LENGTH_CHECK”));
$objErr->doFunc(array(“携帯用詳細コメント”, “comment7”, $this->arrAllowedTag), array(“HTML_TAG_CHECK”));

その3)MySql用にデータの読み込みコードを追加

これをやらないと、再編集するときに、登録画面に以前に登録したデータが読み込まれない;

/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php (L304あたり:ver.2.3.3の場合)

「T1.comment6,」の下に1行追加し、「T1.comment7,」。

その4)データ登録用ADMINテンプレートの編集。

商品登録画面のテンプレートへ携帯用情報登録フォームのコード追加。

/data/Smarty/templates/default/admin/products/product.tpl (L243あたり、詳細-メインコメントのTD中へ。)

 <br><br>
 <div class=”center”>
  <input type=”button” name=”btn” onclick=”selectAll(‘category_id’); lfDispSwitch(‘mobile_detail’);” value=”モバイル専用詳細コメント表示/非表示”>
 </div>
 <div id=”mobile_detail” style=”<!–{if !$arrForm.comment7}–>display:none<!–{/if}–>”>
  <p>
  PCと携帯で異なる詳細コメントを表示する際には以下のフォームに携帯サイト用のコメントを入力して下さい。<br />
  入力されなかった場合は、PCサイトと同じ詳細コメント↑を表示します。<br />
  </p>
  <textarea name=”comment7″ id=”comment7″ value=”<!–{$arrForm.comment7|escape}–>” maxlength=”<!–{$smarty.const.LLTEXT_LEN}–>” style=”<!–{if $arrErr.comment7 != “”}–>background-color: <!–{$smarty.const.ERR_COLOR}–><!–{/if}–>”  cols=”60″ rows=”8″ class=”area60″><!–{$arrForm.comment7|escape}–></textarea><br /><span class=”red”> (上限<!–{$smarty.const.LLTEXT_LEN}–>文字)</span>

確認画面は、携帯用コメントを入力した場合のみ表示されるようにコードを追加。

/data/Smarty/templates/default/admin/products/confirm.tpl (L183あたり、詳細-メインコメントの/TRの後ろへ。)

<!–{if $arrForm.comment7}–>
<tr>
 <td bgcolor=”#f2f1ec” width=”160″ class=”fs12n”>モバイル詳細コメント</td>
 <td bgcolor=”#ffffff” width=”557″ class=”fs12n”>
 <!–{$arrForm.comment7|nl2br}–>
 </td>
</tr>
<!–{/if}–>

その5)モバイルサイトの表示テンプレートを編集。

/data/Smarty/templates/default/mobile/products/detail.tpl (L39あたり。詳細メインコメントの表示を変更。)

<!–{$arrProduct.main_comment|nl2br}–>

↓下記に変更。

<!–{if !$arrProduct.comment7}–><!–{$arrProduct.main_comment|nl2br}–><!–{else}–><!–{$arrProduct.comment7|nl2br}–><!–{/if}–>

携帯専用のコメントがある場合は、それを表示し、ない場合は、PC用のコメントを共用で表示する。

参考:http://www.eccube-school.jp/products/detail40.html
※DBがポスグレの場合は、上記手順と少し違うため、こちらのサイトを参照のこと。

【EC-CUBE】受注管理でデータの更新ができない場合にエラーメッセージを出す

受注データの更新ができていなくてもアラートがでなかったのを、ちゃんとエラーメッセージが出るようにする。(エラーなく更新できるようにバグ修正するわけではないので誤解なきよう注意。)

/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php

L151あたりの

   if(count($this->arrErr) == 0) {
       $this->lfRegistData($_POST[‘order_id’]);
       // DBから受注情報を再読込
       $this->lfGetOrderData($order_id);
       $this->tpl_onload = “window.alert(‘受注履歴を編集しました。’);”;
     }

これを↓下記に。

   if(count($this->arrErr) == 0) {
      $this->lfRegistData($_POST[‘order_id’]);
      // DBから受注情報を再読込
      $this->lfGetOrderData($order_id);
      $this->tpl_onload = “window.alert(‘受注履歴を編集しました。’);”;
    } else {
       $this->tpl_onload = “window.alert(‘受注履歴が編集できませんでした。”.array_shift($this->arrErr).”‘);”;
    }

【EC-CUBE】売り上げ集計をバッチモードにして動作を軽減(再びCRON)

EC-CUBEの売り上げ集計は2つのモードが選択でき、デフォルトは、リアルタイム集計。処理が長くなると、タイムアウトしてしまったり、ダウンしてしまう。

  1. リアルタイム・・・「月度で集計する」や「期間で集計する」ボタンが押されたときにその場で集計→集計データ格納→集計データ取得→表示、と行う方法。
  2. バッチモード・・・あらかじめ売上データを集計しておき、「月度で集計する」や「期間で集計する」ボタンが押されたときには、すでに集計して格納済みのデータを取得→表示、と行う方法。

その1)管理モードの変更

管理画面→システム管理→パラメータ管理で、
DAILY_BATCH_MODEを[false]から[true]に変更。

その2)/data/script/execute_batch_daily.phpを作成。

/**
* デイリーバッチ起動スクリプト
*/

require_once( dirname(__FILE__) . “/../install.php” );
define( “CLASS_PATH”, DATA_PATH . ‘class/’ );
define( “CLASS_EX_PATH”, DATA_PATH . ‘class_extends/’ );
define( “CACHE_PATH”, DATA_PATH . ‘cache/’ );

require_once(CLASS_EX_PATH . “util_extends/GC_Utils_Ex.php”);
require_once(CLASS_EX_PATH . “util_extends/SC_Utils_Ex.php”);
require_once(CLASS_EX_PATH . “db_extends/SC_DB_MasterData_Ex.php”);
require_once(CLASS_EX_PATH . “db_extends/SC_DB_DBFactory_Ex.php”);
require_once(CLASS_PATH . “SC_DbConn.php”);
require_once(CLASS_PATH . “SC_Query.php”);
require_once(CLASS_PATH . “SC_SelectSql.php”);

require_once(CLASS_EX_PATH . ‘batch_extends/SC_Batch_Daily_Ex.php’);
require_once(CLASS_EX_PATH . “SC_Initial_Ex.php”);
// アプリケーション初期化処理
$objInit = new SC_Initial_Ex();
$objInit->init();

$usage = <<

php -f execute_batch_daily.php start term
集計期間を指定して売上集計をします。

 start 集計開始日。何日前の売上から集計するか。1 から 365以内で指定。
 term 集計対象期間。何日分の売上を集計するか。1 から 365以内で指定。

例:昨日の売上を集計します。
php -f execute_batch_daily.php 1 1

USAGE;

if ( $argc != 3 ) {
echo ( $usage );
exit(1);
}

$start = $argv[1];
$term = $argv[2];
if ( !is_numeric( $start ) || !is_numeric( $term ) ) {
echo ( $usage );
exit(1);
}

$start = intval( $start );
$term = intval( $term );

if ( $start < 1 || $start > 365 || $term < 1 || $term > 365 ) {
echo ( $usage );
exit(1);
}

if ( $term > $start ) {
echo ( $usage );
exit(1);
}

$objBatch = new SC_Batch_Daily_EX();
$objBatch->lfStartDailyTotal( $term, $start, true );
?>

その3)/data/class/batch/SC_Batch_Daily.phpを修正。

L92,93(ver.2.3.2の場合)

// 削除された受注データの受注詳細情報の削除
$objQuery = new SC_Query();
//$where = “order_id IN (SELECT order_id FROM dtb_order WHERE del_flg = 1)”; ←コメントアウト
//$objQuery->delete(“dtb_order_detail”, $where); ←コメントアウト

// 最後に更新された日付を取得

// 最後に更新された日付を取得

L102(ver.2.3.2の場合)

// 最後のバッチ実行からLOAD_BATCH_PASS秒経過していないと実行しない。
if($pass < LOAD_BATCH_PASS) {
//GC_Utils_Ex::gfPrintLog(“LAST BATCH ” . $arrRet[0][‘create_date’] . ” > ” . $batch_pass . ” -> EXIT BATCH $batch_date”); ←コメントアウト
$batch_next = date( “Y-m-d H:i:s”, strtotime($batch_last) + LOAD_BATCH_PASS ); ←追加
GC_Utils_Ex::gfPrintLog(“LAST BATCH ” . $batch_last . ” NEXT BATCH AFTER $batch_next -> EXIT BATCH”); ←追加

return;
}

L107(ver.2.3.2の場合)

// 集計
//for ($i = $start; $i < $term; $i++) { ←コメントアウト
for ($i = $start, $k = 0; $k < $term; $i–, $k++ ) { ←追加
// 基本時間から$i日分さかのぼる
$tmp_time = $now_time – ($i * 24 * 3600);

L154(ver.2.3.2の場合)

GC_Utils_Ex::gfPrintLog(“LOADING BATCH $batch_date”);
$this->lfBatOrderDaily($tmp_time);
$this->lfBatOrderDailyHour($tmp_time);
$this->lfBatOrderAge($tmp_time);
// タイムアウトを防ぐ ←追加
SC_Utils_Ex::sfFlush(); ←追加

}
}

※そもそも集計時にSQLエラーになるところがあるので、先に
http://www.bton.net46.net/?p=724
の修正を行っておくこと。

その4)CRONの設定

0 2 * * * /usr/local/bin/php -f /path/to/eccube/data/script/execute_batch_daily.php 1 1 2>&1 > /dev/null

参考サイト:http://d.hatena.ne.jp/yuhei_kagaya/20081019

【EC-CUBE】集計ページが正しく表示されない・・・対応策の備忘録

集計表示でタイムアウト・・・デフォルトではリアルタイム集計をしているので、動作が重くサーバに負荷も掛かってしまう。

思い切ってバッチ処理で夜中に前日までの売り上げを集計しておくことにする。これで、集計を見るときにはサックサク動くはず。

と思ったら、いくつかバグがあり、MYSQLを使っていると、バグを踏んでるいくつかの集計は表示されない。エラーでまくり、なんだこりゃ。全体的に、MYSQL関係でなんだかんだとエラーが出るんだね。

てことで、バッチ処理にする手前で、虫退治に出かけることになる。。。

表示できなかったのは、mySQLを使用した際、ポスグレでは利用できるtrunc関数をmySQL用にtruncate関数へ変換する処理が上手く機能していないため。

そこで、シンタックスエラーになっていたSQL構文を修正し、動作不良を修正。その後、MYSQL用にtrunc→truncate変換をしているsfChangeMySQLが2重に掛かっている(と思われる)部分をコメントアウト。コレで何とかサクサク動作を手に入れた;

その1)シンタックスエラーの修正。

/data/class/batch/SC_Batch_Daily.php (L189、L271:ver.2.3.2の場合)

/data/class/pages/admin/total/LC_Page_Admin_Total.php (L641、L709:ver.2.3.2の場合)

上記2つのファイルの(AVG(total))→(AVG(total),0)へ変更
この時点で、エラーの出ていた職業別集計と会員別集計のうち職業別集計は表示されるようになる。

その2)trunc→truncate変換をしているsfChangeMySQLの2重適用部分をコメントアウト。

/data/class/SC_Query.php (L94:ver.2.3.2の場合)

この中の、$sqlse = $dbFactory->sfChangeMySQL($sqlse); 1行をコメントアウト(または削除)

※/data/class/SC_Query.phpの$sqlseというのが、なんに使われているのか分からなかったが、ここでは、sfChangeMySQLの処理を行っているだけで、同じ処理がSC_DbConnでも順に行っていることから不要かと判断する。

これで動作はエラーがなくなった。
あとはバッチ処理で夜中にcronを動かすのみ。だ~~~~~。

【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