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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: както так
m0nya
Отправлено: 27 Января, 2011 - 12:19:39
Post Id


Новичок


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


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




Всем доброго времени суток, давно пытаюсь изучить PHP, но постоянно вылазают подводные камни в процессе обучения. Решил я для себя что самый лучший способ обучения это практика.

Писать отдельные модули (регистрация галлерей) не греет.

В общем решил сделать "заготовку для цмс".

И даже сумел выдрать шаблонизатор на основе цмс DLE:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class Template {
  4.  
  5.     public  $dir = '.';
  6.     public  $template = null;
  7.     public  $copy_template = null;
  8.     public  $data = array();
  9.     public  $block_data = array();
  10.     public  $result = array('info' => '', 'content' => '');
  11.     public  $template_parse_time = 0;
  12.  
  13. //задаём параметры основных переменных подгрузки шаблона
  14.  
  15.     public function set($name , $var) {
  16.         if (is_array($var) && count($var)) {
  17.             foreach ($var as $key => $key_var) {
  18.                 $this->set($key , $key_var);
  19.             } } else $this->data[$name] = $var;
  20.     }
  21.  
  22. //обозначаем блоки
  23.  
  24.     public function set_block($name , $var) {
  25.         if (is_array($var) && count($var)) {
  26.             foreach ($var as $key => $key_var) {
  27.                 $this->set_block($key , $key_var);
  28.             } } else $this->block_data[$name] = $var;
  29.     }
  30.  
  31. //производим загрузку каркасного шаблона
  32.  
  33.     public function load_template($tpl_name) {
  34.     $time_before = $this->get_real_time();
  35.         if ($tpl_name == '' || !file_exists($this->dir . DIRECTORY_SEPARATOR . $tpl_name)) { die ("Невозможно загрузить шаблон: ". $tpl_name); return false;}
  36.         $this->template = file_get_contents($this->dir . DIRECTORY_SEPARATOR . $tpl_name);
  37.         if ( stristr( $this->template, "{include file=" ) ) {
  38.             $this->template = preg_replace( "#\\{include file=['\"](.+?)['\"]\\}#ies","\$this->sub_load_template('\\1')", $this->template);
  39.         }
  40.         $this->copy_template = $this->template;
  41.     $this->template_parse_time += $this->get_real_time() - $time_before;
  42.     return true;
  43.     }
  44.  
  45. // этой функцией загружаем "подшаблоны"
  46.  
  47.     public function sub_load_template($tpl_name) {
  48.         if ($tpl_name == '' || !file_exists($this->dir . DIRECTORY_SEPARATOR . $tpl_name)) { die ("Невозможно загрузить шаблон: ". $tpl_name); return false;}
  49.         $template = file_get_contents($this->dir . DIRECTORY_SEPARATOR . $tpl_name);
  50.         return $template;
  51.     }
  52.  
  53. // очистка переменных шаблона
  54.     public function _clear() {
  55.     $this->data = array();
  56.     $this->block_data = array();
  57.     $this->copy_template = $this->template;
  58.     }
  59.  
  60.     public function clear() {
  61.     $this->data = array();
  62.     $this->block_data = array();
  63.     $this->copy_template = null;
  64.     $this->template = null;
  65.     }
  66. //полная очистка включая результаты сборки шаблона
  67.     public function global_clear() {
  68.     $this->data = array();
  69.     $this->block_data = array();
  70.     $this->result = array();
  71.     $this->copy_template = null;
  72.     $this->template = null;
  73.     }
  74. //сборка шаблона в единое целое
  75.     public function compile($tpl) {
  76.     $time_before = $this->get_real_time();
  77.     foreach ($this->data as $key_find => $key_replace) {
  78.                 $find[] = $key_find;
  79.                 $replace[] = $key_replace;
  80.             }
  81.     $result = str_replace($find, $replace, $this->copy_template);
  82.     if (count($this->block_data)) {
  83.         foreach ($this->block_data as $key_find => $key_replace) {
  84.                 $find_preg[] = $key_find;
  85.                 $replace_preg[] = $key_replace;
  86.                 }
  87.     $result = preg_replace($find_preg, $replace_preg, $result);
  88.     }
  89.     if (isset($this->result[$tpl])) $this->result[$tpl] .= $result; else $this->result[$tpl] = $result;
  90.     $this->_clear();
  91.     $this->template_parse_time += $this->get_real_time() - $time_before;
  92.     }
  93. //счётчик времени выполнения запросов сборки
  94.     public function get_real_time()
  95.     {
  96.         list($seconds, $microSeconds) = explode(' ', microtime());
  97.         return ((float)$seconds + (float)$microSeconds);
  98.     }
  99. }
  100.  
  101.  
  102.  
  103.  
  104.  
  105. $tpl    = new Template; //инициируем класс
  106. $tpl->dir = 'view/tpl'; //задаём местоположение папки с шаблонами
  107. $tpl->load_template('main.tpl'); //загружаем каркас
  108. $tpl->set('{sub_templ}', $tpl->sub_load_template('sub.tpl')); //подключаем код блока
  109.  
  110. //подставляем значения переменных
  111. $tpl->set('{var1}', 'блок2');
  112. $tpl->set('{var2}', 'блок3');
  113.  
  114. $tpl->compile('main'); //собираем шаблон
  115. echo $tpl->result['main']; //выводим результат работы
  116. $tpl->global_clear(); //очищаем все переменные для возможно следующего шаблона
  117. ?>


Подскажите пожалуйста возможные варианты как в таком шаблонизаторе выводить пхп в tpl файлах.

Растерялся

И если возможно немного о подводных камнях которые меня будут поджидать в разработке.
 
 Top
OrmaJever Модератор
Отправлено: 27 Января, 2011 - 12:34:33
Post Id



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


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


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




нету смысла что то выдирать если не понимаешь как оно работает.
Вот мой клас из 3 методов. С ним разобратся будет проще)
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class template
  3. {
  4.         private $file = '';
  5.         private $template = false;
  6.     private $vars = array();
  7.  
  8.         function __construct($file)
  9.         {
  10.                 $this->file = $file;
  11.  
  12.                 if(empty($this->file) or !file_exists($this->file))
  13.                 {
  14.                         exit('Не верный файл шаблона!');
  15.                 }
  16.  
  17.                 $this->template = file_get_contents($this->file);
  18.                 return true;
  19.  
  20.         }
  21.  
  22.         function set($key,$var)
  23.         {
  24.                 $this->vars[$key] = $var;
  25.         }
  26.  
  27.         function parse()
  28.         {
  29.                 if(count($this->vars) < 1) return false;
  30.  
  31.                 foreach($this->vars as $find => $replace)
  32.                 {
  33.                         $this->template = str_replace($find, $replace, $this->template);
  34.                 }
  35.  
  36.                 echo $this->template;
  37.                 return true;
  38.         }
  39. }
  40.  
  41. /*
  42. $tpl = new template(filename);  // (string) Имя файла с шаблоном
  43. $tpl->set(find, replace);               // (string) Что менять и на что менять
  44. $tpl-parse();                   //  Заменяем и выводим в браузер
  45. */
  46. ?>

Использовать просто
PHP:
скопировать код в буфер обмена
  1. $tpl = new template('index.tpl');
  2. $tpl->set('{content}', 'это контент');
  3. $tpl->set('{news}', 'это новости');
  4. $tpl-parse();


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
m0nya
Отправлено: 27 Января, 2011 - 12:59:46
Post Id


Новичок


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


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




Если можно расскажите чем отличается ваш шаблонизатор ?
$tpl-parse(); немного ошибочка была $tpl->parse();

Как вы пользуетесь самими шаблонами ?
$tpl->set('{content}', 'это content');
$tpl->set('{news}', 'это новости');

Точнее как бы мне сделать так:
$tpl->set('{content}', 'module.php');

(Отредактировано автором: 27 Января, 2011 - 13:09:31)

 
 Top
DiosPA
Отправлено: 27 Января, 2011 - 13:24:15
Post Id



Частый гость


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


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




m0nya а в обще шаблонизатор очень необходимо использовать?
просто используй include
тоесть всё по старинке
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <head>
  3. <title>Сайт</title>
  4. </head>
  5. <body>
  6. <?php include "header.php" ; ?>
  7. <?php include "content.php" ; ?>
  8. </body>
  9. </html>
  10.  


лично я конечно за шаблонизаторы но не тогда когда ты php начинаешь учить сначала надо на простом примере всё понять потом более к сложному переходить а шаблонизатор вобще конечно свой хорошо иметь Улыбка
 
 Top
OrmaJever Модератор
Отправлено: 27 Января, 2011 - 13:31:48
Post Id



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


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


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




m0nya пишет:
Если можно расскажите чем отличается ваш шаблонизатор ?

Он попроще. В нём всего 3 метода, а работает так же как и шаблонизатор из дле.
m0nya пишет:
Как вы пользуетесь самими шаблонами ?

Ну вот пример для стандартного шиблона dle. mail.tpl.
В нём есть слова обведёные в {фигурные скобки}. На месте этих фраз должно быть динамичное содержимое. Вот шаблонизатор и подставляет на место этих слов содержимое.
PHP:
скопировать код в буфер обмена
  1. $tpl = new template('dir/mail.tpl'); // открываем файл с шаблоном
  2. $tpl->set('{THEME}', 'default');
  3. $tpl->parse(); // выводим то что заменили.
  4.  

m0nya пишет:
Точнее как бы мне сделать так:
$tpl->set('{content}', 'module.php');

Тоесть нужно вставить содержимое module.php место {content}?
Файл вставить нельзя, можно переменую. Например:
PHP:
скопировать код в буфер обмена
  1. $content = 'Здесь будет контент который можно взять ил базы или ещё каким либо способом';
  2. $tpl->set('{content}', $content);


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
metra
Отправлено: 27 Января, 2011 - 21:51:11
Post Id



Гость


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


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




OrmaJever, пишу CMS для использования сугубо в коммерческих проектах заказчиков.

100% надо шаблонизотор, ибо дизайнеры отдельно, прогеры отдельно.
Так как вы вроде бы разбираетесь в построении своей системы шаблонов (MVC), можете дать ссылки почитать? Цель - создание своей системы шаблонов.
 
 Top
OrmaJever Модератор
Отправлено: 27 Января, 2011 - 22:04:04
Post Id



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


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


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




Я даже не знаю как ещё можно обьяснить)) Шаблонизаторыдовольно не сложная тема, если хотите прочиатйте http://yandex[dot]ua/yandsearch?text[dot][dot][dot]ld=ua&lr=966


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
metra
Отправлено: 28 Января, 2011 - 09:20:48
Post Id



Гость


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


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




OrmaJever, согласен, разобрался за 30 минут с теорией) приступаю к практике.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB