Вывод каталога используя smarty

Smarty ШаблонизаторИтак необходимо реализовать вывод каталога с подкаталогами неограниченной вложенностью, используя шаблонизатор smarty.

Один из способов:

1. Прежде чем начать необходимо иметь таблицу в нашей БД с необходимыми данными. К примеру как на рисунке ниже.

Таблица MySql для реализации вывода каталогов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>

Результат получается такой

Вывод каталога используя Smarty

Вывод каталога используя smarty: 2 комментария

Обсуждение закрыто.