Добавить количество товаров в модуль категорий виртуемарт можно в шаблоне модуля.

Добавим, например, вывод количества товаров в категориях в раскладку 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, &#39;class="mod-linkcountprod"&#39;); ?>
<?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(&#39;COUNT(a.virtuemart_product_id)&#39;));

$query->from(&#39;#__virtuemart_product_categories AS a&#39;);
$query->join(&#39;INNER&#39;, &#39;#__virtuemart_products AS b ON (a.virtuemart_product_id = b.virtuemart_product_id)&#39;);
$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 = &#39;&#39;;
foreach ($arrParentCategories as &$kat){
$inKats .= &#39;, &#39; . $kat;
}
 
$where .= $inKats . &#39;)&#39;;

$query = $db->getQuery(true);
 
$query->select(array(&#39;COUNT(a.virtuemart_product_id)&#39;));

$query->from(&#39;#__virtuemart_product_categories AS a&#39;);
$query->join(&#39;INNER&#39;, &#39;#__virtuemart_products AS b ON (a.virtuemart_product_id = b.virtuemart_product_id)&#39;);
$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(&#39;`category_child_id`&#39;));

$query->from(&#39;`#__virtuemart_category_categories`&#39;);
$query->where(&#39;`category_parent_id`="&#39;.$vm_catid.&#39;"&#39;);

// 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(&#39;_JEXEC&#39;) or die(&#39;Restricted access&#39;);
//JHTML::stylesheet ( &#39;menucss.css&#39;, &#39;modules/mod_virtuemart_category/css/&#39;, false );
 
?>
 
<ul class="menu<?php echo $class_sfx ?>" >
<?php foreach ($categories as $category) {
$active_menu = &#39;&#39;;
$caturl = JRoute::_(&#39;index.php?option=com_virtuemart&view=category&virtuemart_category_id=&#39;.$category->virtuemart_category_id);
$cattext = $category->category_name;
//if ($active_category_id == $category->virtuemart_category_id) $active_menu = &#39;class="active"&#39;;
if (in_array( $category->virtuemart_category_id, $parentCategories)) $active_menu = &#39;class="active"&#39;;

?>
 
<?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::_(&#39;index.php?option=com_virtuemart&view=category&virtuemart_category_id=&#39;.$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(&#39;`category_child_id`&#39;));

$query->from(&#39;`#__virtuemart_category_categories`&#39;);
$query->where(&#39;`category_parent_id`="&#39;.$vm_catid.&#39;"&#39;);

// 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 = &#39;&#39;;
foreach ($arrParentCategories as &$kat){
$inKats .= &#39;, &#39; . $kat;
}
 
$where .= $inKats . &#39;)&#39;;

$query = $db->getQuery(true);
 
$query->select(array(&#39;COUNT(a.virtuemart_product_id)&#39;));

$query->from(&#39;#__virtuemart_product_categories AS a&#39;);
$query->join(&#39;INNER&#39;, &#39;#__virtuemart_products AS b ON (a.virtuemart_product_id = b.virtuemart_product_id)&#39;);
$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();
}
?>

 

Комментарии   

#5 Николай 15.03.2015 23:40
Для подсчета количества в категориях 3-го уровня, нужно получить сначала эти категории в цикле
foreach ($category->chi lds as $child)

Получить их можно также как получали $category->chil ds - но только нужно скопировать код в данный цикл, копируем из основного файла модуля.

Потом добавляем цикл уже по категориям 3-го уровня и вызываем функцию подсчета количества товаров.

Примерно так..
#4 Андрей 15.03.2015 07:48
Здравствуйте!
Все работает, а как добавить 3 уровень вложенности категорий с суммированием.
#3 Николай 15.09.2014 13:06
Цитирую Стас:
Неплохое решение, частично помогло мне. а не знаете как вывести не только количество товаров в данной категории, а сумму всех товаров в этой категории включая и товары в подкатегориях. данное решение такую функцию не тянет :sad:

Добавил вариант для суммирования товаров в подкатегориях :-)
#2 :lol: 14.09.2014 21:19
:lol:
#1 Стас 14.09.2014 20:38
Неплохое решение, частично помогло мне. а не знаете как вывести не только количество товаров в данной категории, а сумму всех товаров в этой категории включая и товары в подкатегориях. данное решение такую функцию не тянет :sad:

Чтобы сделать комментарий, нужно авторизоваться на сайте!