EC-CUBEの商品一覧をTOPページに表示する方法

EC-CUBE APIの話はちょっとお休みして、今回はEC-CUBEのバッドノウハウをw

EC-CUBEの商品一覧をTOPページ(というか、商品一覧ページ以外)に表示させたい場合が
あるわけですが、その場合の一番何も考えないやり方としては、

1. data/class/pages/products/LC_Page_Products_List.php の内容を
data/class_extends/page_extends/LC_Page_Index_Ex.php にコピー (クラス名等は適宜調整するとして)
2. data/Smarty/templates/default/products/list.tpl を
data/Smarty/templates/default/index.tpl にコピーして、カスタマイズ

となるかと思うのですが、それではあまりに何も考えてなさ過ぎるというか、
LC_Page_Products_List と LC_Page_Index_Ex で同じコードを持ってたら
メンテナンスがめんどくさいよねと思って、
もう少しだけマシなやり方を考えてみました。

## 具体的手順
まず、商品一覧を得るために必要な処理は LC_Page_Products_List_Ex にあるので、
LC_Page_Index_Ex の中にLC_Page_Products_List_Ex のオブジェクトを作り、
LC_Page_Products_List_Ex::init() と LC_Page_Products_List_Ex::action() を呼び出します。

次に、LC_Page_Products_List_Ex のプロパティを Smarty のテンプレート変数にするため、
LC_Page_Products_List_Ex の全プロパティを LC_Page_Index_Ex のプロパティに
コピーします。

## コード
具体的には、data/class_extends/page_extends/LC_Page_Index_Ex.php
に action() メソッドを追加して、以下のようなコードを書きます。

function action() {
parent::action();

/* LC_Page_Products_List_Ex のオブジェクトを作成、処理を実行 */
$productsList = new LC_Page_Products_List_Ex();
$productsList->init();
$productsList->action();

/* LC_Page_Products_List_Ex のプロパティをコピー */
foreach ($productsList as $key => $val) {
$this->$key = $val;
}
}

あとは data/Smarty/templates/default/products/list.tpl を
data/Smarty/templates/default/index.tpl にコピーして、
必要なカスタマイズをすればオッケーです。

## category_idで絞り込みを行ないたい時は
$productsList->action() を実行する前に $_REQUEST に category_id=… という
パラメータをセットしてあげるのが手っ取り早いです。

function action() {
parent::action();

$savedRequest = $_REQUEST; // 元の $_REQUEST を保存

/* LC_Page_Products_List_Ex のオブジェクトを作成、処理を実行 */
$productsList = new LC_Page_Products_List_Ex();

$_REQUEST = array(‘category_id’ => 4); // category_id をセット
$productsList->init();
$productsList->action();

$_REQUEST = $savedRequest; // 必要であれば元の $_REQUEST を戻す

/* LC_Page_Products_List_Ex のプロパティをコピー */
foreach ($productsList as $key => $val) {
$this->$key = $val;
}
}

スポンサーリンク
スポンサーリンク:

フォローする