Joomla 4. Компонент K2 и форк K2ForJ4 (18 янв 2024)

Если вас, как и меня, достало выслушивать (вычитывать) бесконечные обещания разработчика K2 опубликовать версию компонента K2 под Joomla 4 (без чего невозможно реализовать апгрейд from Joomla 3 to Joomla 4) - воспользуйтесь форком K2ForJ4. Который в данный момент установлен и без каких-либо проблем работает на этом веб-сайте.

Вывод категорий в virtuemart 2.0.2b

Больше
10 года 11 мес. назад #1 от Sergey84
Sergey84 создал тему: Вывод категорий в virtuemart 2.0.2b
Приветствую!

1. Такая проблема возникла. Используя стандартный модуль вывода категорий (слева), он почему-то отображает только 2 уровня. Например, Женская одежда - Верхняя одежда. И все. Дальше никак. Третьего уровня не видно, а у меня в подкатегории Верхняя одежда еще несколько подкатегорий (пальто, шубы, куртки и пуховики). Выглядеть должно так:
Женская одежда
-Верхняя одежда
--Пальто
--Шубы
--Куртки и пуховики

2. И вторая проблема. При нажатии, например, на категорию Женская одежда должны появиться все подкатегории 2 уровня с изображениями в поле контента. А поле почему-то пустое.

Очень много модулей вывода категорий перепробовал. Ничего не помогло.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Dev banner 2
Больше
10 года 11 мес. назад #2 от serge
serge ответил в теме Вывод категорий в virtuemart 2.0.2b
Привет, тезка.

Не вы один жалуетесь на этот недостаток второго VirtueMart. Попробуйте такое решение, оно описано на англоязычном форуме марта, да и не только там. Хак предоставляет возможность вывода всех товаров из категории и из ее подкатегорий. Учтите, имеется в виду принадлежность товара только одной категории, в ином случае хак способен отработать некорректно.


Находим

Code:
/administrator/components/com_virtuemart/models/product.php

в котором производим следующие манипуляции:

1. Добавляем функцию в класс VirtueMartModelProduct, чтобы получить массив подкатегорий данной категории:

Code:
function untreeCat($vm_catid, &$ccont){ $db = JFactory::getDBO(); $query = 'SELECT `category_child_id` FROM `#__virtuemart_category_categories` WHERE `category_parent_id`="'.$vm_catid.'"'; $db->setQuery($query); $db->query(); $rows = $db->loadRowList(); if (empty($rows)) { return; } else { foreach($rows as $row) { array_push($ccont, $row[0]); $kat = $row[0]; $this->untreeCat($kat, $ccont); } } }

Разместить код необходимо внутри класса VirtueMartModelProduct.

2. Далее находим участок кода, ответственный за формирование условия принадлежности товаров данной категории (строка примерно 306 с учетом того, что уже сделали в п.1):

Code:
if ($virtuemart_category_id > 0) { $joinCategory = TRUE; $where[] = ' `#__virtuemart_product_categories`.`virtuemart_category_id` = ' . $virtuemart_category_id; }

и меняем на этот код:

Code:
if ($virtuemart_category_id > 0) { $joinCategory = true ; $catscont = array(); $this->untreeCat($virtuemart_category_id, $catscont); $qkat = ' `#__virtuemart_product_categories`.`virtuemart_category_id` IN('.$virtuemart_category_id; foreach ($catscont as &$kat){ $qkat .= ', '.$kat; } $qkat .= ')'; $where[] = $qkat; }

Примечание
Начиная с VM 2.0.18a имя таблицы '#__virtuemart_ product_categor ies' заменено алиасом 'pc', иных изменений, похоже, нет. Т.е. просто вместо '#__virtuemart_ product_categor ies' вставляем 'pc'.


3. Находим участок кода, отвечающий за формирование SQL-запроса для получения списка производителей для фильтра (это ориентировочно 1723 строка):

Code:
if ($virtuemart_category_id) { $query .= ' AND c.`virtuemart_category_id` =' . (int)$virtuemart_category_id; }

и меняем на этот код:

Code:
if ($virtuemart_category_id) { $catscont = array(); $this->untreeCat($virtuemart_category_id, $catscont); $qkat = ' AND c.`virtuemart_category_id` IN('.$virtuemart_category_id; foreach ($catscont as &$kat){ $qkat .= ', '.$kat; } $qkat .= ')'; $query .= $qkat; }


Теперь все товары из категории и подкатегорий отображаются одним списком, а также отображается список производителей в фильтре по производителю.



Дальнейшее развитие темы (если нужно). Выводим названия подкатегорий для товаров в списке категории. Для этого предпринимаем следующие шаги:


1. Сортировка товаров по категориям. Для этого в файле

Code:
/administrator/components/com_virtuemart/models/product.php

находим код, определяющий порядок сортировки товаров (это примерно 376 строка):

Code:
// special orders case switch ($this->filter_order) {

Далее следуют варианты условия, для примера возьмем случай сортировки по категории:

Code:
case 'category_name': $orderBy = ' ORDER BY `product_name` '; $joinCategory = TRUE; break;

Дополняем следующим образом:

Code:
case 'category_name': $orderBy = ' ORDER BY `category_name`,`product_name` '; $joinCategory = TRUE; break;

Мы добились, что товары сортируются сначала по имени категории, затем по имени товара. Аналогично и для других вариантов (их выбирает пользователь в форме выбора сортировки, если она включена, а также назначается сортировка по умолчанию).

2. Теперь необходимо получить правильные имена категорий для товаров,т.к. сейчас для товаров назначается имя текущей категории, которая как бы у всех общая. Для этого в том же файле ищем функцию

Code:
getProductSingle

в которой находим

Code:
$catTable = $this->getTable ('categories'); $catTable->load ($virtuemart_category_id);

Заменяем последнюю строку на

Code:
$catTable->load ($product->virtuemart_category_id);

Тем самым получаем в $product->category_name имя категории товара.

3. Теперь нам только лишь осталось использовать полученные поля имен категорий в шаблоне вывода товаров категории ../html/com_virtuemart/category/default.php.

Находим участок кода, определяющий цикл для вывода товаров категории:

Code:
// Start the Output foreach ($this->products as $product) { // Show the horizontal seperator if ($iBrowseCol == 1 && $iBrowseProduct > $BrowseProducts_per_row) { ...

Его можно дополнить, например, вот эдак для вывода названий подкатегорий (это только в качестве примера, т.к. многое зависит от верстки шаблона):


Code:
// Start the Output $category_name = $this->products[0]->category_name; echo $category_name; foreach ($this->products as $product) { if ($product->category_name!=$category_name) { $category_name = $product->category_name; echo '<div class="clear">'.$category_name.'</div>'; $iBrowseProduct = 1; echo '<div class="horizontal-separator clear"></div>'; } // Show the horizontal seperator if ($iBrowseCol == 1 && $iBrowseProduct > $BrowseProducts_per_row) { ...

Таким образом определен момент смены имени категории. И - выводим в этом случае новую категорию.


И еще далее. Вывод заголовков покатегорий в виде ссылок на категории.

В этом случае вывод подкатегорий организуем вот так:

Code:
// Start the Output $category_name = $this->products[0]->category_name; $link = JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id='.$this->products[0]->virtuemart_category_id); echo '<div class="clear"><a href="'.$link.'">'.$category_name.'</a></div>'; foreach ($this->products as $product) { if ($product->category_name!=$category_name) { $category_name = $product->category_name; $link = JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id='.$product->virtuemart_category_id); echo '<div class="clear"><a href="'.$link.'">'.$category_name.'</a></div>'; $iBrowseProduct = 1; echo '<div class="horizontal-separator clear"></div>'; } // Show the horizontal seperator if ($iBrowseCol == 1 && $iBrowseProduct > $BrowseProducts_per_row) { ...

А я смогу! - А поглядим! - А я упрямый!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 11 мес. назад #3 от Sergey84
Sergey84 ответил в теме Вывод категорий в virtuemart 2.0.2b
Сергей, привет,

выполнил первые три пункта, как ты и написал. Выскочила ошибка -

Parse error: syntax error, unexpected T_PUBLIC in Z:\home\china-sbor-shop.ru\www\administrator\components\com_virtuemart\models\product.php on line 554

Дальше пока делать не стал.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 11 мес. назад #4 от serge
serge ответил в теме Вывод категорий в virtuemart 2.0.2b

Sergey84 пишет: Выскочила ошибка - Parse error: syntax error...


выскочила и выскочила, это не самое главное. Результата удалось добиться? А с parse error дело поправимое.

А я смогу! - А поглядим! - А я упрямый!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 11 мес. назад #5 от Sergey84
Sergey84 ответил в теме Вывод категорий в virtuemart 2.0.2b
не удалось добиться, т.к. вместо сайта только белый экран с этой ошибкой.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 11 мес. назад - 10 года 11 мес. назад #6 от Aleksej
Aleksej ответил в теме Вывод категорий в virtuemart 2.0.2b

serge пишет: Попробуйте такое решение, оно описано на англоязычном форуме марта, да и не только там.

Sergey84 пишет: не удалось добиться, т.к. вместо сайта только белый экран с этой ошибкой.


Я попробовал, для интереса. Пробовал (описанные 3 шага) спервоначалу на старом VM - 2.0.18a, затем обновил версию до актуальной 2.0.2b. С подкатегориями особенно не заморачивался - нет времени, да и задачки у всех разные - но могу засвидетельствовать, что никакого белого экрана нет и в помине, и на старом Марте, и на новом. Думаю, хак вполне должен работать.
Последнее редактирование: 10 года 11 мес. назад пользователем Aleksej.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 11 мес. назад #7 от Sergey84
Sergey84 ответил в теме Вывод категорий в virtuemart 2.0.2b
Все получилось, спасибо. Но я нашел другой способ. Скачал модуль вывода категорий. Вроде Accordion menu. Теперь все норм.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 11 мес. назад #8 от serge
serge ответил в теме Вывод категорий в virtuemart 2.0.2b

Sergey84 пишет: Но я нашел другой способ. Скачал модуль вывода категорий. Вроде Accordion menu.


прикольно, а откуда скачал? Ссылку в студию.

А я смогу! - А поглядим! - А я упрямый!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 10 мес. назад #9 от Sergey84
Sergey84 ответил в теме Вывод категорий в virtuemart 2.0.2b
я его к себе на диск яндекса залил, попробуй, скачай.
yadi.sk/d/hMj9ACYg57A3C

я его где-то с просторов нета выкачал. Он, по-моему, платный. Но я решил поступить по-русски :laugh: Искал в нем скрытые ссылки, ничего не нашел. На сайте работает нормально, глюков не наблюдается.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Работает на Kunena форум