PHP I Шаблонизатор своими руками.

4.19K
.
Tadochi (01.01.2013 / 19:33)
вот в описании некоторых шаблонизаторов говорится что шаблоны компилируются, зачем это нужно в шаблонизаторах, что это дает?
Почитай про метод замены, вот когда он произойдет то это будет скомпиленный шаблон
.
Koenig
(\/)____o_O____(\/)
есть такой вопрос, точнее хорошо и удобно ли я делаю, или камень какой либо подводный существует в данной реализации шаблонизатора.
мысль сделать удобство и непринужденность , отделить пых от верстки и прочее
шаблонизатор
// тут класс шаблонизатора, который подключается по автолоаду
class template {

function __construct() {

foreach ($GLOBALS as $k => $v) {
global $$k;    
$$k = $v;
}
    
$param = func_get_args();
$row = array();
foreach ($this as $k => $v) 
$row[$k] = $this->var_filter($v);
file_exists($param[0]) ? include($param[0]) : print('Файл шаблона отсутствует или не правильно указан путь');
}

function var_filter($var) {
return htmlentities($var,  ENT_QUOTES, 'UTF-8');
}

}

далее скажем индекс, в который могут инклюдиться всякое разное добро, и в нем вызов шаблона
spl_autoload_register('autoload');   
function autoload($class) {
$file = dirname(__FILE__) . DS . 'classes' . DS . $class . '.php';
if (file_exists($file)) {
require_once($file);
} else {
die('Класс - ' . $class . ' не найден');  
}
}

// произвольный код //

$test_var = 'this is a test varible';

$sql = mysql_query("select * from " . $tab));  
if (mysql_num_rows($sql)>0) {
while ($obj = mysql_fetch_object($sql, 'template', array('tpl/index/tpl.tpl')));
} else {
echo 'пусто';    
}

// далее код //

шаблон

<!-- tpl -->
<div><a href="?link=<?= $row['id'] ?>"><?= $row['name'] ?></a></div>
<?= $test_var // каббе глобальная, не нужно задумываться о инициализации // ?>
?>
<!-- end tpl -->

вот тут терзают сомнения, по идеи плохого ни чего не должно случиться, то есть если мы подключили ядро, то в шаблоне можно использовать скажем переменную $rights
.
Bewahret einander vor Herzeleid
Полезная статья. Сохранил
.
(\/)____o_O____(\/)
перечитал, переосмыслил, понравился =)
.
Koenig, Ты тему старую перечитал ?...
.
(\/)____o_O____(\/)
Fublin, да, просто начал велосипедить своё, и в итоге пришел к выводу, что этот вариант очень гуд, причем охватывает все, что я хотел, и весит копейки
.
(\/)____o_O____(\/)
Навелосипедил простой нативный шаблонизатор
Сам класс
class Tpl {
    
    private $dir;
    
    private $ext;
    
    public function __construct($dir, $ext) {
        $this->dir = $dir;
        $this->ext = $ext;
    }
   
    public function __call($name, $arguments) {
        $action = substr($name, 0, 3);
        $property = strtolower(substr($name, 3));
        switch ($action) {
            case 'get':
                return $this->$property;
                break;
                
            case 'set':
                $this->$property = $arguments[0];
                break;
                
            default :
                return false;
        }
    }
    
    public function args($args) {
        return call_user_func_array(array($this, 'render'), $args);
    }

    public function render($tpl, $data = null) {
        if (!is_null($data)) {
            foreach($data as $key => $val) {
                $k = 'set' . $key;
                $this->$k($val);
            }
        }
        
        ob_start();
        if (is_file($this->dir . DIRECTORY_SEPARATOR . $tpl . '.' . $this->ext)) {
            include($this->dir . DIRECTORY_SEPARATOR . $tpl . '.' . $this->ext);
        } else {
            echo '<h1>Tpl debug<h1><pre>' . print_r($data, 1) . '</pre>';
        }
        
        return ob_get_clean();        
    }
}

Шаблон
require_once('classes/tpl.php');

$tpl = new Tpl('tpl', 'tpl.php');
// задаем папку где будут лежать наши шаблоны и их расширение

$names = array('names' => array('Вася', 'Петя', 'Коля'));
$dirs = array('dirs' => array('images', 'cache', 'work'));
$test = array('test' => 'testus');

// вариант 1
$array = array_merge($names, $dirs, $test);

echo $tpl->render('test', $array);

// вариант 2
$tpl->setNames(array('Вася', 'Петя', 'Коля'));
$tpl->setDirs(array('images', 'cache', 'work'));
$tpl->setTest('testus');

echo $tpl->render('test');

скрин
Прикрепленные файлы:
.
ramzes
Koenig, в твоем случае было бы проще заменить класс на функцию (пару функций), заливать в нее данные и инклудить шаблон (вообще сама идея то еще во фреймовой верстке использовалась, помните диски с софтом и хтмл-интерфейсом?)
Все таки обьект медленнее как мне помнится, и памяти потребляет больше, дело конечно вкуса больше, но для класса я бы искал более серьезные причины (функционал)
P.S. чисто имхо по коду (подходу) префиксы set\get ненужны
__call($name, $val = null) {
if($vall!=null) {/* set */} else {/* get */}
...
}
.
Koenig, Для кого?)


Просто оставлю это здесь:
http://platesphp.com
.
Koenig
(\/)____o_O____(\/)
сам шаблон
http://annimon.com/code/5027
Всего: 125