php_templates

rudik

Developer
php_templates

пытаюсь подключить сабж вот что получется
dl('php_templates.so');

Warning: dl() [function.dl]: templates: Unable to initialize module Module compiled with module API=20020429, debug=0, thread-safety=0 PHP compiled with module API=20020429, debug=1, thread-safety=0 These options need to match in /home/rudenko/ft.php on line 3
 

tony2001

TeaM PHPClub
Module compiled with module API=20020429, debug=0, thread-safety=0 PHP compiled with module API=20020429, debug=1, thread-safety=0 These options need to match

либо модуль, либо РНР надо пересобрать так, чтобы эти опции совпадали.
 

BoFFiN

Новичок
Делаю так:
PHP:
<?php
$template = tmpl_open('templates/any_file.html');
if(что) {
     tmpl_context($template, 'row1');
     echo tmpl_parse($template);
     tmpl_close($template);
 }  else  {
     tmpl_context($template, 'row2');
     echo tmpl_parse($template);
     tmpl_close($template);
}
?>
//any_file.html
<html>
<tmpl:row1>
тра-та-та
</tmpl:row1>

<tmpl:row2>
кря-кря-кря
</tmpl:row2>
</html>

Почему-то не работает?
И где можно посмотреть побольше примеров, правильного применения php_templates,
кроме как http://tony2001.phpclub.net/ и http://php-templates.sourceforge.net/?
 

su1d

Старожил PHPClubа
прочитай ещё раз доку. tony2001 и я так старались -- писали её, а ты лишь просмотрел по диагонали и ничего не понял =)

hint: если заменить вызовы tmpl_context() на tmpl_iterate(), то получится кое-что в результате. но, так или иначе, это наверное будет не совсем то, что ты хочешь.
 

BoFFiN

Новичок
su1d
Th'xz! Разобрался... В первый раз прочёл доку невнимательно, и пропустил
строчку:
"По умолчанию пустые контексты (которые не содержат
переменных/тэгов внутри) не парсятся tmpl_parse().
Если вы хотите, чтобы пустой контекст
появился на странице - он должен быть итерирован.
Каждая последующая итерация результата не даст. "
Теперь у меня возникла такая проблема,
нужно чтоб он выводил всё по-порядку,

PHP:
$template = tmpl_open('any_file.html');  
 for($i = 0; $x<5; $x++) {   
    if(что-то) {
        tmpl_context ($template, '/row1');
        tmpl_iterate ($template);
	tmpl_set ($template, 'USER', $user);
               }
    elseif(что-то) {
        tmpl_context ($template, '/row2');
        tmpl_iterate ($template);
	tmpl_set ($template, 'USER', $user);
                   }
    ...      ...      ...
и т.д.
}
echo tmpl_parse ($template);
tmpl_close($template);
т.е. допустим в первую итерацию совпало условие 1,
а во вторую итерацию условие 2, и должен вывести вначале Data2, а потом Data1,
а не наоборот.

//any_file.html
HTML:
<html>
<tmpl:row1>
     Data1
</tmpl:row1>
<tmpl:row2>
   Data2
</tmpl:row2>
</html>
 

su1d

Старожил PHPClubа
стандартный приём: создаёшь ещё один контекст-wrapper, который и будешь итерировать, и внутри которого будут твои чередующиеся контексты:
PHP:
for($i=0; $i < 10; $i++) {
  tmpl_iterate($tmpl, 'rows');
  tmpl_set($tmpl, $i % 2 ? 'rows/row1' : 'rows/row2', $data_array);
}
 

BoFFiN

Новичок
su1d

Понятно... Th'Z!
Но вот в чём загвоздка:
PHP:
tmpl_set($tmpl, $i % 2 ? 'rows/row1' : 'rows/row2', $data_array);
Мне нужно указывать переменные явно, т.е:
PHP:
for($i=0; $i < 10; $i++) { 
tmpl_iterate($template, '/rows');  
  if($i==2)                                
 {
  tmpl_context ($template, '/row1');
  tmpl_set($template, 'USER1','1');         
 }

   if($i==3)    tmpl_set($template, 'rows/row2', '2' );  
   if($i==1)  tmpl_set($template, 'rows/row3', '3' );  
}
А html:
<html>
<tmpl:rows>

<tmpl:row1>
{USER1}
</tmpl:row1>

<tmpl:row2>
{USER2}
</tmpl:row2>

<tmpl:row3>
{USER3}
</tmpl:row3>

</tmpl:rows>
</html>

{USER1} не выводит, почему?!
А {USER2} и {USER3} работает, но это не подходит, потому что
там может быть несколько переменных.
 

su1d

Старожил PHPClubа
улови разницу между tmpl_context() и tmpl_iterate():
если первое работает лишь как "chdir", и само по себе не несёт каких либо действий (оно лишь сделано для твоего удобства, чтобы не набирать каждый раз полный путь), то второе -- действует как "mkdir" или даже вернее "cp -R".
 

BoFFiN

Новичок
su1d

<i>...если первое работает лишь как "chdir"...</i>
Ну так.. Логика:
PHP:
for($i=0; $i < 10; $i++) { 
tmpl_iterate($template, '/rows');   // Создаем Rows
  if($i==2)                                 
{ 
  tmpl_context ($template, 'rows/row1');  //Перех. на rows/row1
  tmpl_set($template, 'USER1','1');        //Выв. перем. в row1  
} 

   if($i==3)    tmpl_set($template, 'rows/row2', '2' );   
   if($i==1)  tmpl_set($template, 'rows/row3', '3' );   
}
<i>...и само по себе не несёт каких либо действий...</i>
Если она работает, как chdir, как она может не нести каких-либо действий... не понимаю :(

Пока писал, подумал, что можно сделать вот так, но будет ли это правильным:
PHP:
for($i=0; $i < 10; $i++) { 
tmpl_iterate($template, '/rows');   
  if($i==2)  tmpl_set($template, 'rows/row1/USER1','1');    
  if($i==3)  tmpl_set($template, 'rows/row2/USER2', '2' );   
  if($i==1)  tmpl_set($template, 'rows/row3/USER3', '3' );   
}
?
з.ы. спасибо.
 

su1d

Старожил PHPClubа
php_templates настолько гибок, что позволяет достичь одну и ту же цель совершенно разными способами, и очень трудно среди них выбрать лучший =)

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

я обычно пользуюсь простым правилом: перед тем, как внести данные в контекст, нужно его проитерировать.
поэтому в твоём же случае кажется лучше сделать так:
PHP:
tmpl_context($template, 'rows');
for($i=0; $i < 10; $i++) {
  tmpl_iterate($template, './'); // может придётся заменить на "../rows"
  if(1 == $i) tmpl_set($template, 'row'.$i.'/USER'.$i, $i);
  elseif(2 == $i) tmpl_set($template, 'row'.$i.'/USER'.$i, $i);
  else {
    // .....
  }
}
 
Сверху