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 и будет вам счастье.