[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Дерево в Smarty
Страницы: 1, 2
vegasmoscow
Здравствуйте.

Пытаюсь вывести дерево каталога в Smarty. Других вариантов нет - только Smarty, разве что с использованием костылей на PHP все сделать, но хочется чтобы все красиво было. Перечитал инет - там ходит из уст в уста один и тот же способ, как я его ни крутил, он у меня не заработал. Проблема возникает с подключением в Smarty файла, в котором и содержится это подключение, но с другими параметрами. Проблема возникает с рекурсией.

Есть у кого-либо удачный опыт применения Smarty при выводе неограниченного дерева каталога?
Эли4ка
А по каким причинам не работал способ,который ходит из уст в уста?
vegasmoscow
Цитата (Эли4ка @ 2.08.2018 - 05:52)
А по каким причинам не работал способ,который ходит из уст в уста?

По каким причинам я не знаю, не выводит подкатегории и все тут. Я его и так и сяк. Код из источников я модифицировал под свои переменные, получилось вот что.

Сначала в файле PHP из БД выбираю все, что видимое в таблице с категориями и кладу в массив $catalog. Там и id самой категории и id ее родителя (для корневых id=0), имя, маркер видимости и все остальное. Никак не сортирую массив, как выбрал, так и выбрал.

В нужном месте вставляю шаблон:
{include file="category_tree.tpl.html" parent='0'}

Здесь parent='0' означает, что выборка начнется с корневых категорий, у которых id родителя 0.

Далее сам шаблон:

{section name=i loop=$catalog}
//Сначала выбираем корневые категории
{if $catalog[i][3] == $parent} //[3] - ячейка с id родительской категории в массиве
{$catalog[i][2]}<br/> //[2] - это ячейка с именем категории в массиве

// Теперь у этой категории ищем подкатегории, у которых родительская категория $catalog[i][0]
{include file="category_tree.tpl.html" parent=$catalog[i][0]} //[0] - это ячейка с id категории
//Шаблон должен подключиться снова, но за корневую категорию уже взять текущую категорию и заодно проверить, а нет ли в подкатегориях своих подкатегорий и так до бесконечности, пока они не закончатся
{/if}
{/section}


Проблема возникает при подключении файла внутри {section}. Если удалить его, то шаблон упешно выведет список корневых категорий. Но при подключении шаблона внутри себя сервер выдает 502 ошибку. В чем проблема и почему не работает код - не могу понять, всю ночь ковыряю.

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

В общем, как-то так..
Эли4ка
Это весь рабочий код?
vegasmoscow
Цитата (Эли4ка @ 2.08.2018 - 15:39)
Это весь рабочий код?

Нет, конечно же. Это его фрагмент, отвечающий только за вывод дерева (каталога интернет-магазина). Код PHP я приводить не стал, поскольку с ним проблем нет. Собственно, именно этот код, что я привел, должен вывести дерево из массива $catalog. Дело нехитрое, но я не знаю почему не работает рекурсия в шаблоне smarty.
Эли4ка
А как по вашему,мы должны смоделировать ошибку у себя,если нет кода,а есть только шаблон-написать сами код?
Пожалуйста,приведите код.
vegasmoscow
Цитата (Эли4ка @ 2.08.2018 - 18:59)
А как по вашему,мы должны смоделировать ошибку у себя,если нет кода,а есть только шаблон-написать сами код?
Пожалуйста,приведите код.

Я не понимаю какой нужен код. Вывод дерева в шаблоне я выше описал. Никакой другой код для вывода дерева не используется. В файле PHP из БД формируется массив вида:

$catalog = array (
array(id, name, visible, parent_id, ...),
array(id, name, visible, parent_id, ...),
array(id, name, visible, parent_id, ...),
array(id, name, visible, parent_id, ...),
...);
Каждая строка массива $catalog это категория со всеми данными по ней. В шаблоне с помощью Smarty нужно эти данные правильно отобразить. Моих познаний хватило лишь для того, чтобы отобразить корневые категории с parent_id='0'. А вот с дочерними не получается, когда вместо parent_id подставляю id перебираемых категорий и подключаю этот же файл с шаблоном, но с новым id. Не работает рекурсия. В PHP я такое делал, там функция сама себя вызывает без проблем, а в Smarty это не работает. По крайней мере, у меня.

Никого не хочу напрягать, если как-то неясно излагаю, но я не могу по-другому объяснить. Буду делать как умею, иначе застряну надолго. Придется пожертвовать красотой в пользу работоспособности кода.
vegasmoscow
Цитата (Эли4ка @ 2.08.2018 - 18:59)
А как по вашему,мы должны смоделировать ошибку у себя,если нет кода,а есть только шаблон-написать сами код?
Пожалуйста,приведите код.

Решил изменить структуру массива.

$catalog=array(
"0"=>array("id"=>"1","name"=>"first","child"=>array()),
"1"=>array("id"=>"2","name"=>"second","child" =>array("id"=>"3","name"=>"third","child" =>array()))
);


$smarty->assign("catalog", $catalog);


В нужном месте вывожу файл шаблона.
{include file='category_tree_test.tpl.html' object=$catalog}


А вот код файла category_tree_test.tpl.html.

{if $catalog}
<ul class='tree'>
{foreach from=$catalog item="item"}
<li>{$item.name}
{if count($item.child)>0}
{include file="category_tree_test.tpl.html" catalog=$item.child} // Все ломается именно здесь, 502 ошибка. Если удалить эту строчку, все работает, но без дочерних разделов.
{/if}
</li>
{/foreach}
</ul>
{/if}


Проблема в повторном подключении файла. Это весь код. Нужно просто вывести массив в виде дерева.
kaww
Цитата (vegasmoscow @ 2.08.2018 - 15:20)
Но при подключении шаблона внутри себя сервер выдает 502 ошибку. В чем проблема и почему не работает код - не могу понять, всю ночь ковыряю.

Посмотрите в логе php в чем именно ошибка.
section может не работать из-за одинакового name. Вариант с foreach работает:
Массив:
assign('catalog', [[1, 'Foo 1', 0], [2, 'Foo 2', 0],[3, 'Bar 1', 2], [4, 'Baz 1', 3]]);

Подключение шаблона:
{include file="tree.tpl" parent=0 catalog=$catalog}

Сам шаблон
<ul>
{foreach item=item from=$catalog}
{if $item[2] == $parent}
<li>
{$item[1]}
{include file="tree.tpl" parent=$item[0] catalog=$catalog}
</li>
{/if}
{/foreach}
</ul>

Результат:
<ul>
<li>
Foo 1
<ul></ul>
</li>
<li>
Foo 2
<ul>
<li>
Bar 1
<ul>
<li>
Baz 1
<ul></ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
vegasmoscow
Цитата (kaww @ 3.08.2018 - 00:37)
section может не работать из-за одинакового name

Я этот вариант тоже предполагал, сделал для внутреннего section отдельный файл со своим name. В первом подключении у меня name=i, а во втором - name=y. Не сработало и это. Тоже белый экран и 502.

Вашу версию проверю, спасибо.
vegasmoscow
Цитата (kaww @ 3.08.2018 - 00:37)
Массив:
assign('catalog', [[1, 'Foo 1', 0], [2, 'Foo 2', 0],[3, 'Bar 1', 2], [4, 'Baz 1', 3]]);

Не совсем понимаю эту запись. Как ее можно по-другому записать?
kaww
Это просто объявление массива.
$catalog = [
[
0 => 1, 1 => 'Foo 1', 2 => 0],
[
0 => 2, 1 => 'Foo 2', 2 => 0],
[
0 => 3, 1 => 'Bar 1', 2 => 2],
[
0 => 4, 1 => 'Baz 1', 2 => 3]
];


индекс 0 - id каталога, 1 - название, 2 - parent id
vegasmoscow
Цитата (kaww @ 3.08.2018 - 16:35)
Это просто объявление массива.
$catalog = [
[
0 => 1, 1 => 'Foo 1', 2 => 0],
[
0 => 2, 1 => 'Foo 2', 2 => 0],
[
0 => 3, 1 => 'Bar 1', 2 => 2],
[
0 => 4, 1 => 'Baz 1', 2 => 3]
];


У меня так не работает. Сделал так.

$catalog = array (
array (0 => 1, 1 => 'Foo 1', 2 => 0),
array (0 => 2, 1 => 'Foo 2', 2 => 0),
array (0 => 3, 1 => 'Bar 1', 2 => 2),
array (0 => 4, 1 => 'Baz 1', 2 => 3)
);


$smarty->assign("catalog", $catalog);


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

<ul>
<li>
Foo 1
<ul></ul>
</li>
<li>
Foo 2
<ul>
<li>
Bar 1
<ul>
<li>
Baz 1
<ul></ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>



Дерево выводится. Даже не пришлось менять структуру массива. Осталось только с выводом лишних тегов разобраться. С этим, полагаю, я разберусь. Спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.