それでは今回はEC-CUBEの商品項目追加の実践を行ってみましょう。
流れは前回お話したとおりです。
1.DBのdtb_productsテーブルにカラムを追加
2.管理画面での対応をする
-商品登録、編集画面のテンプレートに追加項目を追加
-商品登録のvalidation、および登録項目を追加
-確認画面への表示
-商品CSVダウンロード、アップロードに項目を追加
3.一覧画面や詳細画面等の必要な個所に追加項目を表示する
今回は商品に発売日を追加するという事で進めていきましょう。
1.DBへのカラム追加
dtb_productsに
カラム名:release_date
型:timestamp without time zone
NOT NULLは外した状態で登録してみましょう。
これはpostgresSQLを利用した場合なのでmySQLの場合は型をdatetimeなどとしてください。
追加する方法はサーバの環境に応じていろいろあると思いますが、
一般的にはphpPgAdminやphpMyAdminを利用するのが分かりやすいと思います。
レンタルサーバを利用している場合などはこのあたりがサーバによっていろいろ違いますので別途お調べください。
そして、忘れがちなのがビューへの追加です。
postgresSQLの場合はビューを使うようになっていますので、ここを変更しないといけません。
vw_product_class
vw_products_allclass
vw_products_allclass_detail
vw_products_nonclass
これら4のビューにrelease_dateという項目を追加していってください。
mySQLの場合はSC_DB_DBFactory_MYSQL.phpというファイルにビューに相当する記述がありますので
ここに追加していってください。
(※ver.2.4系の場合です。2.11系の場合にはビューが廃止されています)
2.管理画面での対応
LC_Page_Admin_Products_Product_Ex.phpを開き次のような編集を行っていってください。
[php]
function process() {
$objDate = new SC_Date();
$this->objDate = $objDate;
for ($year=date("Y"); $year<=date("Y") + 1;$year++){
$arrYear[$year] = $year;
}
$this->arrYear = $arrYear;
parent::process();
}
[/php]
ここでまず、セレクトメニューに表示するための「年」の部分を処理しています。ここでは現在の年から1年後までを選択の対象とするようにしています。この部分は必要に応じて変更してください。
次にlfProductPage関数の適当なところに以下のコードを加えてください。
[php]
if($this->arrForm[‘release_date’]){
$date_array = getdate(strtotime($this->arrForm[‘release_date’]));
$this->arrForm[‘release_year’] = $date_array[‘year’];
$this->arrForm[‘release_month’] = $date_array[‘mon’];
$this->arrForm[‘release_day’] = $date_array[‘mday’];
}
DBには2011-07-18という形式で保存されていますので、これをセレクトメニューで選択するようにするためには
保存されている情報を一度年、月、日にばらす必要があります。セレクトメニューを使わずにテキストで入力する場合にはこの処理は必要ありません。</pre>
<div></div>
<pre>
[/php]
lfErrorCheck関数に以下のソースを加えてください。
[php]
$objErr->doFunc(array("発売日(年)","release_year"), array("EXIST_CHECK", "NUM_CHECK"));
$objErr->doFunc(array("発売日(月)","release_month"), array("EXIST_CHECK", "NUM_CHECK"));
$objErr->doFunc(array("発売日(日)","release_day"), array("EXIST_CHECK", "NUM_CHECK"));
[/php]
年、月、日の入力をそれぞれチェックしていきます。一般的にバリデーションと呼ばれる処理です。EC-CUBEではこのようにlfEroorCheck関数を用意されます。
[php]
/* 商品の登録 */
function lfRegistProduct($arrList) {
$objQuery = new SC_Query();
$objDb = new SC_Helper_DB_Ex();
$objQuery->begin();
// 配列の添字を定義
$checkArray = array("name", "status", "product_flag",
"main_list_comment", "main_comment", "point_rate",
"deliv_fee", "comment1", "comment2", "comment3",
"comment4", "comment5", "comment6", "main_list_comment",
"sale_limit", "sale_unlimited", "deliv_date_id", "note");
$arrList = SC_Utils_Ex::arrayDefineIndexes($arrList, $checkArray);
// INSERTする値を作成する。
$sqlval[‘name’] = $arrList[‘name’];
$sqlval[‘status’] = $arrList[‘status’];
$sqlval[‘product_flag’] = $arrList[‘product_flag’];
$sqlval[‘main_list_comment’] = $arrList[‘main_list_comment’];
$sqlval[‘main_comment’] = $arrList[‘main_comment’];
$sqlval[‘point_rate’] = $arrList[‘point_rate’];
$sqlval[‘deliv_fee’] = $arrList[‘deliv_fee’];
$sqlval[‘comment1’] = $arrList[‘comment1’];
$sqlval[‘comment2’] = $arrList[‘comment2’];
$sqlval[‘comment3’] = $arrList[‘comment3’];
$sqlval[‘comment4’] = $arrList[‘comment4’];
$sqlval[‘comment5’] = $arrList[‘comment5’];
$sqlval[‘comment6’] = $arrList[‘comment6’];
$sqlval[‘main_list_comment’] = $arrList[‘main_list_comment’];
$sqlval[‘sale_limit’] = $arrList[‘sale_limit’];
$sqlval[‘sale_unlimited’] = $arrList[‘sale_unlimited’];
$sqlval[‘deliv_date_id’] = $arrList[‘deliv_date_id’];
$sqlval[‘note’] = $arrList[‘note’];
$sqlval[‘rec_time’] = $arrList[‘rec_time’];
$sqlval[‘product_info’] = $arrList[‘product_info’];
$sqlval[‘note’] = $arrList[‘note’];
$sqlval[‘update_date’] = "Now()";
$sqlval[‘creator_id’] = $_SESSION[‘member_id’];
$sqlval[‘release_date’] = $arrList[‘release_year’] ."/".$arrList[‘release_month’]."/".$arrList[‘release_day’];
・・・(以下略)
}
[/php]
最後の行に発売日の項目を追加しています。これをしないとDBに保存されません。
あと、管理画面ではCSVアップロードとダウンロードに対応した方がいいのですが、必須という訳でもないのでここでは割愛させてもらいます。
最後にテンプレートファイルへの追加も忘れず行ってください。default->admin->products->product.tplとconfirm.tplです。
3.フロント画面への表示に関しては、いろいろあるので今回は一例として詳細画面への表示を行ってみます。
といっても、テンプレートに追加していくだけです。
発売日:<!–{$arrProduct.release_date|date_format:”%Y/%m/%d”}–>
のようにdetail.tpl内に記述すれば利用することが可能です。
少し説明を省いた部分もありますが、他の項目を追加する場合も基本的には上の流れで大丈夫だと思います。
是非チャレンジしてみてください。