Показ родителя в зависимости от tv дитя

Добрый вечер. Думаю у кого-нибудь есть решения такой задачи, поделитесь плиз.
Такая ситуация, есть каталог классического вида:
Категория1
--Подкатегория1
----Товар
----Товар
--Подкатегория2
----Товар
----Товар
Категория2
--Подкатегория3
----Товар
----Товар
--Подкатегория4
----Товар
----Товар
У товара есть tv-параметр количество шт. на складе.
Вопросы, как решить такие задачи:
Задача 1: При открытии страницы Категории, выводить только те Подкатегории, у которых товар есть на складе. (хотя бы один товар есть на складе)
Задача 2: Такая же задача, только для Категорий, т.е. выводить только те Категории, у которых товар есть на складе. (хотя бы один товар в любой из Подкатегории).

Выводить хотел DocLister или DLMenu.

9 комментариев

avatar
Я в таких случаях свой велосипед использую.
Для категорий в DocLister подставляю в parents id категорий в который есть товары с не нулевым количеством. Сами id получаю с помощью modx api DBAPI.
А вот вывод просто товаров в DocLister по примеру
[[DocLister? &filters=`AND(tv:price:gt:0;tv:price:lt:300)`]]
avatar
Еще подумываю над модулем, который будет проходить по каталогу и если в категории есть товары с не нулевым количеством, то ставить признак в каком-нибудь tv категории. Данный модуль запускать после каждого обновления цен.
Есть кого-нибудь
avatar
Зачем тебе модуль? В модуле ты будешь делать ту-же самую работу — получиш ID категорий в которой есть товары и у товаров есть количество. Тут тебе просто надо составить sql запрос и результат подставить в parent Doclister. Вопрос в правильности составления sql запроса?
Комментарий отредактирован 2018-05-13 14:29:28 пользователем Redduck
avatar
Я бы делал плагин на сохранение документа и выставлял у родителей hidemenu.
avatar
В случаи использования такого плагина возникнут трудности. Они в любом случаи возникнут, просто в случаи плагина их будет побольше. Ведь количество товара уменьшается и в какой-то момент их не будет, а раздел будет отоброжаться.
avatar
Мне кажется, что подсчет через тв будет медленным (тут бы лучше хранить в от дельной таблице), поэтому хотелось бы его делать реже, чем каждый раз при выводе. Еще бы знать, как часто это количество обновляется.
avatar
Обновляется раз в сутки. При синхронизации остатков.
Можете помочь с составлением sql запроса или с использованием DBAPI.
1. Если количество детей с ненулевым tv-параметром «ostatok» больше нуля, то у родителя присваиваем tv-параметру «inlist» = 1
avatar

$table = $modx->getFullTableName("site_content");
$table_tv = $modx->getFullTableName("site_tmplvar_contentvalues");
//Это номер твоего TV параметра "ostatok", это что-бы не делать еще один LEFT JOIN
$NUMBER_TV = X;

$sql = 'SELECT `c`.`id` FROM '.$table.' c 
LEFT JOIN '.$table.' t ON `c`.`id` = `t`.`parent`
LEFT JOIN '.$table_tv.' tv ON `t`.`id` = `tv`.`contentid` AND `tv`.`tmplvarid` = '.$NUMBER_TV.'
WHERE ( `tv`.`value` IS NOT NULL AND CAST(`tv`.`value` AS SIGNED)>0) 
AND `c`.`published`=1 AND `c`.`deleted`=0
AND `t`.`published`=1 AND `t`.`deleted`=0';

$result = $modx->db->query($sql);


Вот должен выбрать IDs подкатегорий в которых есть товары с TV больше нуля.
avatar
Только лучше еще использовать и templates при WHERE, тогда запрос будет побыстрее работать.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.