Blitz: список

s12v

Новичок
Blitz: список

Пробую использовать шаблонизатор Blitz.

Хочу сделать список, элементы которого - ссылки либо текстовые строки.
Сделал шаблон:
PHP:
<!-- BEGIN list -->
  <!-- BEGIN href -->
    <a href="{$href)}">{$title}</a>
  <!-- END -->
  <!-- BEGIN text -->
    {$title}
  <!-- END -->
<!-- END -->
написал код:
PHP:
foreach($item_arr as $Item)
{
  if(false === $Item->href)
  { // ссылка не задана, это просто текст
    $this->block('/list/text', array('title' => $Item->title));
  }
  else
  { // ссылка задана
    $this->block('/list/href', array('href' => $Item->href, 'title' => $Item->title));
  }
}
На выходе после parse() получаю список, НО сначала идут все ссылки, потом все тексты.
Например, в исходном массиве (текст, ссылка, текст), а на выходе (ссылка, текст, текст).

Соответственно, если в шаблоне поменять местами контексты href и text, то получается наоборот - сначала тексты, потом ссылки :)

А как сохранить исходный порядок элементов?

-~{}~ 06.05.08 21:14:

Вроде бы так работает:
PHP:
<!-- BEGIN list -->
  <!-- BEGIN element -->
  {$fetch}
  <!-- END -->
  <!-- BEGIN fetch -->
    <!-- BEGIN href -->
      <a href="{$href}">{$title}</a>
    <!-- END -->
    <!-- BEGIN text -->
      {$title}
    <!-- END -->
  <!-- END -->
<!-- END -->
и
PHP:
foreach($item_arr as $Item)
{
  if(false === $Item->href)
  { // ссылка не задана, это просто текст
    $fetch = $this->block('/list/fetch/text', array('title' => $Item->title));
  }
  else
  { // ссылка задана
    $fetch = $this->block('/list/fetch/href', array('href' => $Item->href, 'title' => $Item->title));
  }
  $this->block('/list/element', array('fetch' => $fetch));
}
Это правильно? Выглядит немного громоздко...
 

fisher

накатила суть
например, так

PHP:
$body = "
<!-- BEGIN list -->
  <!-- BEGIN href -->
    <a href=\"{{\$href)}}\">{{\$title}}</a>
  <!-- END -->
  <!-- BEGIN text -->
    {{\$title}}
  <!-- END -->
<!-- END -->
";

$T = new Blitz();
$T->load($body);

$T->context('list');
for ($i=0; $i<10; $i++)
{
  $T->iterate();
  if ($i%2)
  { // ссылка не задана, это просто текст
    $T->block('text', array('title' => 'title #'.$i));
  }
  else
  { // ссылка задана
    $T->block('href', array('href' => 'href #'.$i, 'title' => 'title #'.$i));
  }
}

echo $T->parse();
когда зовется block на путь /a/b то автоматом не создается новая итерация для контекста a, только для b (ну то есть все чуть сложнее - там могут быть "пустые" или "очищенные" через clean или fetch итерации - тогда создаются, но только один раз, и это не наш случай). иначе получатся казусы для кучи других случаев.

важно понимать что работая с всеми этими методами мы всего лишь оперируем над очень простой структурой данных - массивом итераций - который можно всегда задампить через getIterations/dumpIterations, посмотреть что да как, ну и вообще там все легко читается. рекомендую прочесть http://alexeyrybak.com/blitz/quick_geek.html
 

fisher

накатила суть
да всегда пожалуйста. а ваш вариант с фетчем всё-таки жесть, не надо так :)
 

s12v

Новичок
да, фетч мне сразу не понравился :)

Кстати, еще вопрос: а можно оставлять комментарии в шаблоне, которые там и останутся? Т.е. не попадут в html при parse()
 

fisher

накатила суть
комментарии пропадают, потому что "<!-- " и " -->" тоже являются тегами. если внутри стоит синтаксически неверная конструкция - blitz поймет что скорее всего это комментарии, не будет это трогать вообще и оно останется при выводе. то есть <!-- start --> будет воспринят как метод start либо если его нет как переменная start и если она не установлена - то будет пусто. но <!-- start blabla --> уже не является синтаксически верной конструкцией, поэтому этот код останется без изменений.

альтернативный теги также можно отключить, пересобрав blitz с
#define BLITZ_SUPPORT_PHPT_TAGS_PARTIALLY 0
либо установив ini-переменные
blitz.phpt_ctx_left и blitz.phpt_ctx_right
во что-то отличное от "<!-- " и " -->"

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