Бывает, что в модуле VirtueMart Products (в стандартном модуле VirtueMart) надо вывести товары не с такой сортировкой и фильтрацией, какая предложена разработчиками, а со своей, специфичной.
У меня, например, встала задача вывести в модуле товары, у которых заполнено определенное настраиваемое поле (хиты продаж помечаются настраиваемым полем, строка).
Сделал небольшой хак, решил поделиться (хотя бы и самому не забыть):
1) Правим файл
modules/mod_virtuemart_product/mod_virtuemart_product.xmlВ блок опции
<field name="product_group"добавляем строчку
<option value="hit">Хиты продаж</option>(можно написать языковую переменную, если хочется)
Итого секция выглядит так:
<field
name="product_group"
type="list"
default="featured"
label="MOD_VIRTUEMART_PRODUCT_DISPLAY"
description="MOD_VIRTUEMART_PRODUCT_DISPLAY_DESC"
>
<option value="featured">MOD_VIRTUEMART_PRODUCT_FEATURED_PRODUCTS</option>
<option value="discontinued">MOD_VIRTUEMART_PRODUCT_DISCONTINUED_PRODUCTS</option>
<option value="latest">MOD_VIRTUEMART_PRODUCT_LATEST_PRODUCTS</option>
<option value="random">MOD_VIRTUEMART_PRODUCT_RANDOM_PRODUCTS</option>
<option value="topten">MOD_VIRTUEMART_PRODUCT_BEST_SALES</option>
<option value="recent">MOD_VIRTUEMART_PRODUCT_RECENT_PRODUCTS</option>
<option value="hit">Хиты продаж</option>
</field>
На всякий случай делаем копию этого файла, немного переименовав для себя. После обновления VirtueMart эта копия не затрется, из неё можно будет снова внести правки в обновленный стандартный mod_virtuemart_product.xml.
2) Правим файл
administrator/components/com_virtuemart/models/product.phpИщем в коде
switch ($group)В этот свитч добавляем кейс (я вставил предпоследним):
case 'hit':
$this->searchcustoms = true;
$joinCustom = true;
$where[] = 'pf.`virtuemart_custom_id`="33" ';
$orderBy = 'ORDER BY RAND()';
break;Соответственно, 33 - меняем на id нужного настраиваемого поля (можно посмотреть в админке).
Итого switch становится таким:
switch ($group) {
case 'featured':
$where[] = 'p.`product_special`="1" ';
$orderBy = 'ORDER BY RAND()';
break;
case 'discontinued':
$where[] = 'p.`product_discontinued`="1" ';
if($isSite){
$orderBy = 'ORDER BY RAND()';
}
break;
case 'latest':
$orderBy = 'ORDER BY p.`' . $latest_products_orderBy . '` DESC, p.`virtuemart_product_id` DESC';
break;
case 'random':
$orderBy = 'ORDER BY RAND() '; //LIMIT 0, '.(int)$nbrReturnProducts ; //TODO set limit LIMIT 0, '.(int)$nbrReturnProducts;
break;
case 'topten':
$orderBy = 'ORDER BY p.`product_sales` DESC, p.`virtuemart_product_id` DESC'; //LIMIT 0, '.(int)$nbrReturnProducts; //TODO set limitLIMIT 0, '.(int)$nbrReturnProducts;
$joinPrice = true;
$where[] = 'pp.`product_price`>"0.001" ';
break;
case 'hit':
$this->searchcustoms = true;
$joinCustom = true;
$where[] = 'pf.`virtuemart_custom_id`="33" ';
$orderBy = 'ORDER BY RAND()';
break;
case 'recent':
$rIds = self::getRecentProductIds($nbrReturnProducts); // get recent viewed from browser session
return $rIds;
}
Тоже делаем копию правленного файла на случай вернуть правки после обновления VirtueMart.
3) Идём в админке в настройки Модуля. Выбираем нашу добавленную Опцию
Хиты продаж.
Если всё ОК, то наслаждаемся результатом
Если кто предложит решение поинтересней, буду только рад )