[СДЕЛАЙ САМ] minishop2 "Популярные категории" стандартными средствами

Зачастую на главных страницах сайтов интернет-магазинов есть блок «Популярные категории». Можно придумать много разных вариантов его реализации, я хочу описать один из самых простых. Суть его в том, что популярными будут те категории, в которых есть популярные товары, а их будет выбирать менеджер вручную. Никаких откровений в этой заметке не будет, цель её — предложить простое решение распространённой задачи для новичков в Modx.

Итак, начнём.
1. Создаём TV типа Список (множественный выбор). В него будем записывать наши категории. На вкладке «Параметры вывода» выбираем Разделитель и указываем в качестве разделителя запятую. Чтобы было понятно, какие категории выбраны и можно было их удобно редактировать, в возможные значения пишем вот такую конструкцию:
@SELECT `pagetitle`,`id` FROM `modx_site_content` WHERE `class_key` = 'msCategory' AND `parent` = 9 ORDER BY `menuindex` ASC
Это выборка категорий внутри Каталога где нет вложенностей или вложенные категории не должны быть доступны для выбора, если глубина вложенности больше 1 и вложенные категории могут быть доступны для выбора, то запрос должен быть примерно таким:
@SELECT `pagetitle`,`id` FROM `modx_site_content` WHERE `class_key` = 'msCategory' AND `parent` IN (10,11,12,13,14) ORDER BY `menuindex` ASC
2. Пишем плагин на событие OnDocFormSave
<?php
if($resource->get('class_key') == 'msProduct'){ // если сохраняется товар
    $main = $modx->getObject('modResource', 1); // получаем ресурс Главной
    $parent =$resource->get('parent'); // получаем id родителя текущего ресурса    
    $data = json_decode($_POST['data'],1); // получаем данные формы ресурса
    if($tv = $main->getTVValue('resources_popular_categories')){ // получаем текущий список популярных категорий
        $tv = explode(',', $tv);
    }
    else{
        $tv = array();
    }
    
    if($data['popular'] && !in_array($parent, $tv)){ // если текущего родителя нет среди популярных
         $tv[] = $parent; // добавляем в популярные категории текущего родителя
    }
    else{ // если текущий родитель есть среди популярных
        if(!$conut = $modx->getCount('modResource', array('parent' => $parent, 'popular' => 1))){ // проверяем есть ли в ней популярные товары и если нет
            $tv = array_flip($tv); 
            unset ($tv[$parent]) ; // удаляем текущего родителя из популярных
            $tv = array_flip($tv); 
        }
    }
    
    $main->setTVValue('resources_popular_categories', implode('||', array_unique($tv))); // устанавливаем новые значения
    $main->save(); // сохраняем 
}
Если если структура каталога такая:
--Каталог
----Категория 1
---------Подкатегория 1
-----------------------Товар 1
----Категория 2
----------Подкатегория 2
-----------------------Товар 2
, а популярными могут быть только Категории, но не Подкатегории, то определить id добавляемого родителя можно так
$parents = $modx->getParentIds($id, 10,array('context' => 'web')); 
$parent = $parents[count($parents) - 2];
3. И наконец выводим категории на главной
{set $resources_popular = 1 | resource: 'resources_popular_categories'}
{'pdoResources' | snippet:[
    'parents' => 0,
    'resources' => $resources_popular
]}
Артур Шевченко
28 октября 2021, 19:48
modx.pro
1
843
+4
Поблагодарить автора Отправить деньги

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0