Работа с узлами дерева
Для некоторой совместимости с предыдущими версиями Deep-CMS, старый функционал для работы с узлами дерева документов был вынесен в отдельный компонент — extendedTreeUtils. Все его методы работают в точности так, как это было в предыдущих версиях компонентов ядра.
Если в Ваших шаблонах используются конструкции вызова из предыдущих версий Deep-CMS, то самый простой путь — это заменить старые конструкции вызовов на те, которые описаны ниже. Тем не менее, рекомендуется применять основные возможности ядра последней версии, т.к. они максимально оптимизированы и потребляют гораздо меньше ресурсов сервера. Однако, если для решения некоторой спецефичной задачи Вам подходят описанные ниже методы — смело их используйте.
Внимание! Отличительной особенностью данного функционала является то, что он учитывает отношения узлов «родитель-потомок».
extendedTreeUtils::makeTreeArray($lineArray, $parent = 0)
Метод получает на вход «линейный» массив элементов (узлов дерева), где каждый элемент является массивом описывающим один узел дерева:
array(
array(
'id' => 1,
'parent_id' => 0,
'prototype' => 'simplePage',
'lvl' => 1,
'lk' => 1,
'rk' => 6,
'page_alias' => '/news.html',
'node_name' => 'Новости'
),
array(
'id' => 2,
'parent_id' => 1,
'prototype' => 'simplePage',
'lvl' => 2,
'lk' => 2,
'rk' => 3,
'page_alias' => '/news/1.html',
'node_name' => 'Первая новость'
),
array(
'id' => 3,
'parent_id' => 1,
'prototype' => 'simplePage',
'lvl' => 2,
'lk' => 4,
'rk' => 5,
'page_alias' => '/news/2.html',
'node_name' => 'Вторая новость'
)
);
На выход возвращается многомерный массив, где элементы рекурсивно вложены внутри других элементов по ключу «children»:
array(
'id' => 1,
'parent_id' => 0,
'prototype' => 'simplePage',
'lvl' => 1,
'lk' => 1,
'rk' => 6,
'page_alias' => '/news.html',
'node_name' => 'Новости',
'children' => array(
array(
'id' => 2,
'parent_id' => 1,
'prototype' => 'simplePage',
'lvl' => 2,
'lk' => 2,
'rk' => 3,
'page_alias' => '/news/1.html',
'node_name' => 'Первая новость',
'children' => array()
),
array(
'id' => 3,
'parent_id' => 1,
'prototype' => 'simplePage',
'lvl' => 2,
'lk' => 4,
'rk' => 5,
'page_alias' => '/news/2.html',
'node_name' => 'Вторая новость',
'children' => array()
)
)
);
Если элемент не имеет потомков, то ключ «children» будет содержать пустой массив.
Второй аргумент метода является не обязательным. Если указано — метод вернет только те узлы, которые являются потомками узла с указанным идентификатором.
extendedTreeUtils::drawTreeLinksList($arr)
Метод получает на вход многомерный массив узлов дерева полученный предыдущим методом и возвращает сгенерированную строку html-разметки вложенных ul-li-a списков, например для отображения карты сайта или многоуровневого меню.
extendedTreeUtils::getTreeLinksList($arr, $parent = 0)
Метод является оберткой к двум первым методам для удобства, что сокращает цепочку вызовов. Первым аргументом принимает на вход линейный массив узлов дерева. Вторым аргументом при необходимости — идентификатор родительского узла, потомков которого необходимо получить на выходе. Возвращает сгенерированную строку html-разметки вложенных ul-li-a списков:
<?=extendedTreeUtils::getTreeLinksList(dataHelper::getChainChildren($id), $id)?>
Данный пример выведет в шаблон вложенный ul-li-a список всех потомков текущего узла.