Список разделов каталога в TV типа checkbox

Дорогой Василий и коллеги! Сразу оговорюсь, что это копипаста моего поста с modx-cms.ru.

Друзья мои, прошу вашей помощи, совета или, по крайней мере, квалифицированного пинка в нужную сторону. Дело в следующем. Вчера вечером собирался быстро набросать сниппет, который вызывается через @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');

Пнуть тут есть за что, но решение нужно больше :) Заранее спасибо
Andrei Kulazhenko
29 апреля 2013, 11:22
modx.pro
2 337
0

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

Василий Наумкин
29 апреля 2013, 17:17
0
Смотри, вот сниппет, который построит тебе дерево ресурсов глубиной в 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() и оформить как угодно. Обрати внимание, что у всез нужных ресурсов должен быть один указанный шаблон, иначе дерево может быть неправильным.
    Andrei Kulazhenko
    29 апреля 2013, 17:25
    0
    Благодетель! Долгих тебе лет жизни и безоблачного неба над головой, Василий. Спасибо огромное, буду пробовать
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
3