В стандартном функционале VirtueMart самые популярные (покупаемые) товары считаются по принципу "выбрать товары отсортировав по количеству
подтвержденных покупок"
Меня это не устроило - возникла задача сделать вывод без учета подтверждения - т.е. если товар кто-то купил, то он автоматом считается в топ.
Код отвечающий за эту выборку находится в administrator\components\com_virtuemart\models\product.php
case 'topten':
$orderBy = ' ORDER BY p.`product_sales` '; //LIMIT 0, '.(int)$nbrReturnProducts; //TODO set limitLIMIT 0, '.(int)$nbrReturnProducts;
$where[] = 'pp.`product_price`>"0.0" ';
$this->filter_order_Dir = 'DESC';
break;
изменяем условие на
case 'topten';
$joinedTables .= ' JOIN `#__virtuemart_product_ordercount` AS po using (`virtuemart_product_id`)';
$orderBy = ' ORDER BY po.`orders_count` ';
$where[] = 'pp.`product_price`>"0.0" ';
$this->filter_order_Dir = 'DESC';
break;
и переносим кусок кода
if ($joinLang) {
$select = ' l.`virtuemart_product_id` FROM `#__virtuemart_products_' . VMLANG . '` as l';
$joinedTables = ' JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`)';
}
else {
$select = ' p.`virtuemart_product_id` FROM `#__virtuemart_products` as p';
$joinedTables = '';
}
выше нашей выборки, т.е. например перед
switch ($this->filter_order) {Ну и создаем вьюшку которая хранит ID товара и кол-во его покупок. Кол-во заказанных единиц товара я не учитываю - вдруг кто-то купит 1000 каких-нибудь мелких гаек, и товар жирно вылезет в топ)
CREATE VIEW `ПРЕФИКС_virtuemart_product_ordercount` AS (select `vp`.`virtuemart_product_id` AS `virtuemart_product_id`,count(`vo`.`virtuemart_product_id`) AS `orders_count` from (`ПРЕФИКС_virtuemart_products` `vp` join `ПРЕФИКС_virtuemart_order_items` `vo`) where (`vo`.`virtuemart_product_id` = `vp`.`virtuemart_product_id`) group by `vo`.`virtuemart_product_id` order by count(`vo`.`virtuemart_product_id`) desc);
Решение может и не супер виртуозное, зато редактируем только 1 файл.
Как вариант - можно поставить в базе триггер на добавление товара в #__virtuemart_order_items который бы изменял значение sales_count в #__virtuemart_products , но тогда придется искать место где при обновлении статуса заказа этот счетчик меняется, и там отключать этот апдейт.
А так - в #__virtuemart_products имеем кол-во подтвержденных продаж, в #__virtuemart_product_ordercount - кол-во всех продаж, подтвержденных и не подтвержденных)
Пишу больше для того чтоб не забыть и поделиться - вдруг кому пригодится.