Деревья на нативном шаблонизаторе.

Safary

Новичок
Lightning, если нужна будет помощь - обращайся

-~{}~ 09.03.09 23:53:

Я всегда рад помочь! =)
 

cDLEON

Онанист РНРСlub
Если менюху поместить в класс, а классу кастануть Iterator, то всё будет давольно просто...
PHP:
<?foreach($tree as $v):?>
 <?if($tree->is_start_position()):?>
  <ul>
 <?endif;?>
 <li><?=$v?></li>
 <?if($tree->has_childs()):?>
   <?$tree=$tree->get_childs()?>
 <?endif;?>
 <?if($tree->is_end_position()):?>
  </ul>
  <?if($tree->get_parent()): ?>
   <?$tree=$tree->get_parent();?>
  <?endif?>
 <?endif;?>
<?endforeach;?>
 

Lightning

Трудоголик
*****
Так у меня и так сейчас иф внутри цикла. Но мне мой шаблон не очень нравится. Может можно проще сделать.
 

Safary

Новичок
Lightning, харош *****а доставать, а то он щас разозлится и меня забанитъ
 

Lightning

Трудоголик
Если менюху поместить в класс, а классу кастануть Iterator, то всё будет давольно просто...
В твоем примере один цикл и четыре ифа, в моем один цикл и три ифа. Мой пока проще.

-~{}~ 10.03.09 00:03:

Safary
Не засирай тему!!!

-~{}~ 10.03.09 00:05:

cDLEON
И у тебя нет различий между листьями и ветками.
 

x-yuri

Новичок
У меня не блочный шаблон! И нет подшаблонов!
я говорил про то, чего ты хочешь - http://tinyurl.com/dlcmkq
что такое tree, branch и leaf как не блоки? branch, leaf можно рассматривать как подшаблоны custom-тэга tree (но это уже детали терминологии)

А почему native php не обойдусь?! Если не придумаю лучшего решения на нативе чем текущее, то придется оставить как есть
если из твоей цели исходить, то можно, в принципе, сделать функцию tree, в которую передается шаблон ветки, в нем находится шаблон узла и на основе этого всего генерируется дерево. Такой себе вариант
варианты С. и попытки упростить шаблон в случае нативного шаблонизатора - имхо, это попытки усесться на 2 стула. Если дизайнер боится циклов, ветвлений и функций - используй какой-нибудь шаблонизатор. Приведи, кстати, свой текущий вариант
 

cDLEON

Онанист РНРСlub
Зато у меня массивы готовить не нужно :)
Всё выплюнется на ходу :)
А ты воротишь целую кучу малу...
А по поводу различий листьев и веток, так такой функционал нужно дописывать, да и не проблема это:)
ЗЫ. Ну а если тебе взамен удобства программирования, требуется удобство вёрстки, то советывать, я думаю, здесь больше не чего... Потому как натянуть шаблон - это 1% от всей работы над проектом.
 

Lightning

Трудоголик
Автор оригинала: x-yuri
я говорил про то, чего ты хочешь - http://tinyurl.com/dlcmkq
что такое tree, branch и leaf как не блоки? branch, leaf можно рассматривать как подшаблоны custom-тэга tree (но это уже детали терминологии)

если из твоей цели исходить, то можно, в принципе, сделать функцию tree, в которую передается шаблон ветки, в нем находится шаблон узла и на основе этого всего генерируется дерево. Такой себе вариант
варианты С. и попытки упростить шаблон в случае нативного шаблонизатора - имхо, это попытки усесться на 2 стула. Если дизайнер боится циклов, ветвлений и функций - используй какой-нибудь шаблонизатор. Приведи, кстати, свой текущий вариант
Ты хочешь меня убедить, что у меня блочный шаблон? или что мне нужен блочный шаблон? или что?
Повторяю еще раз. У меня не блочный шаблон (т.к. видно что выводится именно дерево и используются как раз циклы и ветвления). И мне не нужен блочный шаблон. Верстальщик понимает циклы и ветвления, но функции и рекурсия в шаблонах - это перебор. И не нужно больше спорить со мной по этому поводу. Если хочешь помочь - предлагай как сделать шаблон, а не убеждай меня, что он блочный.
Текущий вариант пока не изменился.
PHP:
<ul id="tree">
    <? Tree::init($tree, 'children') ?>
    <? while(Tree::get($item)) { ?>
        <? if(Tree::branch()) { ?>
            <li><div><?= $item['title'] ?></div>
                <ul>
        <? } elseif(Tree::leaf()) { ?>
                    <li><a href="<?= $item['href'] ?>"><?= $item['title'] ?></a></li>
        <? } elseif(Tree::endbranch()) { ?>
                </ul>
            </li>
        <? } ?>
    <? } ?>
</ul>
-~{}~ 10.03.09 00:36:

Зато у меня массивы готовить не нужно
Всё выплюнется на ходу
А ты воротишь целую кучу малу..
У меня тоже ничего готовить не нужно. Дерево не преобразовывается в список, а выводится в том виде, в каком поступает из модели.
Ну а если тебе взамен удобства программирования, требуется удобство вёрстки, то советывать, я думаю, здесь больше не чего... Потому как натянуть шаблон - это 1% от всей работы над проектом.
1) Удобство верстки и удобство программирования у меня не зависят друг от друга
2) Тут обсуждается как вывести дерево на нативном шаблонизаторе, а не то, как нужно работать на проектом. Пиши по теме!!!
 

cDLEON

Онанист РНРСlub
Ну мой код можно оптимизировать так, что бы дерево бралось из БД односвязным списком упорядоченным по чилдам.
Тогда к parent можно не возвращаться и соответственно его не проверять.
Далее если $tree->has_childs() - пусто, значит это лист.
Если наоборот - то ветка.
 

x-yuri

Новичок
Lightning у тебя просто такой нестандартный блочный шаблонизатор, в котором границы блоков задаются с помощью php-кода
 

Lightning

Трудоголик
x-yuri
Ты зануда =)

-~{}~ 10.03.09 01:08:

Последний вариант. Почти похоже на то, что я хотел. По крайней мере структура такая и понятно где что.
PHP:
<ul id="tree">
    <? Tree::begin($tree, 'children') ?>
    <? while(Tree::item($item)) { ?>
        <? if(Tree::branch()) { ?>
            <li><div><?= $item['title'] ?></div>
                <ul>
                    <? } elseif(Tree::leaf()) { ?>
                            <li><a href="<?= $item['href'] ?>"><?= $item['title'] ?></a></li>
                    <? } else { ?>
                </ul>
            </li>
        <? } ?>
    <? } ?>
</ul>
Все. Проще нельзя, наверное.
 

x-yuri

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

а твой шаблон можно сократить до
PHP:
<ul id="tree"> 
    <? while( tree($tree) ) { ?> 
        <? if( branch($tree) ) { ?> 
            <li><div><?= prop( $tree, 'title' ) ?></div> 
                <ul> 
                    <? } elseif( leaf($tree) ) { ?> 
                        <li><a href="<?= prop( $tree, 'href' ) ?>"><?= prop( $tree, 'title' ) ?></a></li> 
                    <? } else { ?> 
                </ul> 
            </li> 
        <? } ?> 
    <? } ?> 
</ul>
только я б так не делал
 

Lightning

Трудоголик
а твой шаблон можно сократить до
Можно. Но я бы тоже так не делал. Все равно структура останется такая же. Избыточность синтаксиса - это отдельный разговор. А вот prop ($tree, 'href') - это плохо. В циклах $item['href'], значит и в деревьях должно быть item['href'].
а может ты просто за деталями не видишь сути
Может быть, а может быть не видишь сути ты?
Просто представь, если бы в PHP кроме циклов и ветвлений была и специальная конструкция для обхода деревьев. Как бы она выглядела?
 

С.

Продвинутый новичок
попытки упростить шаблон в случае нативного шаблонизатора - имхо, это попытки усесться на 2 стула
Я свой стул пометил однозначно -- простота шаблона, даже за счет усложнения бэк-енд кода. Не моя вина в том, что даже "сложный" код все равно много раз быстрее и эффективнее всяких курчавых шаблонизаторов получается.

Вообще будь моя воля, я бы вместо ввода всяких сомнительных ООП штучек в PHP занялся бы возможностью расширения синтаксиса, как в С++ или в Клиппере.
 
Сверху