Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: как написать удобный шаблонизатор
Форумы портала PHP.SU » PHP » Программирование на PHP » как написать удобный шаблонизатор

Страниц (2): [1] 2 »
 

1. scuter - 09 Мая, 2008 - 19:32:02 - перейти к сообщению
я написал пару функций через которые шаблонизирую страници,
раньше этого было достаточно, но сейчас мне необходимо вставить в него конструкции хотябы элементарный IF, подскажите как это сдело по проще и побыстрее,
вот функции шаблонизации,
PHP:
скопировать код в буфер обмена
  1. function tpl_str($haystack, $needle)
  2. {
  3.         return strstr('<--<>'.$haystack.'<>-->', $needle);
  4. }
  5.  
  6. function tpl_replace($search, $replace, $subject)
  7. {
  8.         return str_replace('<--<>'.$search.'<>-->', $replace, $subject);
  9. }
  10.  
  11. function tpl_array_replace($replace, $subject)
  12. {
  13.         if(is_array($replace))
  14.         {
  15.                 foreach ($replace as $key => $val)
  16.                 {
  17.                         if(is_string($val) || is_numeric($val))
  18.                         {
  19.                                 $subject = tpl_replace($key, $val, $subject);
  20.                         }
  21.                 }
  22.                 return $subject;
  23.         }
  24.         else
  25.         {
  26.                 return '';
  27.         }
  28. }
2. EuGen - 09 Мая, 2008 - 21:32:47 - перейти к сообщению
Не понял суть задачи, попробуйте еще раз.
3. scuter - 10 Мая, 2008 - 03:55:54 - перейти к сообщению
просто в различных других шаблонизаторах,
есть конструкции и цыклы (if, for, switch),
через те функции которые есть можно просто проставить маркеры вшаблоне и вывести через эти функции,
примерно так,
PHP:
скопировать код в буфер обмена
  1. $tpl = file_get_contents('./tpl/index.tpl');
  2. $array = array('top' => 'Шапка', 'left' => 'левый блок', 'right' => 'правый блок', 'content' => 'материал');
  3. $html = tpl_array_replace($array, $tpl);
  4. print $html;


шаблон может быть таким,
CODE (text):
скопировать код в буфер обмена
  1. <table width="100%" border="0" cellpadding="0" cellspacing="0">
  2.         <tr>
  3.                 <td colspan="3"><!--<>top<>--></td>
  4.         </tr>
  5.         <tr>
  6.                 <td><!--<>left<>--></td>
  7.                 <td><!--<>content<>--></td>
  8.                 <td><!--<>right<>--></td>
  9.         </tr>
  10. </table>

функция берёт ключи массива и заменяет их на содержимое,
ну так вот как сделать конструкцию что бы в шаблоне можно было сделать так,
CODE (text):
скопировать код в буфер обмена
  1. <table width="100%" border="0" cellpadding="0" cellspacing="0">
  2.         <!--<>if(top)<>--><tr>
  3.                 <td colspan="3"><!--<>top<>--></td>
  4.         </tr><!--<>endif(top)<>-->
  5.         <tr>
  6.                 <!--<>if(left)<>--><td><!--<>left<>--></td><!--<>endif(left)<>-->
  7.                 <!--<>if(content)<>--><td><!--<>content<>--></td><!--<>endif(content)<>-->
  8.                 <!--<>if(right)<>--><td><!--<>right<>--></td><!--<>endif(right)<>-->
  9.         </tr>
  10. </table>
4. EuGen - 10 Мая, 2008 - 18:36:44 - перейти к сообщению
А почему бы не сделать это не в html а в php?
То есть if(чего-то), то заменять на одно, иначе заменять на другое. Или не в этом суть?
5. scuter - 10 Мая, 2008 - 20:19:51 - перейти к сообщению
всё просто,
когда я вытаскиваю данные из базы,
всё это дело сразу проходит через шаблонизатор,
когда текста в ячейке нет, это дело заменяется на пустату,
а когда в базе присутствуют ссылки на картинки,
вот с этим получился косяк, пустую картинку отображать нельзя,
и профильтровань переменную которую получаю из базы тоже не могу,
так как таблици создаю не я, поэтому и понадобилось вставить конструкцию.
6. valenok - 11 Мая, 2008 - 15:33:34 - перейти к сообщению
evalom значит.
str_replace("if()",eval(),$str );
7. scuter - 11 Мая, 2008 - 16:56:47 - перейти к сообщению
Цитата:
evalom значит.
str_replace("if()",eval(),$str );

а это как,
я как то сомниваюсь что такое дело прокатит.
PHP:
скопировать код в буфер обмена
  1. function tpl_replace($search, $replace, $subject)
  2. {
  3.     $subject = str_replace("if()",eval(),$subject );
  4.     return str_replace('<--<>'.$search.'<>-->', $replace, $subject);
  5. }
8. valenok - 11 Мая, 2008 - 18:19:59 - перейти к сообщению
Ну так точно не будет работать.
Шаблонизаторы такого рода пишут с парсером .
9. -SCHATTEN- - 12 Мая, 2008 - 10:50:18 - перейти к сообщению
Зачем изобретать велосипед ? юзайте готовые обработчики
10. SION-ZENIT - 12 Мая, 2008 - 11:10:35 - перейти к сообщению
SMARTY
11. scuter - 12 Мая, 2008 - 17:30:56 - перейти к сообщению
Радость Радость Радость
Цитата:
SMARTY

а вот смарти тут савсем не катит,
я так понимаю ни кто париться с этим делом не хочет,
придётся мне самому попариться.
12. -SCHATTEN- - 13 Мая, 2008 - 08:17:23 - перейти к сообщению
Ну phptal поставь. Тоже очень даже хороший шаблонизатор. И почему смарти не подходит ?
13. scuter - 13 Мая, 2008 - 14:14:14 - перейти к сообщению
Цитата:
И почему смарти не подходит ?

смарти занимает много места частенько выдаёт савсем ненужные веши,
там очень большая фильтрация кода, которая савсем не нужна,
к тому же он может вывести то что ненадо выводить,
коточе сптошной косяк в результате получается.
14. Stierus - 26 Января, 2009 - 16:25:06 - перейти к сообщению
Вижу, что тема старая, но стало интересно:
Цитата:
коточе сптошной косяк в результате получается.

не мог бы примеры привести? Сколько работал со смарти - всегда как часы, а тут такое - любопытство разыгралось, действительно есть проблема или всё из-за кривых рук.
15. EuGen - 26 Января, 2009 - 17:09:45 - перейти к сообщению
Смарти вещь хорошая, но из-за того, что тяжеловат, не очень люблю. Но так вообще других компромиссов в альтернативу вспомнить не могу.

 

Powered by ExBB FM 1.0 RC1