Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Мини-шаблонизатор (Юрий Насретдинов)
Goto page 1, 2  Next
Author Message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Sat May 24, 2003 9:11 pm (написано за 4 минуты 13 секунд)
   Post subject: Мини-шаблонизатор
Reply with quote

Небольшой класс, который является простым и небольшим парсером файлов с шаблонами. Может обрабатывать PHP-код, но только при инициализации шаблона. Рекомендуется к использованию лишь в случае, если Вам нужен ультра-легковесный движок шаблонов с минимумом возможностей.
Code (php): скопировать код в буфер обмена
<?

class Tpl
{
    var $tpls=array (www.php.net/array)();
    var $ptpls=array (www.php.net/array)(); //parsed templates
    var $wtpls=array (www.php.net/array)(); //while templates (blocks, used many times)
    var $pwtpls=array (www.php.net/array)(); //parsed while templates
   
    function _evaller($data)
    {
        ob_start (www.php.net/ob_start)();
        eval (www.php.net/eval)($data[1]);
        return ob_get_clean (www.php.net/ob_get_clean)();
    }
   
    function file2string($file)
    {
        if(file_exists (www.php.net/file_exists)($file) && is_readable (www.php.net/is_readable)($file))
        {
            $f=fopen (www.php.net/fopen)($file,"rb");
            $filecontent=fread (www.php.net/fread)($f,filesize (www.php.net/filesize)($file));
            fclose (www.php.net/fclose)($f);
            return $filecontent;
        }else
        {
            return false;
        }
    }
   
    function loadtpl($tpl)
    {
        if($result=$this->file2string($tpl))
        {
            $this->tpls[$tpl]=trim (www.php.net/trim)(preg_replace (www.php.net/preg_replace)('/\<\!\-\-.*\-\-\>/sU','',preg_replace_callback (www.php.net/preg_replace_callback)('/\<\?(.*)\?\>/sU',array (www.php.net/array)(&$this,'_evaller'),$result)));
            return true;
        }
        return false;
    }
   
    function parse($rarray,$tpl) //replace array ( array('title' => 'Welcome', 'body' => 'This is an example',) )
    {
        if(!isset (www.php.net/isset)($this->tpls[$tpl]) or !is_array (www.php.net/is_array)($rarray)) return false;
       
        $tpltxt/*template text*/=$this->tpls[$tpl];
        $new_rarray = array (www.php.net/array)();
        foreach($rarray as $k=>$v) $new_rarray['{'.$k.'}'] = $v;
       
        $tpltxt = strtr (www.php.net/strtr)($tpltxt, $new_rarray);
       
        $this->ptpls[$tpl]=$tpltxt;
        return true;
    }
   
    function getparsedtext($tpl)
    {
        if(!isset (www.php.net/isset)($this->ptpls[$tpl])) return false;
       
        return $this->ptpls[$tpl];
    }
   
    function loadwtpl($tpl,$delimiter="<!--parts-separator-->")
    {
        if($result=$this->file2string($tpl))
        {
            $this->wtpls[$tpl]=array_map (www.php.net/array_map)('trim',preg_replace (www.php.net/preg_replace)('/\<\!\-\-.*\-\-\>/sU','',explode (www.php.net/explode)($delimiter, preg_replace_callback (www.php.net/preg_replace_callback)('/\<\?(.*)\?\>/isU',array (www.php.net/array)(&$this,'_evaller'),$result))));
            return true;
        }
        return false;
    }
   
    function wparse($rarray,$tpl,$n) //replace array ( array('title' => 'Welcome', 'body' => 'This is an example',) )
    {
        if(!isset (www.php.net/isset)($this->wtpls[$tpl][$n]) or !is_array (www.php.net/is_array)($rarray)) return false;
       
        $tpltxt/*template text*/=$this->wtpls[$tpl][$n];
        $new_rarray = array (www.php.net/array)();
        foreach($rarray as $k=>$v) $new_rarray['{'.$k.'}'] = $v;
       
        $tpltxt = strtr (www.php.net/strtr)($tpltxt, $new_rarray);
       
        $this->pwtpls[$tpl][$n]=$tpltxt;
        return true;
    }
   
    function wparseall($rarray,$tpl)
    {
        if(!isset (www.php.net/isset)($this->wtpls[$tpl]) or !is_array (www.php.net/is_array)($rarray)) return false;
       
        foreach($rarray as $key=>$value)
        {
            $this->wtpls[$tpl]=str_replace (www.php.net/str_replace)('{'.$key.'}', $value, $this->wtpls[$tpl]);
        }
       
        return true;
    }
   
    function getwparsedtext($tpl,$n)
    {
        if(!isset (www.php.net/isset)($this->pwtpls[$tpl][$n])) return false;
       
        return $this->pwtpls[$tpl][$n];
    }
   
    function fastparse($tpl,$rarray=array (www.php.net/array)(),$echo=true)
    {
        if(!isset (www.php.net/isset)($this->tpls[$tpl])) $this->loadtpl($tpl);
        $this->parse($rarray,$tpl);
        if($echo) echo (www.php.net/echo) $this->getparsedtext($tpl);
        else return $this->getparsedtext($tpl);
    }
   
    function fastwparse($tpl,$rarray=array (www.php.net/array)(),$num=0,$echo=true)
    {
        if(!isset (www.php.net/isset)($this->wtpls[$tpl])) $this->loadwtpl($tpl);
        $this->wparse($rarray,$tpl,$num);
        if($echo) echo (www.php.net/echo) $this->getwparsedtext($tpl,$num);
        else return $this->getwparsedtext($tpl,$num);
    }
}
?>
//

$tpl=new Tpl;
$shablon="./tpls/tpl1.tpl"; //
$tpl->fastparse($shablon,array (www.php.net/array)('title'=>'','body'=>'<h1> </h1>'));
Один и тот же шаблон, который загружен, можно использовать сколько угодно раз, не вызывая include... То есть, к примеру, в цикле while... Из кода также вырезаются комментарии (вместе с текстом <script> и <style> тегов, если они были окружены комментариями..)
Code (html): скопировать код в буфер обмена
<html> (december.com/html/4/element/html.html)
<head> (december.com/html/4/element/head.html)
<title> (december.com/html/4/element/title.html){title}</title>
</head>
<body> (december.com/html/4/element/body.html)
{body}
</body>
</html>
Наверное я не очень понятно объяснил, как пользоваться этим мини-шаблонизатором, если возникнут вопросы - сразу на них отвечу...

Изменен код для поддержки исполнения PHP-кода. Нужно писать в шаблоне <? код ?>. Конструкции <?= ?> и <?php ?> не поддерживаются. Код исполняется 1 раз при обработке шаблона, потом обрабатываются уже результаты его работы. Например:
Code (html): скопировать код в буфер обмена
< (december.com/html/4/element/.html)?
echo date('d.m.Y'
Скрипт выведет текущую дату только 1 раз, потом будут использоваться уже результаты работы этой функции.

P.S. Текущая версия парсера шаблонов не обратно-совместима с предыдущими!

Last edited by Юрий Насретдинов on Fri Sep 04, 2009 7:46 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
rdk
Заглянувший



Joined: 23 Apr 2003
Posts: 14
Карма: 0
   поощрить/наказать

Location: интернет

PostPosted: Sun May 25, 2003 10:43 am (спустя 13 часов 31 минуту)
   Post subject: Mini-tempater light version :)
Reply with quote

а к чему все эти примудрости?? целых четыре функции, три из которых еще и руками вызывать приходится... и еще инициализировать класс...
для чего?

так не проще?:
Code (any language): скопировать код в буфер обмена
//template
//str/bool template(temp_name, vars_array[, echo_bool]);
function template($file, $vars = array(), $echo = 1) {       
        $lines = join('', file($file));
        foreach($vars as $key => $val) {
                $lines = ereg_replace('{'.$key'.}', $val, $lines);
        }
        if($echo)
        {
                echo($lines);
                Return true;
        }
        Return $lines;
}


$title = 'Some title';
$body = 'Text';
$vars = compact("title", "body");
$template = ("tpls/index.html", $vars);
или я чего-то не понял?
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Sun May 25, 2003 1:00 pm (спустя 2 часа 17 минут)
   Post subject:
Reply with quote

Действительно, зачем вообще вся эта фигня, если можно просто писать в шаблоне html-код, а потом загружать его include' ом ?

вот так:
Code (php): скопировать код в буфер обмена
$title="";
$body="";
include("template.html");
а в шаблоне вот что:
Code (html): скопировать код в буфер обмена
<html> (december.com/html/4/element/html.html)
<head> (december.com/html/4/element/head.html)
<title> (december.com/html/4/element/title.html)< (december.com/html/4/element/.html)?=$title?> (december.com/html/4/element/.html)</title>
</head>
<body> (december.com/html/4/element/body.html)
< (december.com/html/4/element/.html)?=$body?> (december.com/html/4/element/.html)
</body>
</html>
Этот способ очень удобен для небольших проектов (например новостная лента)...

А для больших проектов будет лучше (и быстрее, т.к. я для замены использую не ereg_replace, который во-первых не работает с массивами :), а во - вторых работает гораздо быстрее) использовать именно этот шаблонизатор - вот например:
Code (php): скопировать код в буфер обмена
//часть кода пропущена, оставлен только сам цикл вывода и подключения шаблона
$tpl->loadtpl($shablon);
//**
while($result=mysql_fetch_array (www.php.net/mysql_fetch_array)($select))
{
    foreach($result as $key=>$value)
    {
        $ar[$key]=$value;
    }
    $tpl->parse($ar,$shablon);
    echo (www.php.net/echo) $tpl->getparsedtext($shablon);
}
//**
//кстати этот мини-шаблонизатор может работать сразу с несколькими шаблонами одновременно (как и любой другой приличный шаблонизатор) и соответственно может выводить их в любом заданом порядке...
 
Кстати насчёт Вашей функции... Она будет работать заведомо медленнее - я ведь не зря сделал класс, чтобы загружать только 1 раз шаблон, а потом уже работать с его содержимым... В принципе, можно сделать так, чтобы не загружать шаблон, а чтобы он просто в первый раз, когда вызывается parse вызывал дополнительно функцию loadtpl... У Вас же каждый раз вызывается содержимое файла из файловый системы, т.е. мы приходим к тому же, с чего и начали... А насчёт ещё одной функции - так это просто для удобства, потому что функции file, которая бы возвращала строку, к сожалению нет... Вот я её и сделал :)
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sun May 25, 2003 10:14 pm (спустя 9 часов 14 минут)
   Post subject:
Reply with quote

Да Вы знаете, в общем-то, все равно, как писать. Функцию
Code (php): скопировать код в буфер обмена
function template($file, $vars = array (www.php.net/array)(), $echo = 1) {
ведь легко убыстрить, чтобы она один и тот же файл не загружала несколько раз. Делается это через static-переменные:
Code (php): скопировать код в буфер обмена
function template($file, $vars = array (www.php.net/array)(), $echo = 1) {
  static (www.php.net/static) $cache = array (www.php.net/array)();
  $lines =& @$cache[$file];
  if (!@$lines) $lines = join (www.php.net/join)('', file (www.php.net/file)($file));
  ...
  //
}
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Sun May 25, 2003 10:18 pm (спустя 3 минуты)
   Post subject:
Reply with quote

А что рациональнее ?
Мне просто интересно, static - переменные я ещё никогда не использовал в функциях, хотя слышал об их существовании...
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sun May 25, 2003 10:31 pm (спустя 13 минут)
   Post subject:
Reply with quote

Да одинаково примерно. Класс лучше тем, что позволяет его поместить в отдельный модуль (файл) и использовать стандартную нотацию PEAR для подключений. Функция хорошоа тем, что ее легче вызывать, однако может произойти путаница с именем (объявите где-нибудь еще функцию с тем же именем по ошибке).
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Sun May 25, 2003 10:34 pm (спустя 3 минуты)
   Post subject:
Reply with quote

Хм... Можно про PEAR поподробней ;)?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon May 26, 2003 3:21 am (спустя 4 часа 46 минут)
   Post subject:
Reply with quote

pear.php.net
Back to top
View user's profile Send private message Send e-mail
rdk
Заглянувший



Joined: 23 Apr 2003
Posts: 14
Карма: 0
   поощрить/наказать

Location: интернет

PostPosted: Mon May 26, 2003 8:55 am (спустя 5 часов 34 минуты)
   Post subject:
Reply with quote

2yUAC: а каким, простите, местом ваш str_replace работает с массивами? ТОЧНО такая же подстановка {$key} на $val. Разве нет?


и еще: при грамотном использовании функцию достаточно вызвать всего один раз...
Code (any language): скопировать код в буфер обмена
$ar['bgcolor'] = "#001122";
while($result=mysql_fetch_array($select))
{
    foreach($result as $key=>$value)
    {
        $ar[$key]=$value;
    }
}
$title = 'Page';
$body = 'Text';
array_push($ar, "title", "body");
template('tpl.file', $ar);


Last edited by rdk on Mon May 26, 2003 5:29 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Евгений Бондарев
Модератор



Joined: 10 Mar 2003
Posts: 723
Карма: 16
   поощрить/наказать

Location: Харьков/Киев, Украина

PostPosted: Mon May 26, 2003 1:14 pm (спустя 4 часа 19 минут)
   Post subject:
Reply with quote

yUAC:
А как же блоки?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Mon May 26, 2003 4:05 pm (спустя 2 часа 51 минуту)
   Post subject:
Reply with quote

rdk wrote:
при граммотном использовании функцию достаточно вызвать всего один раз
Это получается не грамотное использование, а просто игнорирование предыдущих постингов... То, что вЫ предложили, выведет только 1 раз выведет последнюю запись :):):)... А нужно, чтобы она выводила это в цикле...
rdk wrote:
а каким, простите, местом ваш str_replace работает с массивами
никаким, просто он работает гораздо быстрее ereg_replace, который обычно используют только из-за его регулярных выражений (хотя и для этого используют чаще всего preg_replace - опять же более "знакомый", и в большинстве случаев работает быстрее :))
Евгений Бондарев wrote:
А как же блоки?
Ведётся разработка - в 1 Кб всё равно блоки не влезут :)
Back to top
View user's profile Send private message Send e-mail
rdk
Заглянувший



Joined: 23 Apr 2003
Posts: 14
Карма: 0
   поощрить/наказать

Location: интернет

PostPosted: Mon May 26, 2003 5:34 pm (спустя 1 час 28 минут)
   Post subject:
Reply with quote

yUAC wrote:
выведет только 1 раз выведет последнюю запись
она не выведет только последнюю запись... цикл сохраняет значения в массив, а этот массив потом ОДИН раз передается функции, а не в каждом шаге цикла...
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Mon May 26, 2003 5:50 pm (спустя 16 минут)
   Post subject:
Reply with quote

Я всё же настаиваю на внимательном прочтении предыдущих постов...

Если бы цикл выглядел примерно так -
Code (php): скопировать код в буфер обмена
//
while()
{
    $ar[][$key]=$value;
}
то тогда можно было бы ещё о чём-то говорить :)... А так - мой цикл в $result забивает значения одних и тех же полей... То бишь значения $key будут на каждом шаге цикла повторяться :)... И выведет он именно последнюю запись, а нужно было, чтобы он выводил каждую запись...

P.S. Хватить спорить... Это элементарное неуважение к автору этого поста...

P.P.S. Модератор, можете удалить последние посты - в них нет ничего кроме бессмысленного спора...
Back to top
View user's profile Send private message Send e-mail
rdk
Заглянувший



Joined: 23 Apr 2003
Posts: 14
Карма: 0
   поощрить/наказать

Location: интернет

PostPosted: Mon May 26, 2003 6:01 pm (спустя 11 минут)
   Post subject:
Reply with quote

я не спорю, я просто пытаюсь понять вашу точку зрения и объяснить вам свою. то что вы имели ввиду, я понял только в последнем посте. объяснили бы понятней раньше, не было бы никаких споров. и вообще, форум существует для дискуссий, насколько мне известно...
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Mon May 26, 2003 6:04 pm (спустя 2 минуты)
   Post subject:
Reply with quote

Ну... Наверное из того, что шаблон вызывается каждый раз, следует, что он и выводится каждый раз, не так ли? Причём Вы сами же говорили, что шаблон вызывается каждый раз :)...

Ладно, всё, конец дискуссии похоже :)
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue May 27, 2003 1:34 am (спустя 7 часов 30 минут)
   Post subject:
Reply with quote


М

Больше уважения, меньше нервов, пожалуйста.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Tue May 27, 2003 8:28 am (спустя 6 часов 54 минуты)
   Post subject:
Reply with quote

Удалите пожалуйста хотя бы часть этого спора...
Back to top
View user's profile Send private message Send e-mail
Евгений Бондарев
Модератор



Joined: 10 Mar 2003
Posts: 723
Карма: 16
   поощрить/наказать

Location: Харьков/Киев, Украина

PostPosted: Tue May 27, 2003 11:05 am (спустя 2 часа 36 минут)
   Post subject:
Reply with quote

yUAC wrote:
Удалите пожалуйста хотя бы часть этого спора...

М

Пусть останется в назядание потомкам!
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Thu Dec 04, 2003 6:42 pm (спустя 6 месяцев 8 дней 7 часов 36 минут)
   Post subject:
Reply with quote

Хм... Добавил кое-что в свой мини-шаблонизатор... Он конечно остается вполне стандартным (по идеологии - скрипт сам вызывает шаблон, не наоборот, скрипт сам и обрабатывает его).

Добавлены функции для поддержки блоков (те же функции, только с буквой w (while) и последним аргументом является номер "куска" шаблона) (блоки разделяются строкой "<!--delimiter-->", которую можно изменить или указать динамически.)

Добавлена функция, которая заменяет значения во всех блоках шаблона (см. wparseall)

Добавлены функции быстрого вывода шаблона - теперь вместо трех ненужных операций вызывается только одна (при этом шаблон загружается только один раз, в следующие разы он берется из кэша).

Пример:
Code (php): скопировать код в буфер обмена
$ar[1]="templates/design.html";
$tpl=new yuactpl;

$tpl->fastwparse($ar[1],array (www.php.net/array)('hi all'=>' '),0);
for($i=0;$i<=5;$i++) $tpl->fastwparse($ar[1],array (www.php.net/array)('2'=>$i,'4'=>pow($i,2)),1);
$tpl->fastwparse($ar[1],array (www.php.net/array)('roga and kopita copyright'=>'<br><b>&copy; Roga and Kopita all rights reserved</b>'),2);
Шаблон:
Code (html): скопировать код в буфер обмена
<html> (december.com/html/4/element/html.html)
<head> (december.com/html/4/element/head.html)<title> (december.com/html/4/element/title.html){hi all}</title></head>
<body> (december.com/html/4/element/body.html)
<h1> (december.com/html/4/element/h1.html){hi all}</h1>
<!--delimiter-->
<br> (december.com/html/4/element/br.html){2} в квадрате будет {4}
<!--delimiter-->
{roga and kopita copyright}
</body>
</html>
Back to top
View user's profile Send private message Send e-mail
Просто пользователь
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Feb 05, 2004 10:46 pm (спустя 2 месяца 1 день 4 часа 4 минуты)
   Post subject:
Reply with quote

А можно спросить? Как это дело запустить, чтоб работало, т.е информация подставлялась.
У меня папки:
/lib - yuactpl.php - код в первом сообщении
/templates - 1.tpl (шаблон) содержащий:
<html>
<head>
<title>{title}</title>
</head>
<body>
{body}
</body>
</html>

1.php - файл содержащий:
<?
$tpl=new yuactpl;
$shablon="templates/1.tpl";
$tpl->fastparse($shablon,array('title'=>'Проверка','body'=>'<h1>Текст документа</h1>'));
?>

Запускаю localhost/sha/1.php
На экране броузера ничего нет. Тишина... и мёртвые с косами стоят.

Не подскажите, что я делаю не так?
Back to top
m4nfr3d
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Feb 06, 2004 11:39 am (спустя 12 часов 52 минуты)
   Post subject:
Reply with quote

Просто пользователь:
Просто функция fastparse ничего не выводит.
Back to top
Просто пользователь
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Feb 06, 2004 4:51 pm (спустя 5 часов 11 минут)
   Post subject:
Reply with quote

Как сделать так чтобы это вывело? Какя функция?
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Fri Feb 06, 2004 8:29 pm (спустя 3 часа 38 минут)
   Post subject:
Reply with quote

Просто пользователь wrote:
Не подскажите, что я делаю не так
Могу. в забыли подключить файл yuactpl.php
m4nfr3d wrote:
Просто функция fastparse ничего не выводит
yUAC wrote:
,$echo=true)
yUAC wrote:
if($echo) echo $this->getwparsedtext($tpl,$num);
Без комментариев.
Back to top
View user's profile Send private message Send e-mail
Просто пользователь
Guest





Карма: 388
   поощрить/наказать


PostPosted: Sat Feb 07, 2004 2:20 pm (спустя 17 часов 50 минут)
   Post subject:
Reply with quote

А как сделать, чтобы он информацию из файла брал, сопоставляя его с заранее установленной структурой. Например 1 строчка файла информации - Заголовок, вторая - предисловие.
Если использовать при загрузке файла explode, то масив получается, но key не сответствует нужному значению.
Заранее благодарен!
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Sat Feb 07, 2004 2:34 pm (спустя 14 минут)
   Post subject:
Reply with quote

Просто пользователь:
Повторите еще раз, поподробнее, с примером кода, может, будет понятней.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Sat Feb 07, 2004 6:33 pm (спустя 3 часа 58 минут)
   Post subject:
Reply with quote

Вот код например
Code (php): скопировать код в буфер обмена
$df = text.txt";
function explo() {
        $fp = fopen($df, "
r");
        $in = fread($fp, filesize($df));
        fclose($fp);
        $data = explode("
~", $in);
return $data
}
Возратит "список" (массив с ключами 1,2,3... и значениями, которые находятся в файле text.txt. Т.Е какието фразы в файле text.txt например:
"239
~
Hello World!

То функция возратит массив с ключами 1,2 и значениями соответственно 239, Hello World!. Как сделать так чтобы мини-шаблонизатор умел читать информацию из файла...
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Sat Feb 07, 2004 7:03 pm (спустя 30 минут)
   Post subject:
Reply with quote

Гость:
см. функцию fastwparse и все функции с префиксом "w", для разделения шаблона на блоки, я так понимаю ?

P.S. Кто Вас учил кавычки расставлять ?
Back to top
View user's profile Send private message Send e-mail
Просто пользователь
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 10, 2004 7:02 pm (спустя 2 дня 23 часа 59 минут)
   Post subject:
Reply with quote

Да мне надо не шаблон делить на куски, а текстовый файл. Т.е мне надо что бы в одном файле с расширением .txt хранился текст, а мини-шаблонизатор подставлял этот текст... И хотелось бы чтобы в txt файле хранились и <Title> и ещё чего нибудь. А шаблонизатор мог понять, что Title в текстовом файле означает, что он должен вставить такой тег <Html><Title>Вот здесь значения поля Title</title>
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Tue Feb 10, 2004 10:58 pm (спустя 3 часа 55 минут)
   Post subject:
Reply with quote

Просто пользователь:
Единственное условие, что Вы должны уже знать названия того, что в фигурных скобках ( скажем <html><head><title> {title} </title></head>... ), а так - проще простого:
Code (php): скопировать код в буфер обмена
<?
include("yuactpl.php");
$tpl=new yuactpl;
//**
$file="text.txt"; //адрес файла
$glue="\n"; //склеиватель кусков
$file=explode (www.php.net/explode)($glue,implode (www.php.net/implode)("\n",file (www.php.net/file)("text.txt"))); //грузим куски
$values=array (www.php.net/array)('title','body','copyright','email'); //названия "тегов" в порядке следования в файле
//**
$result=array (www.php.net/array)(); //массив с готовым списком замен
foreach($file as $key=>$value) $result[$values[$key]]=$value;
//**
$template="content.html"; //файл с дизайном
$tpl->fastparse($template,$result);
?>
Ну, конечно, не проще простого, но можете использовать этот код в качестве "основы". Не проверял, к сожалению, но должен работать
Back to top
View user's profile Send private message Send e-mail
Просто пользователь
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Feb 11, 2004 3:12 pm (спустя 16 часов 14 минут)
   Post subject:
Reply with quote

Приведите пожалуйста пример text.txt.
Заранее благодарен!
Back to top
Просто пользователь
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Feb 11, 2004 3:16 pm (спустя 4 минуты)
   Post subject:
Reply with quote

Запустил! Не подставляет значения, выдаёт только шаблон. Вот text.txt:
Test \n
No
Back to top
Просто пользователь
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Feb 11, 2004 3:20 pm (спустя 3 минуты)
   Post subject:
Reply with quote

Извиняюсь работает! Спасибо! А этот небольшой кусок можно в класс запихнуть или может его includ'ом?
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Wed Feb 11, 2004 5:17 pm (спустя 1 час 57 минут)
   Post subject:
Reply with quote

Просто пользователь wrote:
или может его includ'ом
может его инклудом
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Sun Feb 29, 2004 6:04 pm (спустя 18 дней 47 минут)
   Post subject:
Reply with quote

А как можно сделать динамические новости используя ваш шаблониазтор? Ведь невозможно вставлять PHP код в "массив замен".
Заранее благодарен!
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Sun Feb 29, 2004 8:09 pm (спустя 2 часа 5 минут)
   Post subject:
Reply with quote

Гость wrote:
Ведь невозможно вставлять PHP код в "массив замен".
Можно. Только выполняться он не будет...
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Fri Mar 26, 2004 9:51 pm (спустя 26 дней 1 час 42 минуты)
   Post subject:
Reply with quote

А возможно ли изменить ваш шаблонизатор так чтобы PHP код работал???
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Tue Mar 30, 2004 12:44 pm (спустя 3 дня 14 часов 53 минуты)
   Post subject:
Reply with quote

Гость:
Я разрешаю
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Mar 30, 2004 12:58 pm (спустя 13 минут)
   Post subject:
Reply with quote

Я вообще то спрашивал возможно ли это? А как сделать "правильные" относительные пути? Есть ли у Вас предложения??
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Tue Mar 30, 2004 1:07 pm (спустя 9 минут)
   Post subject:
Reply with quote

Гость wrote:
Я вообще то спрашивал возможно ли это?
Возможно конечно. Вот только гемморойно. Посмотрите функцию eval.
Еще вот этот кусок посмотрте - скорее всего именно его надо будет менять
Code (php): скопировать код в буфер обмена
foreach($rarray as $key=>$value)
{
    $tpltxt=str_replace (www.php.net/str_replace)('{'.$key.'}', $value, $tpltxt);
}
Гость wrote:
А как сделать "правильные" относительные пути?
Берете относительный путь и в начале прибавляете dirname(__FILE__):
Code (php): скопировать код в буфер обмена
$rootpath=dirname (www.php.net/dirname)(__FILE__);
$path=$rootpath."/  ( ,     ";
Можно по-другому:
Code (php): скопировать код в буфер обмена
chdir (www.php.net/chdir)(dirname (www.php.net/dirname)(__FILE__));
$path="относительный путь";
А еще можно повозиться с include_path, и вставлять директорию еще туда, но это уже другая тема
Гость wrote:
Есть ли у Вас предложения??
Вот я собственно и написал :)
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Mar 30, 2004 5:25 pm (спустя 4 часа 18 минут)
   Post subject:
Reply with quote

А это куда собственно вставлять? В каждую PHP'шную страницу? Или в класс шаблонизатора? Желательно пример использования, а то тут можно запутаться...
Заранее благодарен!
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2  Next
Page 1 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML