Отрисовка дерева данных в виде вложенных списков используя шаблонизатор Smarty

Постановка задачи
Необходимо отрисовать в html дерево данных из базы в виде вложенных списков используя шаблонизатор Smarty

Первое что приходит на ум, это использовать рекурсивную функцию, которая обладает удивительным качеством автомодельности по параметру, т.е. фрактальностью, а значит самоподобием. Именно самоподобие позволит построить вложенные списки. Поэтому рекурсию используют для построений фракталов Мандельброта

Для начала немного дефиниций.
Реку́рсия (англ. recurrence — повторение) — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или косвенно на эти базовые случаи. Другими словами, рекурсия — способ общего определения объекта или действия через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи.
Рекурси́вная фу́нкция (от лат. recursio — возвращение) — это числовая функция f(n) числового аргумента, которая в своей записи содержит себя же.



Реализация

Создадим таблицу в базе
CREATE TABLE `tbl_tree` (
  `idt` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) NOT NULL DEFAULT '0',
  `title` varchar(200) NOT NULL,
  PRIMARY KEY (`idt`),
  KEY `title` (`title`),
  KEY `pid` (`pid`)
);


Текст файла tree.php
<?php
include "Smarty.class.php";
$smarty = new Smarty;
$smarty->template_dir=$_SERVER["DOCUMENT_ROOT"]."/templates";
$smarty->compile_dir=$_SERVER["DOCUMENT_ROOT"]."/templates_c";
$DB_HOST = "localhost";         
$DB_LOGIN = "";
$DB_PASSWORD = "";
$DB_NAME="";

$link = mysql_connect($DB_HOST, $DB_LOGIN, $DB_PASSWORD);
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db($DB_NAME);
function get_tree($p_id)
  {
  $res_array=array();
  $res_array[]=array('ul'=>1, 'idt'=>null, 'title'=>null);
  $sql='select idt, title from tbl_tree where pid='.$p_id;
  $data=mysql_query($sql);
  while ($tmp=mysql_fetch_array($data))
    {
    $res_array[]=array('ul'=>0, 'idt'=>$tmp['idt'], 'title'=>$tmp['title']);
    $tmp_array=get_tree($tmp['idt']);
    if (!is_null($tmp_array)) $res_array=array_merge($res_array, $tmp_array);
    }
  if (sizeof($res_array)>1)
    {
    $res_array[]=array('ul'=>2, 'idt'=>null, 'title'=>null);
    }
    else $res_array=null;
  return $res_array;
  }
$tree_array=get_tree(0);
$smarty->assign('tree_array', $tree_array);
$smarty->display('tree.tpl');
?>


Текст файла tree.tpl
{section name=t loop=$tree_array}
{if $tree_array[t].ul==1}<ul>{elseif $tree_array[t].ul==2}</ul>{else}<li>{$tree_array[t].title}</li>{/if}
{/section}


Вуаля!

Благодарность
Этот алгоритм был предложен Андреем Брущенко, за что ему пиво и всяческие благодарности!

А на посошок мне хотелось бы привети песню барда, поэта, художника и музыканта Владимира Завгороднего «Дерево»:

ДЕРЕВО

Я квітуче дерево
біля шляхів,
і лупить зухвалий Борей
моє листя тендітне.
А я нерухоме,
і сумно дивитись мені,
як блукають по диких шляхах
неприкаяні люди.

Я квітуче дерево
біля шляхів,
і знають чимало пісень
мої листя і квіти.
То ж почуйте мене,
зупиніться,
почуйте мене хоч на мить.
Все чекаю, коли прилетить
моя пташка осяйна.

Я цветущее дерево
среди дорог,
и летят мои лепестки
в бесконечное кружево мира.
И трагический танец
застыл в изломе ствола моего.
Я врастаю все крепче и вглубь
в эти камни и пепел.
И от хора орудий и песен,
речей и поэм
я храню в сердце кроны моей
крупицу безмолвия.
Прилетай,
моя светлая птица, скорей!
Здесь давно уже свито гнездо
твоему одиночеству.


Дерево (mp3) / 4m 23s — 4,01 Mb — 128 Kb/s


Tree by Jorge Stolfi

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Не забываем смотреть статистику:

Яндекс цитирования