これも開発コミュニティに挙がっていたネタ。ちょっとヒントをご提供したら、自力解決できたみたいで、良かった。
全く勘でアドバイスしてたので、実際にやってみました。
元々の 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に関するニュースやブログの最新情報をお届けします