Добавить количество товаров в модуль категорий виртуемарт можно в шаблоне модуля.
Добавим, например, вывод количества товаров в категориях в раскладку 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();
}
?>