Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Шаблонизаторы.. (https://forum.antichat.xyz/showthread.php?t=73467)

Doom123 11.06.2008 21:57

Шаблонизаторы..
 
Вот хотел послушать гениальные идеи людей по шаблонизаторам

я например написал так...

например в шаблоне

Код:

<----START NEWS HERE---->
{NEWS}
<----END NEWS HERE---->

а в скрипте идёт

PHP код:

$where[0] = '<----START NEWS HERE---->';
$where[1] = '<----END NEWS HERE---->';

$what['{NEWS}'] = $news;

$tpl $templ->templ($where,$what);

бла бла

echo $tpl

надеюсь вы примерно поняли как это работает...=)

в некоторых случьях это бывает удобно ...
но всёже по мне это ужасная реализация шаблонов..

может у вас есть светлые идеи?=)

YoYo Factory 11.06.2008 23:38

А почему ужасная?
PHP код:

 $where[0] = '<----START NEWS HERE---->';
$where[1] = '<----END NEWS HERE---->'

По мойму даже очень ужобно :)

Jer1cho 11.06.2008 23:47

Я в большинетсве случаев делаю так:

header.php:
PHP код:

<html>
<
head>
<
title>MySite - {title}</title>
 <
link rel="alternate" type="application/rss+xml" title="RSS - {rsstitle}" href="/services/rss/rss{rss}.php">

</
head></html

и затем:

index.php

PHP код:

$temaplate file_get_contents('header.php');
    function 
parse($template$assigned=array())
{
foreach( 
$assigned as $word => $replace)
{
$template preg_replace"/\{$word\}/i""$replace"$template );
}
return 
$template;
}
$title 'Главная страница';
$header parse($temaplate, array('title'  => $title,
                
'rss'  => 'test'));

echo 
$header


etc 11.06.2008 23:51

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

NOmeR1 11.06.2008 23:53

Кому интересно, вот мой пост по этой теме:
https://forum.antichat.ru/showpost.php?p=665776&postcount=23

Doom123 11.06.2008 23:56

Не удобно в том плане что если шаблон большой то пол шаблона это

<---blabla start ---->
<---blabla end---->

<---blabla start ---->
<---blabla end---->

etc...

и как сделать так тоб пхп код в шаблоне не исполнялся?

Doom123 12.06.2008 00:07

NOmeR1

Твой способ помойму немного не удобен т.к я например использовать цикл части шаблона

например

Код:

<---TEMPLATE START--->
тут шапка

<---NEWS START--->
<tr><td>

{NEWS}

</td</tr
<---NEWS END--->

фоот
<---TEMPLATE END--->

а в файле могу сделать так

PHP код:



 $where
[0] = '<---TEMPLATE START--->';
$where[1] = '<---NEWS START--->';

$tpl $templ->templ($where,0); 

 
$where[0] = '<---NEWS START--->';
$where[1] = '<---NEWS END--->';

запрос..

while (
$news mysql_fetch_assoc($result))
{
$what['{NEWS}'] = $news['content'];

$tpl .=$templ->templ($where,$what);
}

а тут добовляем ещё и фоот

echo $tpl


n3m0 12.06.2008 00:30

Вот такой простенький шаблонизатор юзаю я

yuactpl.php
PHP код:

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

index.php
PHP код:

<?php
include('yuactpl.php');
$title "blabla" // допустим выбирается с БД
$content "привет. я задрот...." // тоже с БД

$tp = new yuactpl;
$template "./index.tpl";
$page_data = array(
            
'title' => $title,
                        
'content' => $content
            
);
$tp->fastwparse($template$page_data);    
?>


index.tpl
Код HTML:

<html>
<head><title>{title}</title>
<meta http-equiv="content-type" content="text/html; charset=utf8"/>
</head>
<body>
{content}
</body>
</html>

Быстрый и удобный :)


PS
Ещё есть возможность использовать в шаблоне php код:
в тегах пишется
Код HTML:

<script language="php">echo "bla"</script>
Если интересно, почитайте http://forum.dklab.ru/viewtopic.php?p=38883

NOmeR1 27.06.2008 16:55

Вот - если кому интересно, сделал скрипт по этой теме, что-то вроде "системы" {if выражение}утверждение{/if}

Вот к примеру у нас есть массивы
Код:

$true = array(true, false, true, false);
$false = array(false, true, false, true);

И файл с шаблоном
Код:

1
{if $true[0] == false}2{/if}
{if $true[1] == $false[0]}3
{if false == $true[2]}8{/if}
5{/if}
{if false === $false[0]}
{if $true[0] == $false[0]}6{/if}
7
{if $true[1] == $false[3]}
8
{/if}
{/if}
9

Ну и сам скрипт
Код:

<?php
        function format_eval($matches) {
                $exp = preg_replace('~\$((?![0-9])[a-zA-Z0-9_\x7F-\xFF]+)~', '$GLOBALS[\'\\1\']', $matches[1]);
                $txt = var_export($matches[2], true);
                eval('$string = ('.$exp.') ? '.$txt.' : NULL;');
                return $string;
        }
        $text = file_get_content('template.html'); // template.html - файл с шаблоном
        $pattern = '~{if (.+)}(((?>(?R)|(((?!{if .+})|{/if})).+)+)+){/if}~isU';
        while(preg_match_all($pattern, $text, $matches)) {
                $text = preg_replace_callback($pattern, 'format_eval', $text);
        }
        echo $text;
?>

Вывод:
Код:

1
3
5
7
9


Naydav 27.06.2008 17:10

Цитата:

Вот - если кому интересно, сделал скрипт по этой теме, что-то вроде "системы" {if выражение}утверждение{/if}
Еще чуть-чуть и к Smarty придем :)


Время: 12:02