おなじみのオープンソースのショッピングカート「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日の受注データすべてがヒットするようになりました。
コメント