Список разделов каталога в TV типа checkbox
Дорогой Василий и коллеги! Сразу оговорюсь, что это копипаста моего поста с modx-cms.ru.
Друзья мои, прошу вашей помощи, совета или, по крайней мере, квалифицированного пинка в нужную сторону. Дело в следующем. Вчера вечером собирался быстро набросать сниппет, который вызывается через @EVAL в TV типа «чекбокс». Сниппет должен выводить разделы и вложенные в них подразделы каталога продукции и выглядеть это в менеджере должно было теоретически так:
Результат был, конечно же, другим:
Вместо подразделов каждого основного раздела выводятся все подразделы какого-то одного. Привожу листинг своего страшненького сниппета:
Вызов в TV:
Пнуть тут есть за что, но решение нужно больше :) Заранее спасибо
Друзья мои, прошу вашей помощи, совета или, по крайней мере, квалифицированного пинка в нужную сторону. Дело в следующем. Вчера вечером собирался быстро набросать сниппет, который вызывается через @EVAL в TV типа «чекбокс». Сниппет должен выводить разделы и вложенные в них подразделы каталога продукции и выглядеть это в менеджере должно было теоретически так:
Результат был, конечно же, другим:
Вместо подразделов каждого основного раздела выводятся все подразделы какого-то одного. Привожу листинг своего страшненького сниппета:
<?php
/* getProductSections snippet */
$docs = $modx->getCollection('modResource',array(
'parent'=>3,
'id:NOT IN'=> array(3,13,69,81),
'template' => 4,
));
foreach($docs as $doc) {
$title = $doc->get('pagetitle');
$id = $doc->get('id');
$subdocs = $modx->getCollection('modResource',array('parent'=>$id,'template' => 4,));
foreach ($subdocs as $subdoc) {
$s_out .= '-- '.$subdoc->get('pagetitle').'=='.$subdoc->get('id').'||';
}
$out .= strtoupper($title).'=='.$id.'||'.$s_out;
}
$out = $out;
return rtrim($out,'|');
Вызов в TV:
@EVAL return $modx->runSnippet('getProductSections');
Пнуть тут есть за что, но решение нужно больше :) Заранее спасибо
Комментарии: 3
Смотри, вот сниппет, который построит тебе дерево ресурсов глубиной в 2 уровня, от указанного родителя.
Вот такой будет результат.
$parent = 3;
$exclude_parents = array(3,13,69,81);
$template = 4;
$ids = $modx->getChildIds($parent, 1, array('context' => 'web')); // получаем всех потомков родителя
$q = $modx->newQuery('modResource', array('parent:IN' => $ids, 'OR:id:IN' => $ids)); // Выбираем подкатегории + категории
$q->andCondition(array('id:NOT IN' => $exclude_parents, 'template' => $template)); // Убираем ненужные по id и шаблону
$q->select('id,pagetitle,parent'); // Нам нужно только 3 поля
// Поехали!
$resources = array();
if ($q->prepare() && $q->stmt->execute()) {
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
if ($row['parent'] == $parent) {
if (isset($resources[$row['id']])) {
$resources[$row['id']] = array_merge($resources[$row['id']], $row);
}
else {
$resources[$row['id']] = $row;
$resources[$row['id']]['children'] = array();
}
}
else {
$resources[$row['parent']]['children'][$row['id']] = $row;
}
}
}
echo'<pre>';print_r($resources);die;
Вот такой будет результат.
Array ( [1] => Array ( [id] => 1 [pagetitle] => Главная [parent] => 0 [children] => Array ( ) ) [11] => Array ( [children] => Array ( [2] => Array ( [id] => 2 [pagetitle] => Категория 1 [parent] => 11 ) [4] => Array ( [id] => 4 [pagetitle] => Корзина [parent] => 11 ) ) [id] => 11 [pagetitle] => miniShop2 [parent] => 0 ) )Ну а дальше ты можешь пройтись по нему foreach() и оформить как угодно. Обрати внимание, что у всез нужных ресурсов должен быть один указанный шаблон, иначе дерево может быть неправильным.
Благодетель! Долгих тебе лет жизни и безоблачного неба над головой, Василий. Спасибо огромное, буду пробовать
Ты сначала попробуй, а потом хвали =)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.