php_templates - в чем может быть проблема?

JenyaWhite

Новичок
php_templates - в чем может быть проблема?

Apache/1.3.33 (Win32) PHP/5.0.4
Добавила новую библиотеку php_templates (версия 1.7.2-5.0.3). При запуске апач не ругается.
В index.php делаю:
1) выбираю данные из БД (они действительно выбираются):
$rs= $db->query( "SELECT fac_id, fac_name FROM faculty" );
2) $template = tmpl_open('tmpl.html');
while ( $r = $rs-> fetch_assoc_())
{
tmpl_iterate($template, 'row');
tmpl_set($template, 'row', $r);
}
tmpl_iterate($template, 'row');
tmpl_set($template, 'row', $r);
echo tmpl_parse($template);
А на экране появляется только:
fac_id fac_name. В чем может быть ошибка?
в html файле следующее:
<tmpl:row>
<tr> <td>{fac_id}</td><td>{fac_name}</td>
</tr>
</tmpl:row>
 

Groove

Новичок
$template = tmpl_open('tmpl.html');
while ( ... )
{
tmpl_context($template, '/row');
tmpl_iterate($template, '/row');
tmpl_set($template, 'fac_id', $xxxxxx);
}
echo tmpl_parse($template);
 

su1d

Старожил PHPClubа
while ( $r = $rs-> fetch_assoc_())
{
tmpl_iterate($template, 'row');
tmpl_set($template, 'row', $r);
}
tmpl_iterate($template, 'row');
tmpl_set($template, 'row', $r);


вот эти две выделенные строки загоняют "false" вместо всего контекста "row" со всем его содержимым, т.е. обнуляют его.
не нужны они здесь. просто убери их, и всё должно заработать.

tmpl_context() использовать необязательно. в действительности она нужна лишь в очень малом количестве случаев. достаточно лишь указывать полный путь в tmpl_iterate() / tmpl_set().
 

JenyaWhite

Новичок
Получилось только когда я так сделала:
while ( $x = $rs-> fetch_assoc_())
{
tmpl_context($template, '/row');
tmpl_iterate($template, '/row');
tmpl_set($template, 'fac_id', $x['fac_id']);
tmpl_set($template, 'fac_name', $x['fac_name']);
}
echo tmpl_parse($template);
 

su1d

Старожил PHPClubа
должно работать и вот так:
PHP:
while($x = $rs->fetch_assoc_())
{
  tmpl_iterate($template, 'row');
  tmpl_set($template, 'row', $x);
}
echo tmpl_parse($template);
 

su1d

Старожил PHPClubа
JenyaWhite
просто, начиная где-то с версии 1.6 или 1.7,
с контекстами можно обращаться точно так же, как с тэгами.

т.е.
PHP:
tmpl_set($template, 'row', 'doh!');
приведёт где-то вот к такому результату:
Код:
<table>doh!</table>
...причём после этого вызова в контексте теряются все раннее назначенные данные, и этот контекст превращается в тэг. любой последующий вызов tmpl_iterate() на него должен выдавать ошибку.
 

JenyaWhite

Новичок
Вопрос все на ту же тему про PHP_templates. Столкнулась с такой проблемой: делаю один запрос, выбираю данные. Потом для каждого выбранного результата выбираются еще ..и как бы все это вывести деревом ..всего 2 уровня. Можно вывести такое дерево с помощью PHP_templates?
 

Groove

Новичок
JenyaWhite
используй вложенные блоки в шаблоне

<tmpl:row>
<tr> <td>{fac_id}</td><td>{fac_name}</td>
</tr>
<tmpl:sub>
<tr> <td>{fac_id}</td><td>{fac_name}</td>
</tr>
</tmpl:sub>
</tmpl:row>
 

su1d

Старожил PHPClubа
вариантов много на самом деле.

если количество уровней задано зараннее, то можно сделать так:
Код:
<tmpl:items>
<ul>
  <tmpl:item><li>{title}
    <tmpl:subitems><ul>
      <tmpl:subitem><li>{title}</li></subitem>
    </ul></tmpl:subitems>
  </li></tmpl:item>
</ul>
</tmpl:items>
на первый взгляд кажется нагромождением сущностей, но на самом деле всё чётко и ясно.
в коде у тебя получится что-то типа:
PHP:
$sql = "SELECT cat_id, cat_title, item_id, item_title FROM ... ";
$q = $db->query($sql);
$cat = 0;
while($D = $db->fetch_array($q))
{
  if($cat != $D['cat_id'])
  {
    tmpl_iterate($tmpl, "items/item");
    tmpl_set($tmpl, "items/item", $D);
    $cat = $D['cat_id'];
  }

  tmpl_iterate($tmpl, "items/item/subitems/subitem");
  tmpl_set($tmpl, "items/item/subitems/subitem", $D);
}
для перехода к ситуации с неизвестным числом уровней нам потребуется паттерн для работы с неоднородными элементами:
Код:
<tmpl:pager>Pages: 
 <tmpl:item>
  <tmpl:off><a href="{url}">{title}</a></tmpl:off>
  <tmpl:on><strong>{title}</strong></tmpl:on>
 </tmpl:item>
</tmpl:pager>
я использую такую конструкцию для вывода линков на страницы разбитого списка.
tmpl_iterate() в этом случае вызывается только и только на контекст "pager/item", а tmpl_set() -- уже для нужного контекста: "pager/item/on" или "pager/item/off".

теперь можно рассмотреть и иерархию с нелимитированным кол-вом уровней, как, например, в форуме:
Код:
<tmpl:messages>Message list:
  <tmpl:item>
    <tmpl:level_in><ul>{empty_hack}</tmpl:level_in>
    <tmpl:message><li>{title}</li></tmpl:message>
    <tmpl:level_out></ul>{empty_hack}</tmpl:level_out>
  </tmpl:item>
</tmpl:messages>
в коде это будет выглядеть следующим образом:
PHP:
$sql = "SELECT msg_level, msg_title, msg_text FROM forum";
$q = $db->query($sql);
$level = 0;
while($D = $db->fetch_array($q))
{
  while($level > $D['msg_level']) 
  {
    tmpl_iterate($tmpl, "messages/item");
    tmpl_set($tmpl, "messages/item/level_out/empty_hack", " ");
    $level -= 1;
  }
  while($level < $D['msg_level']) 
  {
    tmpl_iterate($tmpl, "messages/item");
    tmpl_set($tmpl, "messages/item/level_in/empty_hack", " ");
    $level += 1;
  }

  tmpl_iterate($tmpl, "messages/item");
  tmpl_set($tmpl, "messages/item/message", $D);
}

while($level > 0) 
{
  tmpl_iterate($tmpl, "messages/item");
  tmpl_set($tmpl, "messages/item/level_out/empty_hack", " ");
  $level -= 1;
}
использование тэга {empty_hack} обусловлено тем, что движок не создаёт повторные итерации пустых контекстов (тех, в которых нет ни одного тэга с назначенным текстом).
 

JenyaWhite

Новичок
Уважаемый su1d! Спасибо Вам за такой полный ответ. Вы мне очень помогли.
 
Сверху