вывод дерева и простой шаблон

Фанат

oncle terrible
Команда форума
вывод дерева и простой шаблон

Это опять я и опять про шаблоны.
вздумалось мне вывести деревце небольшое.
дерево в массиве, выводим обычными ненумерованными списками. открыл ul - закрыл ul.
обычно здесь используется рекурсия.
Но вы не представляете, как мне не хочется писать в шаблоне рекурсивную функцию.
собственно, хочется вывести дерево, используя лишь операторы цикла и условного перехода.

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

Фанат

oncle terrible
Команда форума
ну, он дописывается пока.
а что именно интересует?
 

Igor aka TiGR

Новичок
Ну ты говоришь, что код получается громоздким. Хотелось бы взглянуть на проблемное место...

И ещё, какой шаблонный движок используется, каковы его возможности?

Например, если движок позволят свободно манипулировать переменными (включая арифметику), а также свободно сравнивать (используя функции php) - то это не проблема.

Примерный алгоритм:

В каждом цикле сохраняем предыдущий уровень вложенности, и сравниваем с текущим. По результату и действуем.
 

Navarro

Новичок
Я выводил таблицей, подставляя прозрачные изображения для выравнивания.
Как руки дойдут переделаю на дивы.
 

Фанат

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

щас допишу - покажу.
 

Фанат

oncle terrible
Команда форума
собственно, шаблон очень простой.
PHP:
<? foreach ($TREE as $row): ?>
<? if($row['li']=="open"): ?><ul><?endif?>
<? if($row['li']=="close"): ?></ul><?endif?>
<li><b><a href="?id=<?=$row['id']?>"><?=$row['title']?></a></b></li>
<? endforeach ?>
</ul>
только он глючит в описанной выше ситуации.
надо добавлять код, который будет фигачить столько </ul>, скольо ступенек назад перепрыгиваем в случае, когда
1
1-1
1-1-1
1-1-1-1
2
 

Igor aka TiGR

Новичок
Примерно в этом духе:
PHP:
<? $lastlevel = 0 ?>
<? foreach ($TREE as $row): ?> 
<? if($lastlevel<$row['level']): ?><ul><?endif?> 
<? if($lastlevel>$row['level']) { echo str_repeat('</ul>', $lastlevel-$level) } ?> 
<? $lastlevel = $row['level'] ?>
<li><b><a href="?id=<?=$row['id']?>"><?=$row['title']?></a></b></li> 
<? endforeach ?> 
<? echo str_repeat('</ul>', $row['level'])  ?>
При условии, что в массиве минимальный level = 1
 

Igor aka TiGR

Новичок
Можно написать вообще без if.

Тернарный оператор рулит.

Апплодисменты в студию. :D
 

Фанат

oncle terrible
Команда форума
так я не спорю.
но вопрос был собственно в том, как шаблон упростить.

на самом-то деле, я, как всегда, вопрос от мозговой усталости задал. как-то уже. чисто рефлекторно. споткнувшись на выборе между вводом в шаблон оператора continue и лишним ифом.
с ифом, понятное дело, кошернее. но код менее читабельный получается, если учесть, что там внутри ведь ещё будут...
в общем, пока получилось вот так:
PHP:
<? foreach ($TREE as $row): ?>
<? if($row['li']=="open"): ?><ul><?endif?>
<? if($row['li']=="close"): ?></ul><?endif?>
<? if($row['id']!=0): ?>
<? if($id==$row['id']): ?>
<li><?=$row['title']?></li>
<? else: ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['title']?></a></li>
<?endif?>
<?endif?>
<? endforeach ?>
</ul>
 

Popoff

popoff.donetsk.ua
какой-нибудь файл с твоими функциями
-----
function include_my_tree_template($a_level)
{
if(!$a_level) return;
include('my-tree-template.php');
}

шаблон - my-tree-template.php
----------------
<ul>
<? foreach ($a_level as $row): ?>
<li><b><a href="?id=<?=$row['id']?>"><?=$row['title']?></a></b>
<? include_my_tree_template($row['a_level']); ?>
</li>
<? endforeach ?>
</ul>
 

Фанат

oncle terrible
Команда форума
Popoff
слушай, а это отличная идея.
постой.
только зачем там функция, если модно рекурсивно делать инклюд?
 

Фанат

oncle terrible
Команда форума
Igor aka TiGR
я, может быть, ужасно косный и старомодный, но мне кажется, что шаблон и функция - вещи несовместимые.
 
Сверху