Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

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

Дата: Апрель 11, 2009

(6) комментариев

Шаблонизатор является основным модулем системы любой cms системы. Думаю почему я так считаю объяснять не надо. Любая CMS должна быть гибкой и представлять определённый минимальный набор функционала и сочитать универсальность подстройки дизайна. Именно универсальность интеграции дизайна и позволяет реализовать шаблонизатор. Шаблонизаторы бывают разных типов, от основанных на php шаблонах (самые простые) и до блочно модульных. Первый тип шаблонизаторов достаточно прост в реализации, но в свою очередь и более громоздкий, так как для интеграции требует как минимум базового знания языка программирования. По этому я хочу рассказать о втором типе.

Итак, как де всётаки должен работать такой шаблонизатор?
Представте себе, что у нас есть базовая вёрстка такого типа

1
<html><body><div>блок1</div><div>блок2</div><div>блок3</div></

Я максимально упростил для наглядности. Каждый блок в зависимости от параметра урла например или пост и гет запроса может иметь разное содержимое, более того, в зависимости от того же урла может меняться количество блоков или их расположение.
Ниже приведен код реализующий весь этот функционал и я расскажу как им пользоваться. Коментарии в коде

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php

class Template {

    public  $dir = '.';
    public  $template = null;
    public  $copy_template = null;
    public  $data = array();
    public  $block_data = array();
    public  $result = array('info' => '', 'content' => '');
    public  $template_parse_time = 0;

//задаём параметры основных переменных подгрузки шаблона

    public function set($name , $var) {
        if (is_array($var) && count($var)) {
            foreach ($var as $key => $key_var) {
                $this->set($key , $key_var);
            } } else $this->data[$name] = $var;
    }

//обозначаем блоки

    public function set_block($name , $var) {
        if (is_array($var) && count($var)) {
            foreach ($var as $key => $key_var) {
                $this->set_block($key , $key_var);
            } } else $this->block_data[$name] = $var;
    }

//производим загрузку каркасного шаблона

    public function load_template($tpl_name) {
    $time_before = $this->get_real_time();
        if ($tpl_name == '' || !file_exists($this->dir . DIRECTORY_SEPARATOR . $tpl_name)) { die ("Невозможно загрузить шаблон: ". $tpl_name); return false;}
        $this->template = file_get_contents($this->dir . DIRECTORY_SEPARATOR . $tpl_name);
        if ( stristr( $this->template, "{include file=" ) ) {
            $this->template = preg_replace( "#\\{include file=['\"](.+?)['\"]\\}#ies","\$this->sub_load_template('\\1')", $this->template);
        }
        $this->copy_template = $this->template;
    $this->template_parse_time += $this->get_real_time() - $time_before;
    return true;
    }

// этой функцией загружаем "подшаблоны"

    public function sub_load_template($tpl_name) {
        if ($tpl_name == '' || !file_exists($this->dir . DIRECTORY_SEPARATOR . $tpl_name)) { die ("Невозможно загрузить шаблон: ". $tpl_name); return false;}
        $template = file_get_contents($this->dir . DIRECTORY_SEPARATOR . $tpl_name);
        return $template;
    }

// очистка переменных шаблона
    public function _clear() {
    $this->data = array();
    $this->block_data = array();
    $this->copy_template = $this->template;
    }

    public function clear() {
    $this->data = array();
    $this->block_data = array();
    $this->copy_template = null;
    $this->template = null;
    }
//полная очистка включая результаты сборки шаблона
    public function global_clear() {
    $this->data = array();
    $this->block_data = array();
    $this->result = array();
    $this->copy_template = null;
    $this->template = null;
    }
//сборка шаблона в единое целое
    public function compile($tpl) {
    $time_before = $this->get_real_time();
    foreach ($this->data as $key_find => $key_replace) {
                $find[] = $key_find;
                $replace[] = $key_replace;
            }
    $result = str_replace($find, $replace, $this->copy_template);
    if (count($this->block_data)) {
        foreach ($this->block_data as $key_find => $key_replace) {
                $find_preg[] = $key_find;
                $replace_preg[] = $key_replace;
                }
    $result = preg_replace($find_preg, $replace_preg, $result);
    }
    if (isset($this->result[$tpl])) $this->result[$tpl] .= $result; else $this->result[$tpl] = $result;
    $this->_clear()

А теперь немного о работе данного класса. шаблонизатор этот имеет 2 типа шаблонов, это каркасный шаблон (основной) и шаблоны блоков. Тоесть на каждый блок расположенный в каркасе мы можем нарисовать свой, отдельный шаблон.
приведу пример как работает данный шаблонизатор. Создадим несколько файлов
main.tpl — каркасный шаблон

1
<html><body><div>блок1</div>{sub_templ}</body></h

sub.tpl — шаблон блока

1
<div>{var1}</div><div>{var2}</div>

Итак, мы получили набор из 2-х шаблонов, но пока где у нас есть каркас с блоком {sub_templ} и блок с вёрсткой, в которую должны будут встроиться переменные {var1} и {var2}
Ключевые элементы как вы заметили мы взяли в фигурные скобки.
Теперь нам необходимо инициировать шаблонизатор и заменить нежные функциональные части. Делается это так:

1
2
3
4
5
6
7
8
9
10
$tpl    = new Template; //инициируем класс
$tpl->dir = 'View/tpl'; //задаём местоположение папки с шаблонами
$tpl->load_template('main.tpl'); //загружаем каркас
$tpl->set('{sub_templ}', $tpl->sub_load_template('sub.tpl')); //подключаем код блока

//подставляем значения переменных
$tpl->set('{var1}', 'блок2');
$tpl->set('{var2}', 'блок3');

$tpl->compile('main'); //собираем шабло

Обратите внимание, что в $tpl->set(‘{var1}’, ‘блок2′); вместо фразы «блок2″ может так же находиться люббая переменная.
Вышеописанный код выведет нам такой результат:

1
<html><body><div>блок1</div><div>блок2</div><div>блок3</div></
a

    Автор: Sergey




    6 комментариев на "CMS своими руками. Шаблонизатор."

    лол сказал:
    23.08.2009

    идея стырена с движка дле

    Sergey сказал:
    23.08.2009

    дле её тоже стырили :)

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

    Web сказал:
    18.11.2009

    Спасибо огромное!!!!! именно это и искал!!

    RevivaL сказал:
    23.02.2010

    Здраствуйте, а как здесь быть с циклами? Можно пример?

    RevivaL сказал:
    23.02.2010

    А как же быть с циклами? Можно пример? не могу разобраться..

    admin сказал:
    10.03.2010

    а боюсь что никак. сначала сформируйте готовый кусочек кода а потом подмените область зарезервированную под него… хотя теоретически както можно придумать и цикл, но мне лениво было замарачиваться

    могу дать наводку только.. надо переписать функцию compile
    или переписать load_template и в нужном месте не тупо перлэйсить всю область а реплэйсить её с заменой на контент+ такую же. это наверное будет проще

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов