Рекурсивный рендеринг деревьев с помощью Agile Toolkit - PullRequest
6 голосов
/ 31 августа 2011

У меня следующая ситуация. У меня есть модель A со следующими свойствами: id int Имя Варчар (255) parent_id int (ссылается на ту же модель A).

Теперь мне нужно отобразить Tree View, используя эту ModelA. Конечно, я мог бы просто загрузить все данные, правильно отсортировать их по parent_id и «отобразить», используя традиционное закрепление строк. например,

class Model_A extends Model_Table {
...

function render_branch($nodes, $parent){
    if (!isset($nodes[$parent])){
        return null;
    }
    $out = "<ul>";
    foreach ($nodes[$parent] as $node){
        $out .= "<li>" . $node["name"];
        $out .= $this->render_branch($nodes, $node["id"]);
        $out .= "</li>";
    }
    return $out;
}

function init(){
    parent::init();
    $nodes = array(); // preload from db and arrange so that key = parent and content is array of childs
    $this->template->set("tree", $this->render_branch($nodes, 0));
}

}

Теперь я вместо этого хотел бы использовать для этой цели собственный анализатор шаблонов atk4 lister / smlite. но, если вы попытаетесь это сделать, то в итоге вы получите неприятный список, в котором в строке формата вы все равно попытаетесь заменить определенный тег выводом из другого списка, который на самом деле вам придется уничтожить, чтобы избежать переполнения памяти во время выполнения. .

есть предложения?

p.s. код выше не тестируется, просто показывает концепцию

спасибо!

Ответы [ 2 ]

3 голосов
/ 06 июля 2012

Ладно, пришло правильное время и было создано правильное дополнение. Чтобы использовать его, обновите свои дополнения и atk4 и следуйте этой статье, чтобы узнать, как это сделать.

http://www.ambienttech.lv/blog/2012-07-06/tree_view_in_agile_toolkit.html

0 голосов
/ 31 декабря 2011

В соответствии с комментарием Янчи

хорошо, потратив некоторое время на поиск возможных вариантов, я обнаружил, что в данном конкретном случае проще всего было использовать приведенный выше пример.Единственный способ сделать его более естественным - использовать внешний шаблон для узлов и использовать smite и clone region + render для перемещения html за пределы шаблона.кроме того, использование традиционного списка не было достаточно эффективным.Так что, ребята из atk4, добавьте плагин для просмотра дерева запросов и создайте правильный бэкэнд!это было бы классно.спасибо, j

.

...