Итак необходимо реализовать вывод каталога с подкаталогами неограниченной вложенностью, используя шаблонизатор smarty.
Один из способов:
1. Прежде чем начать необходимо иметь таблицу в нашей БД с необходимыми данными. К примеру как на рисунке ниже.
2. Теперь пишем необходимый php код в файле index.php
в комментариях необходимые пояснения
require('../libs/Smarty.class.php'); //подключение smarty
include "authBD.php"; //в этом файле подключаем БД
$smarty = new Smarty; // создаем объект шаблонизатора
// создаем текст запроса для выборки из нашей БД
$query = "select * from category";
// делаем выборку и заносим в массив
$result_table = mysql_query($query) or die(mysql_error());
$rows_array=array();
while ($row=mysql_fetch_array($result_table))
$rows_array[]=$row;
//формируем дерево из выборки
$cat_tree=select_to_array_tr($rows_array);
//создаем переменную для нашего дерева каталогов
$smarty->assign('cat1', $cat_tree);
//вызываем шаблон
$smarty->display('index.tpl');
3. Формирования дерева из массива выборки
Функция не использует рекурсию, основана на ссылках, в child хранятся подкаталоги если они есть у родителя.
Листинг
function select_to_array_tr($arr,$mk='Id_cat',$sk='Id_parent',$child='child')
{ // если нет создаем
if(!$arr) {
return array();
}
$mas = array();
$l = count($arr); //кол-во элементов в массиве
for($i = 0; $i < $l; $i++) {
$mas[ $arr[$i][$mk] ] = &$arr[$i];
}
// child - массив дочерних каталогов
foreach($mas as $k => $v) {
$mas[ $v[$sk] ][$child][] = &$mas[$k];
}
$res = array();
foreach($arr as $v) {
if(isset($v[$sk]) && $v[$sk] == 0) {
$res[] = $v;
}
}
//возвращаем готовый массив
$arr = $res;
return $arr;
}
необходимо добавить ее в наш файл index.php перед ее вызовом.
4. Необходимо отредактировать шаблон index.tpl, он находится в папке templates.
Листинг шаблона index.tpl
<ul>
{foreach item='ListTree' from=$cat1}
{* вывод корневых каталогов *}
<li>{$ListTree.Name} </li>
{* вывод подкаталогов используется рекурсия шаблонов *}
{if count($ListTree.child)>0}
{include file='ListTree.tpl' object=$ListTree}
{/if }
{/foreach}
</ul>
5. Затем создадим файл ListTree.tpl со следующим кодом(ниже) и сохраним в папке templates. Этот шаблон будет вызываться для всех дочерних каталогов.
Листинг шаблона ListTree.tpl
<ul>
{foreach item='ListTree' from=$object.child}
{* вывод корневых каталогов *}
<li>{$ListTree.Name} </li>
{* вывод подкаталогов используется рекурсия шаблонов *}
{if count($ListTree.child)>0}
{include file='ListTree.tpl' object=$ListTree}
{/if }
{/foreach}
</ul>
Результат получается такой