Добавить количество товаров в модуль категорий виртуемарт можно в шаблоне модуля.
Добавим, например, вывод количества товаров в категориях в раскладку all.php
В начале файла устанавливаем подключение к базе данных:
// Get a db connection. $db = JFactory::getDbo();
Теперь в цикл по категориям добавим запрос на подсчет товаров в категории:
// Create a new query object. $query = $db->getQuery(true); // Select all records from the user profile table where key begins with "custom.". // Order it by the ordering field. $query->select(array('COUNT(a.virtuemart_product_id)')); $query->from('#__virtuemart_product_categories AS a'); $query->join('INNER', '#__virtuemart_products AS b ON (a.virtuemart_product_id = b.virtuemart_product_id)'); $query->where("a.virtuemart_category_id=$category->virtuemart_category_id AND b.published=1"); // Reset the query using our newly populated query object. $db->setQuery($query); // Load the results as a list of stdClass objects. $count_prod = $db->loadResult();
Теперь выводим количество товаров по категориям, например, так:
<?php $coun_link = JHTML::link($caturl, $count_prod, 'class="mod-linkcountprod"'); ?> <?php echo JHTML::link($caturl, $cattext) . " ($coun_link)"; ?>
Всего товаров в магазине можно посчитать так:
// Create a new query object. $query = $db->getQuery(true); // Select all records from the user profile table where key begins with "custom.". // Order it by the ordering field. $query->select(array('COUNT(a.virtuemart_product_id)')); $query->from('#__virtuemart_product_categories AS a'); $query->join('INNER', '#__virtuemart_products AS b ON (a.virtuemart_product_id = b.virtuemart_product_id)'); $query->where("b.published=1"); // Reset the query using our newly populated query object. $db->setQuery($query); // Load the results as a list of stdClass objects. $all_prod = $db->loadResult();
В комментариях возник вопрос, как посчитать товары во всех подкатегориях. Я набрал в поиске "virtuemart получить подкатегории" и нашел такую статью на эту тему http://kitoraga.com/blog/vyvodim-tovary-v-virtuemart-2-iz-kategori-i-podkategorij-odnim-spiskom.html В этой статье для получения подкатегорий используется функция с рекурсией. Что ж пусть так и будет..)
Для того, чтобы посчитать количество товаров в категории и ее подкатегориях, нужно сначала получить список id подкатегорий, а потом сделать запрос с sql функцией COUNT для подсчета товаров в этих категориях.
Для получения подкатегорий добавим в конец раскладки модуля (а мы экспериментируем в all.php) функцию
myCategoriesCount():
<?php function myCategoriesCount($category){ $db = JFactory::getDBO(); $arrParentCategories = array(); myGetParentCategories($category->virtuemart_category_id, $arrParentCategories); $where = "b.published=1 AND a.virtuemart_category_id IN($category->virtuemart_category_id"; $inKats = ''; foreach ($arrParentCategories as &$kat){ $inKats .= ', ' . $kat; } $where .= $inKats . ')'; $query = $db->getQuery(true); $query->select(array('COUNT(a.virtuemart_product_id)')); $query->from('#__virtuemart_product_categories AS a'); $query->join('INNER', '#__virtuemart_products AS b ON (a.virtuemart_product_id = b.virtuemart_product_id)'); $query->where($where); // Reset the query using our newly populated query object. $db->setQuery($query); // Load the results as a list of stdClass objects. return $count_prod = $db->loadResult(); } ?>
Также тот код, который в начале этого материала, тоже оформим в виде функции:
<?php function myGetParentCategories($vm_catid, &$arrParentCategories){ $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select(array('`category_child_id`')); $query->from('`#__virtuemart_category_categories`'); $query->where('`category_parent_id`="'.$vm_catid.'"'); // Reset the query using our newly populated query object. $db->setQuery($query); // Load the results as a list of stdClass objects. $rows = $db->loadRowList(); if (empty($rows)) { return; } else { foreach($rows as $row) { array_push($arrParentCategories, $row[0]); $kat = $row[0]; myGetParentCategories($kat, $arrParentCategories); } } } ?>
Для подсчета товаров в категориях используем теперь код:
<?php $count_prod = myCategoriesCount($category); ?>
И для подкатегорий:
$count_prod = myCategoriesCount($child);
Весь код для all.php в результате добавлений, получился такой:
<?php // no direct access defined('_JEXEC') or die('Restricted access'); //JHTML::stylesheet ( 'menucss.css', 'modules/mod_virtuemart_category/css/', false ); ?> <ul class="menu<?php echo $class_sfx ?>" > <?php foreach ($categories as $category) { $active_menu = ''; $caturl = JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id='.$category->virtuemart_category_id); $cattext = $category->category_name; //if ($active_category_id == $category->virtuemart_category_id) $active_menu = 'class="active"'; if (in_array( $category->virtuemart_category_id, $parentCategories)) $active_menu = 'class="active"'; ?> <?php $count_prod = myCategoriesCount($category); ?> <li <?php echo $active_menu ?>> <div> <?php //echo JHTML::link($caturl, $cattext); ?> <?php echo JHTML::link($caturl, $cattext . " ($count_prod)"); ?> </div> <?php if ($category->childs ) { ?> <ul class="menu<?php echo $class_sfx; ?>"> <?php foreach ($category->childs as $child) { $count_prod = myCategoriesCount($child); $caturl = JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id='.$child->virtuemart_category_id); $cattext = $child->category_name; ?> <li> <div ><?php echo JHTML::link($caturl, $cattext . " ($count_prod)"); //echo JHTML::link($caturl, $cattext); ?></div> </li> <?php } ?> </ul> <?php } ?> </li> <?php } ?> </ul> <?php function myGetParentCategories($vm_catid, &$arrParentCategories){ $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select(array('`category_child_id`')); $query->from('`#__virtuemart_category_categories`'); $query->where('`category_parent_id`="'.$vm_catid.'"'); // Reset the query using our newly populated query object. $db->setQuery($query); // Load the results as a list of stdClass objects. $rows = $db->loadRowList(); if (empty($rows)) { return; } else { foreach($rows as $row) { array_push($arrParentCategories, $row[0]); $kat = $row[0]; myGetParentCategories($kat, $arrParentCategories); } } } ?> <?php function myCategoriesCount($category){ $db = JFactory::getDBO(); $arrParentCategories = array(); myGetParentCategories($category->virtuemart_category_id, $arrParentCategories); $where = "b.published=1 AND a.virtuemart_category_id IN($category->virtuemart_category_id"; $inKats = ''; foreach ($arrParentCategories as &$kat){ $inKats .= ', ' . $kat; } $where .= $inKats . ')'; $query = $db->getQuery(true); $query->select(array('COUNT(a.virtuemart_product_id)')); $query->from('#__virtuemart_product_categories AS a'); $query->join('INNER', '#__virtuemart_products AS b ON (a.virtuemart_product_id = b.virtuemart_product_id)'); $query->where($where); // Reset the query using our newly populated query object. $db->setQuery($query); // Load the results as a list of stdClass objects. return $count_prod = $db->loadResult(); } ?>
Комментарии
foreach ($category->chi lds as $child)
Получить их можно также как получали $category->chil ds - но только нужно скопировать код в данный цикл, копируем из основного файла модуля.
Потом добавляем цикл уже по категориям 3-го уровня и вызываем функцию подсчета количества товаров.
Примерно так..
Все работает, а как добавить 3 уровень вложенности категорий с суммированием.
Добавил вариант для суммирования товаров в подкатегориях
RSS лента комментариев этой записи