[EC-CUBE] お届け日指定のカスタマイズ(2.12)(2.13)

EC-CUBEでは、商品登録ページの「発送日目安」の日数と、注文ページの「お届け日の指定」が連動していますが、デフォルトのままでは、定休日(例えば、土日祝)を考慮してくれません。

例えば、お客様の注文が金曜日の時、「発送日目安」を翌日発送にしていると、マスターデータの設定にもよりますが、明後日からお届け日の指定ができてしまいます。
この場合、明後日は日曜日です。ショップが土日祝を定休日としている場合、発送は月曜日になりますので、最短でも火曜日のお届けになってしまいます。

そのため、定休日を考慮したお届け日指定のカスタマイズは必須ですね。
基本情報管理 → 定休日管理でセットした、定休日を考慮するようにカスタマイズしました。

★2.12の場合

data/class/helper/SC_Helper_Purchase.phpを変更
[php highlight=”27″]
/**
* お届け可能日のスタート値から, お届け日の配列を取得する.
*/
function getDateArray($start_day, $end_day)
{
$masterData = new SC_DB_MasterData_Ex();
$arrWDAY = $masterData->getMasterData(‘mtb_wday’);
//お届け可能日のスタート値がセットされていれば
if ($start_day >= 1) {
$now_time = time();

/* ここから追加 */
// カレンダーブロック表示用オブジェクトを生成し、定休日設定を取得
require_once(CLASS_REALDIR . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Calendar.php");
$BlocCalendar = new LC_Page_FrontParts_Bloc_Calendar();
$BlocCalendar->arrRegularHoliday = $BlocCalendar->lfGetRegularHoliday();
$BlocCalendar->arrHoliday = $BlocCalendar->lfGetHoliday();
// 配達可能日の起点を指定「営業日」以降に変更
for ($i = 1, $j = 1; $j < $start_day; $i++ )
{
// 定休日管理で設定された休日と、日曜・土曜を休日とする
$tmp_time = $now_time + ($i * 24 * 3600);
list($y, $m, $d, $w) = explode(" ", date("Y m d w", $tmp_time));
$m = intval( $m );
$d = intval( $d );
$w = intval( $w );
if ( $BlocCalendar->lfCheckHoliday( $y, $m, $d ) )
{
continue;
}
// 日数加算
$j++;
}
// スタート値を調整
$start_day += $i – $j;
/* 追加ここまで */

$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;
}
[/php]

★2.13の場合

data/class/helper/SC_Helper_Purchase.phpを変更

[2015/3/23 追加修正]EC-CUBE開発コミュニティのスレッドより
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=14921&forum=10&post_id=66718
[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();
/* 追加 ここから */
$horiday = new SC_Date_Ex();
$start_day_i = 1;
for ($i = 1; ; $i++) {
// 基本時間から日数を追加していく
$tmp_time = $now_time + ($i * 24 * 3600);
list($y, $m, $d, $w) = explode(‘ ‘, date(‘Y m d w’, $tmp_time));
if ($horiday->isHoliday($y, $m, $d)) {
} else {
if ($start_day_i >= $start_day) {
// 即日発送 = 1($start_day_new)
$start_day_new = $i;
break;
}
$start_day_i++;
}
}
$start_day = $start_day_new;
/* 追加 ここまで */
$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;
}
[/php]

 

あと下記は、裏技といいますか、2.13でも、2.12のコードを利用することで動きました。あまりお勧めできません。
不具合は、今のところ見つかっていませんが。。。

■カスタマイズするファイル

(1)data/class/pages→frontparts/bloc/LC_Page_FrontParts_Bloc_Calendar.php
(2.12のファイルと入れ替え)
(2)data/class/helper/SC_Helper_Purchase.php
(2.13のファイルに、2.12用のカスタマイズを加えたファイル)

■変更点

(1)2.13では、functionの前に、public が付いているので、両ファイルとも、functionの前に、publicを付加
[php]
public function ・・・続く
[/php]

(2)関数名「lfCheckHoliday」となっている部分を、両ファイルとも「isHoliday」に修正

関数名についてですが、
LC_Page_FrontParts_Bloc_Calendar.php、SC_Helper_Purchase.phpとも、同じ関数名を利用しているなら「lfCheckHoliday」のままでも動くのかもしれないですが未確認です。

サーバー環境によって違うかもしれませんので、
くれぐれも、バックアップを取ってからお試しください。