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

公開日:2015年1月20日

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

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

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

★2.12の場合

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

    /**
     * お届け可能日のスタート値から, お届け日の配列を取得する.
     */
    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;
    }

★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

    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;
    }

 

あと下記は、裏技といいますか、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を付加

public function ・・・続く

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

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

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