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 :: Парсер всех подключенных шаблонов (include)

 PHP.SU

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


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

> Без описания
Slash Zn
Отправлено: 02 Августа, 2015 - 05:36:36
Post Id


Новичок


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


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




Здравствуйте.
Пишу свой парсер/шаблонизатор на данный момент работаю над конструкцией для шаблона: {include ...}, вот код который обрабатывает include в шаблонах:
PHP:
скопировать код в буфер обмена
  1.                 # Обработка INCLUDE
  2.                 $cache_tpl = preg_replace_callback('/\{include (.*?)}/',
  3.             function($include_tpl) use($dir_tpl, $ext_tpl)
  4.             {                  
  5.                         return file_get_contents($dir_tpl . $include_tpl[1] . $ext_tpl);
  6.                         },  
  7.                 $cache_tpl);
  8.             # END Обработка INCLUDE

Сценарий находит в шаблоне {include ...}, заменяет его на содержимое подключаемого файла, и потом сохраняет в кеше сайта... Сценарий отлично работает, но если к уже подключенному шаблону будет подключен ещё один шаблон, то вместо содержимого третьего шаблона, на экране будет {include ...}.

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


ЗЫ. готовые шаблонизаторы использовать не хочу...

(Отредактировано автором: 02 Августа, 2015 - 06:18:19)

 
 Top
DelphinPRO
Отправлено: 02 Августа, 2015 - 08:34:07
Post Id



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


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


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




Slash Zn пишет:
return file_get_contents($dir_tpl . $include_tpl[1] . $ext_tpl);

Здесь нужно прочитать файл шаблона, скормить его вашему шаблонизатору, а результат вернуть.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Slash Zn
Отправлено: 02 Августа, 2015 - 11:34:33
Post Id


Новичок


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


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




DelphinPRO пишет:
Здесь нужно прочитать файл шаблона, скормить его вашему шаблонизатору, а результат вернуть.

Уже думал над этим, у меня получается что попало, полностью не правильно...:
PHP:
скопировать код в буфер обмена
  1.         # Обработка INCLUDE
  2.        $cache_tpl = preg_replace_callback('/\{include (.*?)}/',
  3.            $incl function($include_tpl) use($dir_tpl, $ext_tpl)
  4.             {          
  5.                 $include_tpl = file_get_contents($dir_tpl . $include_tpl[1] . $ext_tpl);
  6.                 if (preg_match('/\{include (.*?)}/', $include_tpl))
  7.                 {
  8.                     return $incl($include_tpl);
  9.                 }
  10.                 else
  11.                 {
  12.                     return $include_tpl;
  13.                 }
  14.             },  
  15.         $cache_tpl);

По этому прошу показать пример на коде, как это сделать?
Спасибо.

(Отредактировано автором: 02 Августа, 2015 - 11:36:26)

 
 Top
DelphinPRO
Отправлено: 02 Августа, 2015 - 22:32:57
Post Id



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


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


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




ну я не знаю же как у вас шаблонизатор устроен.
В общем случае примерно так:

покажу на функциях

PHP:
скопировать код в буфер обмена
  1. function parse($filename, $dir_tpl, $ext_tpl) {
  2.         $tpl = file_get_contents($filename);
  3.         $cache_tpl = preg_replace_callback('/\{include (.*?)}/',
  4.                 function($include_tpl) use($dir_tpl, $ext_tpl) {
  5.                         // Вот она - рекурсия
  6.                         return parse($include_tpl[1], $dir_tpl, $ext_tpl);
  7.                 }, $tpl);
  8.         return $cache_tpl; // Возврат скомпиленного шаблона
  9. }
  10.  
  11. // вызов шаблонизатора
  12. echo parse('template1', '/path/to/tamplates/', '.phtml');

(Отредактировано автором: 02 Августа, 2015 - 22:33:25)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Slash Zn
Отправлено: 03 Августа, 2015 - 06:52:54
Post Id


Новичок


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


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




DelphinPRO пишет:
ну я не знаю же как у вас шаблонизатор устроен.

Извиняюсь, мне следовало сразу показать код...
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. # Функция Шаблонизатор
  3. function template($tpl, $template)                                            
  4. {
  5.    $page = basename($_SERVER['REQUEST_URI']); # Текущая страница
  6.     $dir_cache = 'cache/';                         # Директория хранения кэша
  7.    $dir_tpl =   'tpl/html/';                  # Директория хранения шаблонов
  8.         $ext_tpl =   '.html';                      # Расширение файлов шаблона
  9.         $ext_cache = '.php';                       # Расширение файлов кэша
  10.        
  11.         # Проверка шаблона в кэше
  12.    if (file_exists($dir_cache . $page . $ext_cache))
  13.    {
  14.             include($dir_cache . $page . $ext_cache);          
  15.    }
  16.    else
  17.    {
  18.             if (!file_exists($dir_tpl . $template . $ext_tpl)) # Проверка наличия шаблона
  19.                 {
  20.                     exit('No Template');
  21.                 }
  22.                
  23.             ob_start();                               # Включение буферизации
  24.             include($dir_tpl . $template . $ext_tpl); # Подключение шаблона            
  25.                 $cache_tpl = ob_get_contents();           # Получение содержимого буфера               
  26.                 ob_end_clean();                           # Отключение и очистка буфера
  27.                
  28.                 # Обработка INCLUDE
  29.                 $cache_tpl = preg_replace_callback('/\{include (.*?)}/',
  30.            function($include_tpl) use($dir_tpl, $ext_tpl)
  31.             {                  
  32.                         $include_tpl = file_get_contents($dir_tpl . $include_tpl[1] . $ext_tpl);
  33.                                 return $include_tpl;
  34.                         },  
  35.                 $cache_tpl);
  36.             # END Обработка INCLUDE    
  37.        $code = array(
  38.                     # Вывод переменных (ECHO)
  39.                     '/\{echo (.*?)}/'     => '<?php echo $1; ?>',              
  40.                
  41.                     # Обработка условия (IF / ELSEIF / ELSE / ENDIF)
  42.                     '/\{if (.*?)}/'       => '<?php if ($1): ?>',
  43.                     '/\{elseif (.*?)}/'   => '<?php elseif ($1): ?>',
  44.                     '/\{else}/'           => '<?php else: ?>',
  45.                     '/\{endif}/'          => '<?php endif; ?>',
  46.                        
  47.                         # Обработка цикла (FOREACH / ENDFOREACH)
  48.                         '/\{foreach (.*?)}/'  => '<?php foreach ($1): ?>',     
  49.             '/\{endforeach}/'     => '<?php endforeach; ?>'
  50.                 );
  51.                
  52.                 $cache_tpl = preg_replace(array_keys($code), array_values($code), $cache_tpl);  # Замена кода в шаблоне
  53.  
  54.                 $file = fopen($dir_cache . $page . $ext_cache, 'w-');  # Создание нового файла
  55.                 fwrite($file, $cache_tpl);                             # Запись содержимого буфера в файл
  56.                 fclose($file);                                         # Закрытие файла
  57.                
  58.             include($dir_cache . $page . $ext_cache);              # Подключение файла кэша    
  59.     }  
  60. }

У меня уже была мысль загнать в функцию, но в после загона в функцию, {include ...} отображается как текст во всех шаблонах, даже, который подключен первым....
 
 Top
Slash Zn
Отправлено: 03 Августа, 2015 - 09:04:26
Post Id


Новичок


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


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




Сейчас подумал, а будет ли работать определенная пользавательская функция в другой пользовательской функции?

Просто функция parse, которую предложили Вы и сам я сколько пытался внедрить, не работает. Хотя все же правильно?

Добавлено позже:
Нет, дело не в этом.......

(Отредактировано автором: 03 Августа, 2015 - 10:59:47)

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB