EC-CUBE カスタマイズ お届け日を指定する
どうもfujiharaです。
最近三寒四温という言葉を知りました。
皆様、お体には十分ご注意下さい。
さて本日はEC-CUBE の注文時にお届け日をお客さんが
常に指定できるカスタマイズを行います。
要件
EC-CUBEのカスタマイズで、常にお客さんがお届け日を指定できるように
して欲しいと言う依頼がありました。
通常 EC-CUBE のお届け日は商品の発送目安によって決まりますが、
常にこれでよいと言うことでしたので以下のようにカスタマイズしました。
カスタマイズファイル
もともとお届け日設定を指定しているファイルは
"data/class/helper/SC_Helper_Purchase.php" ファイル内 618行目付近の
getDateArray 関数になります。なので今回カスタマイズする
ファイルは "data/class_extends/helper_extends/SC_Helper_Purchase_Ex.php"
ファイルになります。
元の関数
/**
* お届け可能日のスタート値から, お届け日の配列を取得する.
*/
public function getDateArray($start_day, $end_day)
{
$masterData = new SC_DB_MasterData_Ex();
$arrWDAY = $masterData->getMasterData('mtb_wday');
//お届け可能日のスタート値がセットされていれば
if ($start_day >= 1) {
$now_time = time();
$max_day = $start_day + $end_day;
// 集計
for ($i = $start_day; $i < $max_day; $i++) {
// 基本時間から日数を追加していく
$tmp_time = $now_time + ($i * 24 * 3600);
list($y, $m, $d, $w) = explode(' ', date('Y m d w', $tmp_time));
$val = sprintf('%04d/%02d/%02d(%s)', $y, $m, $d, $arrWDAY[$w]);
$arrDate[$val] = $val;
}
} else {
$arrDate = false;
}
return $arrDate;
}
変更後
/**
* お届け可能日のスタート値から, お届け日の配列を取得する.
*/
public function getDateArray($start_day, $end_day)
{
$start_day = 3; //****** ①
$masterData = new SC_DB_MasterData_Ex();
$arrWDAY = $masterData->getMasterData('mtb_wday');
$objQuery =& SC_Query_Ex::getSingletonInstance();
$col = 'month, day';
$where = 'del_flg = 0';
$table = 'dtb_holiday';
$tmpHolidays = $objQuery->select($col, $table, $where);
$holidays = array();
foreach($tmpHolidays as $holiday) {
$holidays[] = $holiday['month'].'-'.$holiday['day'];
}
$now_time = time() + ($start_day*24*3600);
$delivDays = array();
$i=0;
while (count($delivDays)!==5) { //*******②
$check = true;
$checkTime = $now_time + ($i*24*3600);
$checkWeekday = date('w', $checkTime);
$checkMonthDay = date('n-j', $checkTime);
//休日チェック
if (in_array($checkMonthDay, $holidays)) {
$check = false;
}
$checkYear = date('Y', $checkTime);
$checkBeforeYear = date('Y', $checkBeforeTime);
//土日チェック
if ($checkWeekday === '6' || $checkWeekday === '0') {
$check = false;
}
if ($check) {
list($y, $m, $d, $w) = explode(' ', date('Y m d w', $checkTime));
$val = sprintf('%04d/%02d/%02d(%s)', $y, $m, $d, $arrWDAY[$w]);
$delivDays[$val] = $val;
}
$i++;
}
return $delivDays;
}
説明
通常この関数は$start_dayが設定されていないとお届け日を設定しません。
なので関数内で$start_day を強制的に書き換え、お届け日のデータを作成しています。
お届け日は3日目以降で土日及びEC-CUBE の休日設定を除く5日間で計算されるようになっています。( ①、②の部分です)
実際に運用される場合は 3, 5と言う数字は 定数として定義するのが良いと思います。
まとめ
EC-CUBEはオープンソースでいろんな情報が探せるのでカスタマイズも凄くしやすく気に入っています。素敵なカスタマイズを探して日々まい進していきます!