[СДЕЛАЙ САМ] minishop2 "Популярные категории" стандартными средствами
Зачастую на главных страницах сайтов интернет-магазинов есть блок «Популярные категории». Можно придумать много разных вариантов его реализации, я хочу описать один из самых простых. Суть его в том, что популярными будут те категории, в которых есть популярные товары, а их будет выбирать менеджер вручную. Никаких откровений в этой заметке не будет, цель её — предложить простое решение распространённой задачи для новичков в Modx.
Итак, начнём.
1. Создаём TV типа Список (множественный выбор). В него будем записывать наши категории. На вкладке «Параметры вывода» выбираем Разделитель и указываем в качестве разделителя запятую. Чтобы было понятно, какие категории выбраны и можно было их удобно редактировать, в возможные значения пишем вот такую конструкцию:
Итак, начнём.
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
]}
Поблагодарить автора
Отправить деньги