概要
EC-CUBEでカテゴリを選択した際に表示される商品一覧ページの各商品に、商品の送料区分「postage_flag」を追加するカスタマイズをしたいと思います。送料区分は、[EC-CUBE]商品に送料無料(込)のフラグを設けるで追加したパラメータです。既存のフィールドを表示するのにも参考になると思いますので、別のフィールドを追加したい方はpostage_flagを適時読み替えてください。
最初に
最初、このカスタマイズは誰でもできる簡単なものだと思っていたのですが、実際ソースを追ってみてビックリ!いつもならデータベースから商品情報を取得する場合DBFactoryのクエリから取得するんだけど、商品一覧はそこにワンクッション入っていてLC_Page_Products_ListクラスのIfDispProductsList()メソッドでデータを取得しているという…なぜこんなに面倒なことになってんだ…orz
というわけで、仕組みがわかってしまえば簡単ですけどかなり面倒くさいことをやってるんで自信の無い方は手を出さないほうがいいですよ。念のためご忠告しておきます。
今回は自分で追加したフィールドを表示させるため、vw_products_allclassには含まれていませんので、新たなフィールドを追加するところから始めます。
ソースを追ってみる
まずはソースの追い方から。結論を急ぐ方はこの項目を飛ばしてください。
商品一覧ページのパスは/html/products/list.phpですから、チェックするのは/data/class_extends/page_extends/products/LC_Page_Products_List_Ex.phpですね。process()メソッドが空の場合は、親クラスを参照するか親クラスからメソッドをコピーしてください。
process()メソッドを見てみると、いつもデータを取得するのに使っている$objDb(SC_Helper_DB_Exクラスのインスタンス)や、$objQuery(SC_Queryクラスのインスタンス)を使って商品一覧を取得している部分が無いことに気付いて「あれ?」ってなると思います。dtb_best_productsのデータは$objQueryを使って取得してるみたいですけどね。
で、おかしいなと。
どこなんだ、と。
探してみると、
// 商品一覧の表示処理 $this->lfDispProductsList($arrCategory_id[0], $_GET['name'], $this->disp_number, $_POST['orderby']);
という部分があるわけなんですが、なんと別のメソッドでデータを取得してそのままそのメソッドで$this->arrProductsに代入しているという。。。普通なら関数でクエリだけ作ってprocess()に戻して、そこでデータ取得、$this->arrProductsに代入という手順を踏むと思うんですがいかがでしょう?あちこちのメソッドでviewに渡すパラメータを定義するってスイーツ(笑)な僕でもちょっと違和感です。
とはいえ、無料で使わせていただいている身。文句なんか言っちゃいけません。今のはただのボヤキということで。
気を取り直してlfDispProductsList()メソッド*1 を見てみましょう。
ほら、クエリ書いてる。
ソースを読むと、取得するフィールドを追加する場合は、switch($orderby)文の中の$colにそれぞれフィールドを追加して、$formで定義されているビューも同様にフィールドを追加してやればいいことがわかりますね。
最後の方で直接$this->arrProductsに商品一覧を代入しているのでprocessメソッドは変更しなくていいこともわかりますね。
それでは、カスタマイズの手順にすすみます。
カスタマイズ方法
LC_Page_Products_list_ExクラスのIfDispProductsListメソッドを編集
//価格順 case 'price': $col = "DISTINCT price02_min, product_id, product_code_min, product_code_max," . " name, comment1, comment2, comment3," . " main_list_comment, main_image, main_list_image," . " price01_min, price01_max, price02_max," . " stock_min, stock_max, stock_unlimited_min, stock_unlimited_max," . " point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee," . " status, product_flag, create_date, del_flg, postage_flag"; $from = "vw_products_allclass AS T1"; $order = "price02_min, product_id"; break; //新着順 case 'date': $col = "DISTINCT create_date, product_id, product_code_min, product_code_max," . " name, comment1, comment2, comment3," . " main_list_comment, main_image, main_list_image," . " price01_min, price01_max, price02_min, price02_max," . " stock_min, stock_max, stock_unlimited_min, stock_unlimited_max," . " point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee," . " status, product_flag, del_flg, postage_flag"; $from = "vw_products_allclass AS T1"; $order = "create_date DESC, product_id"; break; default: $col = "DISTINCT T1.product_id, product_code_min, product_code_max," . " price01_min, price01_max, price02_min, price02_max," . " stock_min, stock_max, stock_unlimited_min," . " stock_unlimited_max, del_flg, status, name, comment1," . " comment2, comment3, main_list_comment, main_image," . " main_list_image, product_flag, deliv_date_id, sale_limit," . " point_rate, sale_unlimited, create_date, deliv_fee, " . " T4.product_rank, T4.category_rank, postage_flag"; $from = "vw_products_allclass AS T1" . " JOIN (" . " SELECT max(T3.rank) AS category_rank," . " max(T2.rank) AS product_rank," . " T2.product_id" . " FROM dtb_product_categories T2" . " JOIN dtb_category T3 USING (category_id)" . " GROUP BY product_id) AS T4 USING (product_id)"; $order = "T4.category_rank DESC, T4.product_rank DESC"; break; }
switch文の条件それぞれの$colに追加したいフィールドを追加してください。僕の場合はpostage_flagですね。
SC_DB_DBFactory_MYSQL_EXクラスのviewToSubQueryメソッドのvw_products_allclassを編集する
今回商品一覧に追加したpostage_flagは、前回新たなフィールドとして追加したときにvw_products_allclassにも追加しておいたので、僕はやる必要が無いのですが、vw_products_allclassの取得フィールドに含まれていない場合はこちらに追加してください。
「SELECT」から「FROM」の間に追加したいフィールドを記載すればOKです。
その際「FROM」以降で定義されたフィールドしか記載できないという点に注意してください。
わからない点、間違いのご指摘、アドバイスなどありましたら→のチャットかコメントいただけると幸いです。
- 例によって親クラスを見てください。というか、カスタマイズのためにどこを編集すればいいのか調べるときは親クラスを見てやったほうがいいね。こういうことがあるから。編集するときは子クラスを編集するようにすればいいんだもんね。 [↩]