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 »   

> Описание: Нужно чуточку больше функций и пару исправлений
chuikoff
Отправлено: 09 Апреля, 2010 - 13:04:56
Post Id



Новичок


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


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




Приветствую! У себя нашёл старый шаблонизатор, но для меня очень удобный, а главное маленький и быстрый, но есть пару недочётов. вот его исходный код:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class parse_class
  4.     {
  5.     var $vars     = array();
  6.     var $template;
  7.  
  8.     function get_tpl($tpl_name)
  9.       {
  10.       if(empty($tpl_name) || !file_exists($tpl_name))
  11.         {
  12.         return false;
  13.         }
  14.       else
  15.         {
  16.         $this->template  = file_get_contents($tpl_name);
  17.         }
  18.       }
  19.     function set_tpl($key,$var)
  20.       {
  21.       $this->vars[$key] = $var;
  22.       }
  23.     function tpl_parse()
  24.       {
  25.       foreach($this->vars as $find => $replace)
  26.              {
  27.              $this->template = str_replace($find, $replace, $this->template);
  28.              }
  29.       }
  30.     }
  31. $parse = new parse_class;
  32. ?>
  33.  


Мне понравилось что применение его очень простое, достаточно:

PHP:
скопировать код в буфер обмена
  1.  
  2. //парсируем шаблон
  3. include("template.php");
  4. $parse->get_tpl('templates/index.tpl');
  5. $parse->set_tpl('{TITLE}',$name_site);
  6. $parse->set_tpl('{CONTENT}',$content);
  7. $parse->set_tpl('{HEADER}',$header);
  8. $parse->tpl_parse();
  9. print $parse->template;
  10.  


А в index.tpl
просто пишем тэг {TITLE} и получаем переменную...) для дизайнеров так куда понятнее..

Вот, а мне нужна такая штука...у меня есть файлы с информацией, например news.html,
нужно дописать парсер так, что бы можно было содержимое этого файла, представить таким же тэгом, например {NEWS} в шаблоне. Я пробовал дописывать такой вариант, но увы не получилось:
PHP:
скопировать код в буфер обмена
  1.  
  2.  function inc_tpl($keys,$vars)
  3.       {
  4.       $this->vars[$keys] = $vars;
  5.       }
  6.  function inc_parse()
  7.       {
  8.       foreach($this->vars as $set => $inc)
  9.              {
  10.                          $inc = file_get_contents($inc);
  11.              $this->template = str_replace($set, $inc, $this->template);
  12.              }
  13.       }
  14.  

Надеюсь доходчиво объяснил ситуацию, прошу вашей помощи Закатив глазки
Подскажите пожалуйста что делать?
 
 Top
Тоха
Отправлено: 09 Апреля, 2010 - 13:33:25
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Март 2010  
Откуда: Орел, Россия


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




как вариант предлагаю добавить функцию получения контента из файла.
PHP:
скопировать код в буфер обмена
  1. function set_tpl_file($key,$file)
  2.       {
  3.       if(empty($file) || !file_exists($file))
  4.         {
  5.         return false;
  6.         }
  7.       else
  8.         {
  9.         $this->vars[$key] = file_get_contents($file);
  10.         }
  11.       }
 
 Top
JustUserR
Отправлено: 09 Апреля, 2010 - 15:08:09
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




chuikoff пишет:
нужно дописать парсер так, что бы можно было содержимое этого файла, представить таким же тэгом, например {NEWS} в шаблоне
Если вам нужен универсальный способ добавления шаблонов по имени файла/раздела то можете сделать так - пишите или получаете из базы список всех основных разделов и для каждоо из них делаете что-то типа $parse->set_tpl("{$FILE}",file_get_contents("path/to/$FILE")); Если данные берутся из БД то просто вставляете туда переменнуюс обрботанным ресурсом БД - если генерируются каким-то еще PHP-скриптом то соответственно вызывается с помощью CURL/sockets и тд
Здесь только одна проблема в том что ваш шаблонизатор подразумевает сразу вставку всех замен - а если это большие страницы и их достаточно много то это лишний расход памяти - так что лучше модифицировать шаблонизатор чтобы он делал такой поиск и добавление при первой встрече соответствующего шаблона


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
CenapaTop
Отправлено: 09 Апреля, 2010 - 15:42:34
Post Id



Частый гость


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


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




PHP:
скопировать код в буфер обмена
  1. class parse_class
  2.     {
  3.     var $vars     = array();
  4.                 var $tpls = array();
  5.     var $template;
  6.  
  7.     function get_tpl($tpl_name)
  8.       {
  9.       if(empty($tpl_name) || !file_exists($tpl_name))
  10.         {
  11.         return false;
  12.         }
  13.       else
  14.         {
  15.         $this->template  = file_get_contents($tpl_name);
  16.         }
  17.       }
  18.                        
  19.                 function add_tpl($name, $add_tpl)
  20.                         {
  21.                         if(empty($add_tpl) || !file_exists($add_tpl))
  22.         {
  23.         return false;
  24.         }
  25.       else
  26.         {
  27.         $this->tpls[$name]  = file_get_contents($add_tpl);
  28.         }
  29.                         }
  30.                
  31.     function set_tpl($key,$var)
  32.       {
  33.       $this->vars[$key] = $var;
  34.       }
  35.                        
  36.     function tpl_parse()
  37.       {
  38.         if (!empty($this->tpls)) foreach($this->tpls as $n=>$t) $this->template = str_replace($n, $t, $this->template);
  39.       foreach($this->vars as $find => $replace)
  40.              {
  41.              $this->template = str_replace($find, $replace, $this->template);
  42.              }
  43.       }
  44.     }
  45. $parse = new parse_class;
  46. $parse->get_tpl('index.html');
  47. $parse->add_tpl('{NEWS}', 'news.html');
  48. $parse->set_tpl('{TITLE}', 'тайтлик');
  49. $parse->tpl_parse();
  50. echo $parse->template;
 
 Top
JustUserR
Отправлено: 09 Апреля, 2010 - 17:09:35
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




CenapaTop пишет:
$parse->get_tpl('index.html');
$parse->add_tpl('{NEWS}', 'news.html');
Неплохо но при большом числе файлов
JustUserR пишет:
Здесь только одна проблема в том что ваш шаблонизатор подразумевает сразу вставку всех замен - а если это большие страницы и их достаточно много то это лишний расход памяти - так что лучше модифицировать шаблонизатор чтобы он делал такой поиск и добавление при первой встрече соответствующего шаблона


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
chuikoff
Отправлено: 10 Апреля, 2010 - 01:46:06
Post Id



Новичок


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


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




Цитата:

Здесь только одна проблема в том что ваш шаблонизатор подразумевает сразу вставку всех замен - а если это большие страницы и их достаточно много то это лишний расход памяти - так что лучше модифицировать шаблонизатор чтобы он делал такой поиск и добавление при первой встрече соответствующего шаблона

Вот здесь и фишка в том, что файлы у меня подразумеваются маленькие, например форма входа login.html там всего-то 5 строк...и все соединения в основном файле index.php с шаблонами подразумеваются с ajax, т.е. подгрузка будет идти, поэтому мне была важна это функция:

function set_tpl_file($key,$file)

Вобщем-то спасибо всем кто помог с основой, если есть у кого ещё предложения по улучшению шаблонизатора (не в ущерб уже готовому), буду рад выслушать...)
 
 Top
Toxa
Отправлено: 10 Апреля, 2010 - 12:09:40
Post Id



Посетитель


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


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

[+]


chuikoff пишет:

Вот здесь и фишка в том, что файлы у меня подразумеваются маленькие, например форма входа login.html там всего-то 5 строк...и все соединения в основном файле index.php с шаблонами подразумеваются с ajax, т.е. подгрузка будет идти, поэтому мне была важна это функция:

function set_tpl_file($key,$file)

Есть еще такая очень удобная вещь для загрузки отдельных элементов страницы XML + XSLT.


-----
Удобный сервис для хранения файлов
 
 Top
Тоха
Отправлено: 10 Апреля, 2010 - 12:13:22
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Март 2010  
Откуда: Орел, Россия


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




Ух ты! У меня была старая рега!
 
 Top
JustUserR
Отправлено: 10 Апреля, 2010 - 13:51:58
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




chuikoff пишет:
Вот здесь и фишка в том, что файлы у меня подразумеваются маленькие, например форма входа login.html там всего-то 5 строк...
Может быть в конкретном случе файлы и небольшие но всегда желательно думать и о расширении проекта - просто приведенных подход не совем хорош тем что в нем сначала записываются в память все возможные значения подстановок и протом проичходит замена - при этом часть из них может вообще не потребоваться - и в этом плаен загрузка по требованию более эффективна
chuikoff пишет:
И все соединения в основном файле index.php с шаблонами подразумеваются с ajax, т.е. подгрузка будет идти, поэтому мне была важна это функция
Если запрос блоков происходит с клиентской стороны с помощью Iframe или AJAX к примеру то это другое дело - но в таком случае зачем парсить эти блоки на сервере в PHP-скрипте - если можно происто передать ID для загрузки блоков и с помощью JS уже выполнять конкретную загрузку и копирование даных в innerHTML


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
chuikoff
Отправлено: 12 Апреля, 2010 - 11:30:18
Post Id



Новичок


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


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




Согласен ваш способ хорош, вплане быстродействия, но я пока не хочу лезть туда, куда не понимаю, у меня с ООП в пхп плоховато...вот, подскажите пожалуйста как сделать include файла in.php, что бы вместо {INC} например подключался php-файл?
Я пробовал по старому типу, только функцию заменить, но опять траблы:
PHP:
скопировать код в буфер обмена
  1. function inc_tpl_file($key,$file){
  2. if(empty($file) || !file_exists($file))
  3. {return false;}
  4. else {$this->vars[$key] = include($file);}}

Вместо подключаемого файла выходит "1", и подключаемый файл встаёт не туда где этот системный тэг {INC} и именно в самое начало index.php Скажите пожалуйста почему так происходит, и как нужно переписать функцию.
 
 Top
JustUserR
Отправлено: 13 Апреля, 2010 - 15:58:28
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




chuikoff пишет:
$this->vars[$key] = include($file);
Функция include не сичтывает содержимое файла а пытается его исполнить как PHP-скрипт - поэтому замените ее в данном случае на fopen/fgets или проще file_get_contents


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
chuikoff
Отправлено: 14 Апреля, 2010 - 06:11:25
Post Id



Новичок


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


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




Цитата:
Функция include не сичтывает содержимое файла а пытается его исполнить как PHP-скрипт - поэтому замените ее в данном случае на fopen/fgets или проще file_get_contents

Я так делал но в итоге на выходе я получаю:
displayRating("Site",5); ?>

А в исходном коде:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <div class='clear'></div><hr>
  3. <?php require_once('submitRating.php'); ?>
  4. <script language="javascript" type="text/javascript" src="ext/rat/maxrating.js"></script>
  5. <?php $handler->displayRating("Site",5); ?>
  6.  

Это ведь не нормально видеть в сгенерированном html коде, необработанные php команды.
Получается что он просто взял содержимое файла на сервере, а не его готовый html результат.
 
 Top
JustUserR
Отправлено: 14 Апреля, 2010 - 09:21:20
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




JustUserR пишет:
так делал но в итоге на выходе я получаю:
Теперь стало понятно что именно вы хотите - чтобы определенные шаблоны заменялись вставкой соответствующего PHP-кода из подключаемого файла В таком случае можете поступить так - в вашем PHP-скрипте который отвечает за подготовку шалонов вы создаете временный PHP-скрипт в который вставляете ваш текст и PHP-код а также с помощью file_get_contents вставляете содержимое подключаемых файлов - после чего делаете include этого временно файла и получаете результат При таком подходе желательно тиметь механизм который будет время от времени удалять эти временные файлы


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
chuikoff
Отправлено: 14 Апреля, 2010 - 11:24:19
Post Id



Новичок


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


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




Цитата:
Теперь стало понятно что именно вы хотите - чтобы определенные шаблоны заменялись вставкой соответствующего PHP-кода из подключаемого файла В таком случае можете поступить так - в вашем PHP-скрипте который отвечает за подготовку шалонов вы создаете временный PHP-скрипт в который вставляете ваш текст и PHP-код а также с помощью file_get_contents вставляете содержимое подключаемых файлов - после чего делаете include этого временно файла и получаете результат При таком подходе желательно тиметь механизм который будет время от времени удалять эти временные файлы

А есть попробовать буфер юзать, типа ob_start();
ob_get_contents();
??? Как лучше?
 
 Top
JustUserR
Отправлено: 15 Апреля, 2010 - 13:16:47
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




chuikoff пишет:
А есть попробовать буфер юзать, типа ob_start(); ob_get_contents(); ??? Как лучше?
Можно конечно использовать и буфер но здесь получается такая штука - ведь подключаемый файл является PHP-скриптом то есть программой и следовательно может не только выводить определенный набор информации но и выплнять какие-то действия Если вы безусловно подключте данный файл то он начет выполятя и вы не можете его так просто проконтролировать (В частности он сам сможет сбоить буфер) - а в случае парсинга и последущего его подключения он заведомо будет работать и выводить именно то что вам нужно


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB