PHP

[EC-CUBE] 受注日検索の範囲区切りを修正してみる

おなじみのオープンソースのショッピングカート「EC-CUBE」のカスタム覚え書き。

管理画面の受注管理で検索条件の受注日で終端に指定した日の受注はヒットしないので調べてみました。

スポンサーリンク

環境

  • EC-CUBE 2.1.2
  • CentOS 5
  • PHP 5.2.6
  • PostgreSQL 8.3.1

内容

管理画面の『受注管理』の検索条件設定において、仮に受注日の欄で
2008年6月10日~2008年6月19日
という範囲を指定した場合、2008年6月19日の受注データがヒットしない。

調査

調査対象は /data/class/pages/admin/order/LC_Page_Admin_Order.php です。
検索条件に受注日を設定している箇所を特定しました。

LC_Page_Admin_Order.php:225

                    case 'search_sorderyear':
                        $date = SC_Utils_Ex::sfGetTimestamp($_POST['search_sorderyear'], $_POST['search_sordermonth'], $_POST['search_sorderday']);
                        $where.= " AND create_date >= ?";
                        $arrval[] = $date;
                        break;
                    case 'search_eorderyear':
                        $date = SC_Utils_Ex::sfGetTimestamp($_POST['search_eorderyear'], $_POST['search_eordermonth'], $_POST['search_eorderday'], false);
                        $where.= " AND create_date <= ?";
                        $arrval[] = $date;
                        break;

この部分ですが、SC_Utils_Ex::sfGetTimestampによって入力された日付データがタイムスタンプ値に変換されています。
このメソッドの仕様を確認してみました。

    /* DB用日付文字列取得 */
    function sfGetTimestamp($year, $month, $day, $last = false) {
        if($year != "" && $month != "" && $day != "") {
            if($last) {
                $time = "23:59:59";
            } else {
                $time = "00:00:00";
            }
            $date = $year."-".$month."-".$day." ".$time;
        } else {
            $date = "";
        }
        return     $date;
    }

結構単純です。
注目すべきは第4引数です。これがtrueの場合は時間に23:59:59(その日の最後)が設定され、逆にfalseでは00:00:00(その日の始まり)が設定されます。
これから先ほどの検索条件の部分を見ると第4引数にはfalseが設定されているので検索条件は
開始日の始め ~ 終端日の始め
となるので終端日は00:00:00の瞬間の受注しかヒットしません。

修正

これではどうも一般的な感覚では扱いづらいと思います。
終端日の受注を全てヒットさせるように修正します。

前述したようにSC_Utils_Ex::sfGetTimestampの第4引数をtrueにしてやるだけです。

                    case 'search_eorderyear':
                        $date = SC_Utils_Ex::sfGetTimestamp($_POST['search_eorderyear'], $_POST['search_eordermonth'], $_POST['search_eorderday'], true);
                        $where.= " AND create_date <= ?";
                        $arrval[] = $date;
                        break;

以上です。

検証

予想通りです。
2008年6月10日~2008年6月19日
という範囲を指定した場合、
2008年6月19日の受注データすべてがヒットするようになりました。

スポンサーリンク
記事を書いた人

システムえんじにゃー🐈
趣味はエレキギター、自転車など。作曲したい。
World of Warshipsやってます。
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
surface0 (さーふぇす)をフォローする

コメント

タイトルとURLをコピーしました