Archived content · 配布・購入・投稿機能は終了しています

Zen-Cartの商品提供可能日を時刻まで指定する方法

2007-09-29

Zen-Cartには、商品登録時に、商品提供可能日を設定することが可能です。
一般設定>トップページの表示設定で「入荷予定商品」を表示するようにしていれば、
トップページや商品リストの下部にリストされます。

デフォルトでは、日付指定だけで時間指定することはできませんが、現在取り組んでいる案件で 時間指定もできるようにして欲しいという要望があり、カスタマイズしましたので、メモしておきます。 なお、対象バージョンのZen-Cartはv1.302です。

管理画面側

まずは管理画面側から・・・ admin/includes/modules/pages/product_info/main_template_vars.phpの50行目付近
date_format(p.products_date_available, '%Y-%m-%d') as

を

date_format(p.products_date_available, '%Y-%m-%d %H:%i:%s') as

にします。
次に同ファイルの280行目付近

<td class="main"><script language="javascript">dateAvailable.writeControl(); dateAvailable.dateFormat="yyyy-MM-dd";</script></td>

を

<td class="main"><script language="javascript">dateAvailable.writeControl(); dateAvailable.dateFormat="yyyy-MM-dd 00:00:00";</script></td>

にします。
これだけで提供可能日を日付だけでなく時刻まで登録することができるようになります。
テキストボックスのサイズが小さいのが気になるようでしたら、
admin/includes/javascript/spiffyCal/spiffyCal_v2_1.js
の930行目付近のsize="12"を適当な値に変更してください。

ショップ画面側

includes/modules/upcoming_products.phpの15行目付近
if ( (!isset($new_products_category_id)) || ($new_products_category_id == '0') ) {
  $expected_query = "select p.products_id, pd.products_name, products_date_available as date_expected
                       from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd
                       where to_days(products_date_available) > to_days(now())
                       and p.products_id = pd.products_id
                       and pd.language_id = '" . (int)$_SESSION['languages_id'] . "'
                       order by " . EXPECTED_PRODUCTS_FIELD . " " . EXPECTED_PRODUCTS_SORT . "
                       limit " . MAX_DISPLAY_UPCOMING_PRODUCTS;
} else {
  $expected_query = "select p.products_id, pd.products_name, products_date_available as date_expected
                       from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " .
  TABLE_CATEGORIES . " c
                       where p.products_id = p2c.products_id
                       and p2c.categories_id = c.categories_id
                       and c.parent_id = '" . (int)$new_products_category_id . "'
                       and to_days(products_date_available) > to_days(now())
                       and p.products_id = pd.products_id
                       and pd.language_id = '" . (int)$_SESSION['languages_id'] . "'
                       order by " . EXPECTED_PRODUCTS_FIELD . " " . EXPECTED_PRODUCTS_SORT . "
                       limit " . MAX_DISPLAY_UPCOMING_PRODUCTS;
}

を

if ( (!isset($new_products_category_id)) || ($new_products_category_id == '0') ) {
  $expected_query = "select p.products_id, pd.products_name, products_date_available as date_expected
                       from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd
                       where products_date_available > now()
                       and p.products_id = pd.products_id
                       and pd.language_id = '" . (int)$_SESSION['languages_id'] . "'
                       order by " . EXPECTED_PRODUCTS_FIELD . " " . EXPECTED_PRODUCTS_SORT . "
                       limit " . MAX_DISPLAY_UPCOMING_PRODUCTS;
} else {
  $expected_query = "select p.products_id, pd.products_name, products_date_available as date_expected
                       from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " .
  TABLE_CATEGORIES . " c
                       where p.products_id = p2c.products_id
                       and p2c.categories_id = c.categories_id
                       and c.parent_id = '" . (int)$new_products_category_id . "'
                       and products_date_available > now()
                       and p.products_id = pd.products_id
                       and pd.language_id = '" . (int)$_SESSION['languages_id'] . "'
                       order by " . EXPECTED_PRODUCTS_FIELD . " " . EXPECTED_PRODUCTS_SORT . "
                       limit " . MAX_DISPLAY_UPCOMING_PRODUCTS;
}

に変更します。
具体的にはto_days関数を利用しないようにしているということですね。

他にもproducts_date_available関連のto_days関数を利用しているところがあれば、そちらも変更しておいた方がいいでしょう。