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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Начал писать свой шаблонизатор(мини)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
etoYA
Отправлено: 19 Февраля, 2012 - 21:00:18
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. class Template {
  3.         private $dir = './templates/'; // папка с шаблонами
  4.         private $vars = array(); // переменные
  5.         private $template; // шаблон
  6.        
  7.         function load($name) { // загрузка шаблона
  8.                 if (!is_dir($this->dir.$name)) $name = 'default'; // если шаблона не существует, то подключить стандартный шаблон
  9.                 $this->template =  file_get_contents($this->dir.$name.'/'.'main.tpl'); // подключение главного шаблона
  10.                 // сканирование папки с шаблоном для определения подключаемых щаблонов
  11.                 $scan = scandir($this->dir.$name);
  12.                 foreach($scan as $file) {
  13.                         if (is_file($this->dir.$name.'/'.$file)) {
  14.                                 $tpl[] = substr($file, 0, -4);
  15.                         }
  16.                 }
  17.                 // создание шаблона
  18.                 for($i=0; $i<count($tpl); $i++) {
  19.                         $this->template = str_replace(strtoupper('{'.$tpl[$i].'}'), file_get_contents($this->dir.$name.'/'.$tpl[$i].'.tpl'), $this->template);
  20.                 }
  21.                 echo $this->template;
  22.         }
  23. }
  24.  


Тут пока только 1 метод, над другими еще думаю, что вы скажете, что сразу переделывать(и почему)... Просто не хочется, чтобы потом все накрылось)
(Добавление)
Работает он так: папка templates в ней папки с шаблонами default, и.т.д
В папке с шаблоном

main.tpl
header.tpl
footer.tpl
и.т.д
css
-style.css
img
-картинки

вот мейн.тпл
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <link rel="stylesheet" type="text/css" href="templates/default/css/style.css" />
  7. <title>{TITLE}</title>
  8. </head>
  9. <body>
  10. <div id="wrapper">
  11.         {HEADER}
  12.         {NAVIGATION}
  13.         {CONTENT}
  14.         {RIGHTCOLLUM}
  15.         {FOOTER}
  16. </div>
  17. </body>
  18. </html>
  19.  
 
 Top
DelphinPRO
Отправлено: 19 Февраля, 2012 - 21:41:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




На мой взгляд написание "подстановочных" шаблонизаторов непрактично в соотношении затраченного на разработку времени к его функциональным возможностям. Допустим нам нужно вывести таблицу. Скрипт располагает данными в виде массива. Как его вывести в шаблоне? Приходит в голову решение вроде такого:
CODE (html):
скопировать код в буфер обмена
  1. {for $data => $item}
  2. <tr><td>{$item.title}</td><td>{$item.value}</td></tr>
  3. {endfor}

Соответственно нужно писать синтаксический анализатор. А потом еще и компилятор в php-код. Ведь не будете же вы при каждом обращении парсить шаблоны?
В результате имеем много потраченного времени на изобретения велосипеда, который по функционалу и рядом не валяется с такими шаблонизаторами как smarty или twig.

Согласен, что для простых проектов smarty бывает излишен, и хочется написать что-то простое и свое.
И считаю, что для таких шаблонизаторов лучше всего использовать нативный php в сочетании в ob-функциями.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Okula
Отправлено: 19 Февраля, 2012 - 21:51:36
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




А я написал себе шаблонизатор который распознаёт переменные обозначенные через точку как массив и имеет возможность прокручивания информации в цикле без перезагрузки шаблона Улыбка
 
 Top
DelphinPRO
Отправлено: 19 Февраля, 2012 - 22:14:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




т.е. синтаксический анализ все равно пришлость делать?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
etoYA
Отправлено: 19 Февраля, 2012 - 22:28:16
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




DelphinPRO, да я не буду делать циклы, и.т.д Мне главное вставить переменную, возможно условие, и собрать в кучу шаблоны. Сбор в кучу вообще нормально реализован?
 
 Top
Okula
Отправлено: 19 Февраля, 2012 - 22:40:27
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




DelphinPRO пишет:
т.е. синтаксический анализ все равно пришлость делать?

Ну када же без этого Улыбка
Разбор делал с помощью регулярок, вот только кэш дописать всё времени нет.
 
 Top
OrmaJever Модератор
Отправлено: 20 Февраля, 2012 - 01:36:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




мне кажется шаблонизаторы такого типа вобще бред, писать посути интерпретатор на интерпретируемом языке это слишком. Нужно делать как в wordpress.
<?=$content;?> место {content} и шаблонизатора, и жизнь прекрасна.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DelphinPRO
Отправлено: 20 Февраля, 2012 - 05:46:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




etoYA пишет:
Мне главное вставить переменную, возможно условие, и собрать в кучу шаблоны. Сбор в кучу вообще нормально реализован?

Если шаблоны настолько простые будут, то я бы по другому подошел. Сначала регулярками распарсил бы главный шаблон, чтобы выцепить из него все метки типа {METKA}, потом в циклу пробежался бы по полученному массиву меток с проверкой: если файл с таким именем есть, то меняем метку на его содержимое. Если файла нет, просто убираем метку, заменяя ее пустой строкой. В этом случае легче сделать рекурсию, когда в подшаблон нужно вставить еще одну метку.
OrmaJever пишет:
мне кажется шаблонизаторы такого типа вобще бред, писать посути интерпретатор на интерпретируемом языке это слишком.
Такие шаблонизаторы больше похожи на компиляторы Улыбка Они один раз парсят шаблон и компилируют его в нативный php-код, который кэшируется и в дальнейшем используется до изменения шаблонов. Какой подход лучше - вопрос достаточно холиварный, у обоих есть и плюсы и минусы, которые сотни раз уже обсуждались.

(Отредактировано автором: 20 Февраля, 2012 - 05:48:26)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
sKaa
Отправлено: 20 Февраля, 2012 - 07:13:32
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


DelphinPRO пишет:
На мой взгляд написание "подстановочных" шаблонизаторов непрактично в соотношении затраченного на разработку времени к его функциональным возможностям
У вас очень не далекий взгляд на суть проблемы... Допустим я реализовал у себя вот такую возможность :
CODE (html):
скопировать код в буфер обмена
  1. <table>
  2.   <tr>
  3.       <th>Users ID</th>
  4.       <th>Users Name</th>
  5.   </tr>
  6. <repeat group="{{@users}}" key="{{ @id }}" value="{{ @name }}">
  7.   <tr class="{{ @key%2?'u_green':'u_gray' }}">
  8.       <td>{{ @key }}</td>
  9.       <td class="{{ (strlen(@name)<=2)?'warn':'not' }}">{{ @name }}</td>
  10.   </tr>
  11. </repeat>
  12. </table>

Я наверное обплюю того человека который мне скажет - что это не практично. Так-же есть синтаксис :
<?=$qwe?> - в шаблон можно передать любую переменную и объект.
{CONTENT} - ну и парсер.
Нужно учитывать, что мой шаблонизатор тратит время только первый раз при компиляции, далее он уже готовый шаблон загружается из кэш файла (сейчас делаю поддержку memcache).
 
 Top
DelphinPRO
Отправлено: 20 Февраля, 2012 - 07:44:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




sKaa пишет:
У вас очень не далекий взгляд на суть проблемы...
возможно Улыбка
sKaa пишет:
Я наверное обплюю того человека который мне скажет - что это не практично

это то же самое что и нативный foreach, да и компилируется он наверное в него же?
sKaa пишет:
Нужно учитывать, что мой шаблонизатор тратит время только первый раз при компиляции, далее он уже готовый шаблон загружается из кэш файла
Так оно и должно быть, я писал выше -
DelphinPRO пишет:
Такие шаблонизаторы больше похожи на компиляторы Они один раз парсят шаблон и компилируют его в нативный php-код, который кэшируется и в дальнейшем используется до изменения шаблонов.


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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
sKaa
Отправлено: 20 Февраля, 2012 - 07:48:02
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


DelphinPRO, бесят twig и smarty своим большим размером, своим хламом, да, что уж там темнить - в принципе бесят чужие, некрасивые решения для тех кто не может сделать сам.
 
 Top
DelphinPRO
Отправлено: 20 Февраля, 2012 - 07:50:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
snikers987
Отправлено: 20 Февраля, 2012 - 09:20:46
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Ну свой велосипед всегда роднее для своей попы, и блестит, и едет быстрее. Радость

(Отредактировано автором: 20 Февраля, 2012 - 09:21:29)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
etoYA
Отправлено: 20 Февраля, 2012 - 13:47:41
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




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

А на счет регулярок, что то у меня с ними не получается...
 
 Top
etoYA
Отправлено: 23 Февраля, 2012 - 09:50:21
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




Подскажите пожалуйста, как мне организовать

вот такое
PHP:
скопировать код в буфер обмена
  1.  
  2. [LEFTCOLLUM]
  3.      dasda
  4. [/LEFTCOLLUM]
  5.  


PHP:
скопировать код в буфер обмена
  1. $this->template = str_replace(strtoupper('{'.$tpl[$i].'}'), file_get_contents($this->dir.$name.'/'.$tpl[$i].'.tpl'), $this->template);


Что-то типо этого, но чтобы подключало файл [SOMETPL] sometext [/SOMETPL]

вот код SOMETPL

CODE (html):
скопировать код в буфер обмена
  1.  
  2. <div id="sometpl"></div>
  3.  


дайте наводку... ;))

(Отредактировано автором: 23 Февраля, 2012 - 09:50:41)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB