Virtuemartカテゴリページに表示される製品の順序を変更する必要があります。ファイルmodels/product.php
およびtables/products.php
は複雑すぎて変更を加えることができません。したがって、views/category/default.php
(より正確にはtemplates/my_template/html/com_virtuemart/category/default.php
の場合)で次のように直接SQL要求を使用することにしました。
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('a.virtuemart_product_id');
$query->from('#__virtuemart_product_categories AS a');
$query->where($db->quoteName('virtuemart_category_id')." = ".$db->quote($this->category->virtuemart_category_id));
$query->select('b.product_in_stock, c.product_price');
$query->join('LEFT', '#__virtuemart_products AS b ON b.virtuemart_product_id = a.virtuemart_product_id');
$query->join('LEFT', '#__virtuemart_product_prices AS c ON c.virtuemart_product_id = a.virtuemart_product_id');
$query->order('b.product_in_stock DESC, c.product_price DESC');
$db->setQuery($query);
$sortedProducts = $db->loadObjectList();
...
一部のビューまたはテンプレートで直接SQL要求を使用する必要があるのは、これだけではありません。
しかし、そのような直接的な方法はどの程度安全であり、それを可能な限り最大限に保護する方法ですか?
JoomlaはMVC設計パターンに基づいて構築されているため、ビューからデータベースにクエリを実行することはお勧めできません。しかし、あなたのシナリオで、いくつかの代替案を考えてみましょう:
現在のソリューションを検討するには:
結論
作業が概念実証である場合は、現在のソリューションを使用してください。これがライブWebサイトである場合は、少し時間をかけてクエリをコーディングするヘルパーまたはモデルを作成してください。柔軟性と再利用性が得られ(2つのビューが同じデータを必要とする場合は、コードを複製する必要はありません)、将来の時間を節約できます。