Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Шаблонизатор


Автор: chiffa 20.5.2010, 23:07
Всем добрый вечер. Пишу небольшой шаблонизатор. Столкнулся с проблемой. Как подключить к выводу скрипт из другого файла. тоест ьу меня есть 1.tpl

Код

<table>

<tr> <td>{new}</td> </tr>

<tr> <td>TEST</td> </tr>

<tr> <td>{reg}</td> </tr>

</table>


мини функция шаблонизатора 

Код

function Template($tpl , $patterns , $replacements ) {
   $tpl = file_get_contents($tpl);
   echo str_ireplace($patterns,$replacements,$tpl);
}



и сам код скрипта

Код


$inc [0]='{new}';
$inc [1]='{reg}';

$put6 [0]='{new.php}'; //исполняемый файл пхп с определенным кодом
$put6 [1]='{reg.php}'; //исполняемый файл пхп с определенным кодом


Template("shablon/".$_SESSION ['tpl']."/1.tpl" , $inc, $put6);


При таком раскладе вставляется просто строка с именем файла, как вставить исполняемый код?... Заранее спасибо за помощь! smile

Автор: zibox86 21.5.2010, 00:03
Инклюдить шаблон в кеш и потом заменить шаблонные переменные на реальные.

Что то типа:
Код


ob_start();

include шаблон

ReaplaceVar();

ob_end_flush();

function ReplaceVar(){
    Поиск и замена

}


Плюс в этом еще то что можно кеширование сделать

Автор: chiffa 21.5.2010, 00:09
спасибо за ответ! суть уловил, но принцип реализации не очень. можешь на конкретном примере? Если я раньше проинклудю шаблон и ниже вызову функцию то как он проведет замену?....

Автор: zibox86 21.5.2010, 00:19
Ну тут же дело твоей фантазии!! 

Пишешь функцию к примеру, а еще лучше класс.

Код

class Template{

              function includeTemplate($name, $args = false){
                     $this-StartBuffer();
                     include $name;
                     $this->StopBuffer();
           
                     return true;
              }   
  
              /**
     * Запускает буферизацию
     *
     */
    
    function StartBuffer(){
                     @ob_start();
    }
    
    /**
     * Заменяет переменные шаблона
     *
     * @return string
     */
    
    function ReplaceVar(){
        
           $buffer = preg_replace();

           return $buffer;
    }
    
    /**
     * Останавливает буфкризацию
     *
     */
    
    function StopBuffer(){
        echo $this->ReplaceVar();
        @ob_end_flush();    
    }
}

Автор: SamDark 21.5.2010, 13:50
Вот мой вполне рабочий вариант:
http://rmcreative.ru/blog/post/mvc-view

Автор: chiffa 22.5.2010, 11:53
А такой вопрос по кешированию, немного для себя прояснить. насколько я понимаю принцип работы на стороне сервера следующая:
1. Заходит клиент
2. Сервер проверяет есть ли сохраненный кеш
3. Если есть то выдает сохраненную версию
4. Если нет, но сохраняет кеш

Отсюдова возникает вопрос: если сохраненная версия кеша изменилась (допустим это магазин товаров и добавился новый товар) пользователь его получается не увидит? Или перед каждым выводом сравнивать устарел кеш или нет, тогда теряется весь смысл, ведь запрос к серваку и обработка ПХП будет все равно происходить.... или я что то неправильно понимаю?

Автор: chiffa 24.5.2010, 11:18
up smile

Автор: chiffa 24.5.2010, 22:09
С принципом создания шаблонизатора все понятно, суть проблемы в том что если я хочу вставить вместо тега подключить php-файл у меня вставляется путь к этому файлу, а нужно что бы он выполнялся и результат выводился вместо тега шаблонизатора

Автор: chiffa 25.5.2010, 11:33
Код вот:

Код

<?php
class html_generator
{
public $manual_configs;
public $template;
public $buffer;
   

public function load_template($type, $name)
{
buffer = file_get_contents("shablon/".$_SESSION ['tpl']."/".$name);
}
public function mount_vars($rep, $param)
{
echo str_ireplace($rep, $param, $this->buffer);
    }
  }?>


вызов:

Код

$generator = new html_generator();
   $generator->load_template('pages','reg.tpl');
   $generator->mount_vars($inc, $put6);


В свою очередь
$inc='{reg}';
$put6='modules/user_mod/reg/index.php';

тоесть мне необходимо вместо тега шаблонизатора {reg} подключить файл пхп. При совершении выше описных действий 

выводится просто строка адреса modules/user_mod/reg/index.php и сам файл не подключается.

Автор: NewDima 25.5.2010, 12:17
Естественно, не подключится...
Самый простой способ будет записывайть полученный в результате парсинга контент в файл и включайть его инклудом,

Автор: chiffa 25.5.2010, 12:25
гм... а каким образом локально спарсить контент? не подскажешь?

Автор: NewDima 25.5.2010, 12:34
Нет, я что-то поторопился с ответом в предыдущий раз.
используй ob_start()  и иже с ним

Автор: chiffa 25.5.2010, 13:11
тоесть так?

Код

ob_start();

$generator = new html_generator();
$generator->load_template('pages','reg.tpl');
$generator->mount_vars($inc, $put6);

 @ob_end_flush();

Автор: NewDima 25.5.2010, 13:24
chiffa, вы требуете слишком большой универсальности от метода mount_vars, но при этом он работает с одним простым синтаксисом
Код

{VARIABLE_NAME}

?
Сначала ответьте, почему mount_vars должен вдруг вставлять контент из файла. Когда поймете, что ответа нет, разберитесь наконец с тем, что делает этот метод. Когда разберетесь с ним, либо расширите синтаксис метки, либо заведете новый метод, одно из двух.

Автор: chiffa 25.5.2010, 14:29
ага. суть я понял. обработчик нужно делать внутри вызываемого класса. Допустим я его инклудю:

$content=include ($put6);

дальше заменяю, через реплейс подставляю $content, но дело в том что при выполнении $content=include ($put6); файл выводится, как "запретить" вывод?. весь код:



Код

<?php

class html_generator
{
public $manual_configs;
 public $template;
 public $buffer;


 public function load_template($type, $name)
   {
 $this->buffer = file_get_contents("shablon/".$_SESSION ['tpl']."/".$name);
   }


 public function mount_vars($rep, $param)
   {


 echo str_ireplace($rep, include ($param), $this->buffer);
   }
}


?>



Автор: awdev 25.5.2010, 15:37
используй smarty

Автор: chiffa 25.5.2010, 16:19
думал над этим - слишком громоздкий......

Автор: awdev 26.5.2010, 00:19
Чем громоздкий? Место на винте жалко? не смеши

Автор: NewDima 26.5.2010, 08:15
Я вообще думал это для самообучения...

Автор: ksnk 26.5.2010, 08:36
chiffa, вы вообще представляете как работает include? Такое ощущение, что что этими инклудами размахивают как волшебной палочкой, авось само получится...

Цитата(chiffa @  25.5.2010,  14:29 Найти цитируемый пост)
echo str_ireplace($rep, include ($param), $this->buffer);

что по вашему ДОЛЖЕН сделать этот оператор? Что он делает? И почему вам кажется, что этот опреатор должен делать то. что нужно?
Как вообще выглядит этот самый включаемый файл?

Автор: NewDima 27.5.2010, 05:47
ksnk, волшебная палочка, ага  smile 
Не, ну если подключаемый файл будет возвращать че-нить с return... другое дело

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)