これも開発コミュニティに挙がっていたネタ。ちょっとヒントをご提供したら、自力解決できたみたいで、良かった。
全く勘でアドバイスしてたので、実際にやってみました。
元々の default: の定義をコメントアウトして、新しい記述を一行加えただけです。
data/class/pages/products/LC_Page_Products_List.php の 268L付近
default: /* if (strlen($searchCondition["where_category"]) >= 1) { $dtb_product_categories = "(SELECT * FROM dtb_product_categories WHERE ".$searchCondition["where_category"].")"; $arrval_order = array_merge($searchCondition['arrvalCategory'], $searchCondition['arrvalCategory']); } else { $dtb_product_categories = 'dtb_product_categories'; } $order = <<< __EOS__ ( SELECT T3.rank FROM $dtb_product_categories T2 JOIN dtb_category T3 USING (category_id) WHERE T2.product_id = alldtl.product_id ORDER BY T3.rank DESC, T2.rank DESC LIMIT 1 ) DESC ,( SELECT T2.rank FROM $dtb_product_categories T2 JOIN dtb_category T3 USING (category_id) WHERE T2.product_id = alldtl.product_id ORDER BY T3.rank DESC, T2.rank DESC LIMIT 1 ) DESC ,product_id __EOS__; */ $objProduct->setProductsOrder('product_code', 'dtb_products_class', 'ASC'); $objQuery->setOrder($order); break;
自分の当初のアドバイス通りにやったらあっさりできたんだけど、ふと疑問に思ったのが規格のある商品のケース。
規格商品の場合は、どういうロジックで並べ替えが行われてるのかなと見てみたら、
data/class/SC_Product.php の findProductIdsOrder() に手がかりがありました。
$order = <<< __EOS__ ( SELECT $o_col FROM $o_table as T2 WHERE T2.product_id = alldtl.product_id ORDER BY T2.$o_col $o_order LIMIT 1 ) $o_order, product_id __EOS__;
ここで、$order を定義していますが、今回のケースで言えば、
$order = ” ( SELECT product_code FROM dtb_products_class as T2 WHERE T2.product_id = alldtl.product_id ORDER BY T2.product_code ASC LIMIT 1 ) ASC, product_id”
になります。
規格がある商品の場合、それらの product_code を昇順に並べたうち、1番上のものを抽出して、並べ替え条件に使っているようです。
というわけで、規格商品の場合も配慮されているようで安心しました。
ピンバック: EC-CUBE NEWS | EC-CUBEに関するニュースやブログの最新情報をお届けします