Список разделов каталога в 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() и оформить как угодно. Обрати внимание, что у всез нужных ресурсов должен быть один указанный шаблон, иначе дерево может быть неправильным.            
                Благодетель! Долгих тебе лет жизни и безоблачного неба над головой, Василий. Спасибо огромное, буду пробовать            
                    
                Ты сначала попробуй, а потом хвали =)            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.