×
HeadHunter and Superjob rezume updater on Ruby on Rails (21 авг 2017)

Практикуемся в написании кода под rails.

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

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

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

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

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

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

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

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


Находим

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

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

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

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

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

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

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 строка):

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

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

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. Сортировка товаров по категориям. Для этого в файле

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

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

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

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

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

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

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

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

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

getProductSingle

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

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

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

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

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

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

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

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

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


// 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) { 
...

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


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

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

// 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) { 
...

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

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

Больше
4 года 3 мес. назад #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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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