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

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

 

Комментарии   

#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:

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