VirtueMart 3: Делаем вывод товаров из подкатегорий в родительскую категорию или вывод товаров вложенных категорий
Для начала вам нужно найти category.php, который размещен по адресу: administrator/components/com_virtuemart/models/
Дальше открываем его для редактирования, например в блокноте. Ищем строку: class VirtueMartModelCategory extends VmModel {
Эта строка должна быть почти с самого верху файла. Вам нужно вставить в этот класс функцию, которая вернет нам массив подкатегорий. Копируем следующее и вставляем после «{»:
function GetTreeCatArray(&$categories, $parent_id = 0) {
$db = JFactory::getDBO();
$query = 'SELECT `category_child_id` FROM `#__virtuemart_category_categories` WHERE `category_parent_id`="'.$parent_id.'"';
$db->setQuery($query);
$db->query();
if (empty($categories) && ($parent_id != 0))
array_push($categories, $parent_id);
$rows = $db->loadRowList();
if (empty($rows)) {
return;
} else {
foreach($rows as $row) {
array_push($categories, $row[0]);
$this->GetTreeCatArray($categories, $row[0]);
}
}
}
Но это еще не всё, теперь Вам нужно вывести все продукты из подкатегории. Для этого в той папке, в которой вы уже искали файл категории (/administrator/components/com_virtuemart/models/) нужно найти другой файл product.php. Открыть его для редактирования и найти строку:
$where[] = ' `pc`.`virtuemart_category_id` = ' . $virtuemart_category_id;
Закомментируйте её или удалите. И добавьте вместо неё:
$categories = array();
VmModel::getModel('category')->GetTreeCatArray($categories, $virtuemart_category_id);
$where[] = ' `pc`.`virtuemart_category_id` in (\'' . implode('\',\'',$categories).'\')';
Сохраните все изменения и перейдите в категорию, которая содержит категории, которые содержат продукты, и вы увидите, что товары таки выводятся из всех вложенных категорий.
Вот тут описано, как это сделать правильно, чтобы хак не затерся при обновлении.
В Virtuemart 3.0.14 это уже практически сделанно разработчиками, только почему то не до конца )))
файл /administrator/components/com_virtuemart/models/product.php
$joinCategory = TRUE;
if(true){
$where[] = ' `pc`.`virtuemart_category_id` = ' . $virtuemart_category_id;
} else {
/*GJC add subcat products*/
$catmodel = VmModel::getModel ('category');
$childcats = $catmodel->getChildCategoryList(1, $virtuemart_category_id,null, null, true);
$cats = $virtuemart_category_id;
foreach($childcats as $childcat){
$cats .= ','.$childcat->virtuemart_category_id;
}
$joinCategory = TRUE;
$where[] = ' `pc`.`virtuemart_category_id` IN ('.$cats.') ';
}
В этой конструкции надо true заменить на false и будет вам счастье.