обсуждение шаблонизатора Blitz

Фанат

oncle terrible
Команда форума
Андрейка
если я правильно понял вопрос, то шаблон я, вроде, приводил аж два раза.
другое дело, что у меня нет кода его обработки, и я не уверен, что так можно сделать.
но мне кажется, что можно.
 

fisher

накатила суть
>>Твой, с greater
>>И мой, из 5 строчек.
>>Смотрю я на них, и думаю: вроде бы - очевидно, что второй в сто раз лучше
>>первого. И если можно им воспользоваться, то не может быть ни одной
>>причины продолжать пользоваться первым!

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

проблема в том, что вы рассматриваете очень просты примеры. у нас всегда было очень мало проектов, в которых маркетинговой (читай, чисто презентационной) логике уделяется должное внимание. а там логика такая, что размер кода сравним с прочим кодом. я совершенно серьезно говорю. что получается в шаблоне - сложная логика, в которой шарит только программист. а в коде намешана куча html от которого нормального программиста тянет блевать (проверено, увы, мы сколько угодно может говорить о "сознательности" - это будет бесполезно) . а когда программиста тянет блевать, это ребята очень плохо, потому что ему должно хотеться петь. и если маркетинговому отделу понадобится эту логику поменять (а менять надо, и часто, потому что надо экспериментировать, смотреть, мерять конверсию и так далее) - то рвотные позывы программиста будут мягко говоря некстати. иной так вообще начнет говорить, что "в его модели это не предусмотрено, и то, что вы просите будет некрасиво". а никого не волнует красота в вашей голове, уважаемые, ибо things just must be done, и неебёт. впрочем, это уже из другой оперы.

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

Фанат

oncle terrible
Команда форума
fisher
"мой" в данном контексте - на Blitz.
в данной части разговора идёт речь о сравннении двух шаблонов на blitz:
Код:
{BEGIN dir_toc} 

    {BEGIN entry} 
        {BEGIN equal} 
            </li> 
        {END} 
        {BEGIN greater} 
            <ul> 
        {END} 
        {BEGIN less} 
            </li> 
            {BEGIN close} 
                </ul></li> 
            {END} 
        {END} 

        {BEGIN first_open} 
            <ul> 
        {END} 

        <li><a href="{$uri}">{$title}</a> 
    {END} 

    {BEGIN close} 
        </li></ul> 
    {END} 

{END}
и
Код:
{BEGIN entry} 
<ul> 
  {BEGIN item} 
  <li><a href="{$uri}">{$title}</a> 
  {END} 
</ul> 
{END}
Оба они должны построить классическую карту сайта: http://airs.ru/map

Тот, о котором я говорю "мой" - второй.
Кстати, раз уж ты зашёл, то подтверди, плиз, моё предположение - ведь Blitz сможет из такого шаблона построить дерево?
 

fisher

накатила суть
ой, пардон, а я думал ты про тот код, который строит дерево на пхп. ну ты там писал просто про то что одинаково что так что сяк. ну неважно.

насчет сможет не сможет - сможет, но наверное с некоторыми изменениями. щас я посмотрю по твоим примерам что у тебя в качестве исходных данных и чуть позже скину пример.

-~{}~ 13.12.06 20:07:

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

Код:
{{BEGIN list}}
<ul> [тут что-то бесконечно страшное и вложенное]</ul>
{{ END }}
и
Код:
{{BEGIN item}}
<li> а тут всего лишь элемент списка </li>
{{ END}}
поэтому берем шаблон
Код:
{{BEGIN list}}
<ul> {{ $list }}</ul>
{{ END }}
{{BEGIN item}}
<li> <a href="{{$uri}}">{{$title }}</a></li>
{{ END}}
делаем некоторое предположение о структуре каталогов (на самом деле из головы - но наверное это не принципиаьлно) и получаем
Код:
class View extends Blitz {
    function iterate_tree($node) {
        $list = '';
        foreach($node as $item) {
            $list .= $this->fetch('/item',$item);
            if(!empty($item['children'])) {
                $list .= $this->iterate_tree($item['children']);
            }
        }
        return $this->fetch('/list', array('list' => $list));
    }
}

$Tree = array(
    1 => array(
        'title' => 'phpclub',
        'uri' => 'phpclub.ru',
        'children' => array(
            10 => array(
                'title' => 'forum',
                'uri' => 'phpclub.ru/talk',
                'children' => array(
                    100 => array(
                        'title' => 'offtopic',
                        'uri' => 'phpclub.ru/talk/offtopic'
                    )
                )
            ),
            11 => array(
                'title' => 'news',
                'uri' => 'phpclub.ru/news',
            ),
        )
    ),
    2 => array(
        'title' => 'livejournal',
        'uri' => 'www.livejournal.com',
        'children' => array(
            20 => array(
                'title' => 'dolboeb',
                'uri' => 'dolboeb.livejournal.com/',
            ),
            21 => array(
                'title' => 'avva',
                'uri' => 'avva.livejournal.com',
            ),
        )
    ),
);

$View = new View();
$body = '
{{BEGIN list}}
<ul> {{ $list }}</ul>
{{ END }}
{{BEGIN item}}
<li> <a href="{{$uri}}">{{$title }}</a></li>
{{ END}}';

$View->load($body);
echo $View->iterate_tree($Tree);


/* result is:
<ul>
<li> <a href="phpclub.ru">phpclub</a></li>

<ul>
<li> <a href="phpclub.ru/talk">forum</a></li>

<ul>
<li> <a href="phpclub.ru/talk/offtopic">offtopic</a></li>
</ul>

<li> <a href="phpclub.ru/news">news</a></li>
</ul>

<li> <a href="www.livejournal.com">livejournal</a></li>

<ul>
<li> <a href="www.livejournal.com/dolboeb">dolboeb</a></li>

<li> <a href="www.livejournal.com/avva">avva</a></li>
</ul>
</ul>
*/
тут есть косяк с тем что вложенные ul не обрамлены li но это можно решить чуть усложнив, не суть - принцип я думаю понятен.
на самом деле наверняка есть ещё какие способы. не могу сказаьб чт получается прямо мега-просто, но бонусы будут на сильно усложненых проектах и постоянных ихменениях. обратите внимаение, ни строки html во view-коде и минимум логики в html-коде (load не в счет - ессно ему есть замена - положить в отдельный файл и открыть)
 

Фанат

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

пожалуй, мне стоит написать собственный обработчик такого шаблона, чтобы не быть голословным..

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

fisher

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

а твоим шаблоном сделать нельзя, тебе все равно надо что-то воткнуть внутрь item чтобы "замкнуть" это дело.

-~{}~ 13.12.06 20:27:

если ты напишешь код на пхп который по-твоему более понятный - я попробую привести ему аналогию на blitz

-~{}~ 13.12.06 20:51:

да, в догонку - ты посмотри внимательнее, там именно рекурсия и есть. ну просто несколько через одно место :)
 

Фанат

oncle terrible
Команда форума
на пхп я по-любому не напишу. Не знаю способоа.

то есть, знаю аж два, но они меня не устраивают.
лдин предложил Popoff, вот здесь: http://phpclub.ru/talk/showthread.php?postid=644369#post644369
а второй, чуть выше - С.
http://phpclub.ru/talk/showthread.php?postid=675732#post675732

В общем, на мой взгляд, на данной задаче адекватнее выглядит код Blitz. Буду думать.
 

fisher

накатила суть
кстати, с "правильной" рекурсией получается примерно так

Код:
My Tree
<ul> {{ tree() }} </ul>
{{BEGIN list}}
<li> {{ $title }}
<ul>
{{BEGIN item}}
<li> <a href="{{ $uri }}">{{ $title }}</a></li>
{{ END}}
{{ tree() }}
</ul>
</li>
{{ END}}
ну и прочий код почти такой же, только надо ссылку на текущую детку запоминать

Код:
class View extends Blitz {
    var $tmp_children_ref = NULL;

    function tree($node = array()) {
        if(empty($node)) {
            if(empty($this->tmp_node_ref)) {
                $node = $this->tree;
            } else {
                $node = $this->tmp_children_ref ;
            }
        }

        $list = '';
        foreach($node as $item) {
            if(!empty($item['children'])) {
                $this->tmp_children_ref = & $item['children'];
                $list .= $this->fetch('/list',$item);
            } else {
                $list .= $this->fetch('/list/item',$item);
            }
        }
        return $list;
    }
}

// но теперь уже парсить, tree зовется из самого шаблона
echo $View->parse();
-~{}~ 14.12.06 00:41:

и это эстетически круче, но вряд ли понятнее, кстати
 

crocodile2u

http://vbolshov.org.ru
Лично я предпочитаю оформлять дерево с пом. CSS - выставлять margin-left для узла по его уровню вложенности. Шаблоны (пхп или любые другие) в этом случае выглядят гораздо проще. В частности, можно воспользоваться самым простым из вариантов Фаната, лишь добавив туда (в элемент списка) плейсхолдер, отвечающий за margin.

Я понимаю, конечно, что дискуссия на самом деле не о том :) но тем не менее - это альтернатива :)
 

fisher

накатила суть
2crocodile2u
погоди тут есть тонкость. у тя не плоская структура или каждый элемент списка не отличается лишь margin-left по уровню вложенности - sublists должны быть обернуты в <ul>. ну в принципе можно забить на это, лишь бы выглядело как дерево :)..
 

crocodile2u

http://vbolshov.org.ru
fisher
Я об этом говорил ("Я понимаю, конечно, что дискуссия на самом деле не о том")... Мысль навеяна шаблоном, кот. привел Фанат. Он годится только для такого "плоского" варианта.
 
Сверху