Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Язык описания шаблона, Опять про шаблонизаторы :) 
:(
    Опции темы
CyClon
Дата 7.10.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



/index.php
Код
<?php

...

$tpl = new Template('templates/' . CONFIG_TEMPLATE);
$tpl->loadTpl('default.html');

...

$tpl->addVar('encoding', LANGUAGE_ENCODING);
$tpl->addVar('language', LANGUAGE_LANGUAGE);
$tpl->addVar('title', 'SH-CMS');
$tpl->addVar('welcome', LANGUAGE_WELCOME);
$tpl->addVar('content', module());
$tpl->addBlock('blocks-left', array('Block 1' => 'Content 1', 'Block 2' => 'Content 2', 'Block 3' => 'Content 3'));
$tpl->addBlock('blocks-foot', array('Ссылка 1', 'Ссылка 2', 'Ссылка 3', 'Ссылка 4', 'Ссылка 5'));
$tpl->show();

?>

/kernel/classes/Template.class.php
Код
<?php

class Template
{
    function __construct($tplDir)
    {
        $this->tplDir = $tplDir;
    }

    function loadTpl($tplFile)
    {
        $this->tpl = file_get_contents($this->tplDir . '/' . $tplFile);
    }

    function addVar($var, $val)
    {
        $this->vars[$var] = $val;
    }

    function addBlock($block, $content)
    {
        $this->blocks[$block] = $content;
    }

    function show()
    {
        $this->parseTpl();
        echo $this->tpl;
    }

    private function parseBlock($beginBlockName, $endBlockName, $tpl, $pattern)
    {
        if ($beginBlockName == $endBlockName && isset($this->blocks[$beginBlockName])) {
            $result = '';
            $search = array('{BLOCK:NAME}', '{BLOCK:CONTENT}');
            foreach ($this->blocks[$beginBlockName] as $name => $content) {
                $replace[] = (is_integer($name)) ? '' : $name;
                $replace[] = $content;
                $result .= str_replace($search, $replace, rtrim($tpl));
            }
            return ltrim($result);
        } else {
            return $pattern;
        }
    }

    private function parseTpl()
    {
        $this->tpl = preg_replace('~<!-- BEGIN (.+) -->(.+)<!-- END (.+) -->~esU', '$this->parseBlock(\'\\1\', \'\\3\', \'\\2\', \'\\0\')', $this->tpl);
        foreach ($this->vars as $var => $val) {
            $this->tpl = str_replace('{' . $var . '}', $val, $this->tpl);
        }
    }
}

?>

/templates/lite/default.html
Код
<?xml version="1.0" encoding="{encoding}"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{language}" lang="{language}">
  <head>
    <title>{title}</title>
  </head>
  <body>
    <h1>{welcome}</h1>
    <ul>
      <!-- BEGIN blocks-left -->
      <li>{BLOCK:NAME} - {BLOCK:CONTENT}</li>
      <!-- END blocks-left -->
    </ul>
    <br />
    <br />
    {content}
    <br />
    <br />
    <!-- BEGIN blocks-foot -->< <b>{BLOCK:CONTENT}</b> ><!-- END blocks-foot -->
  </body>
</html>

RESULT
Код
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
  <head>
    <title>SH-CMS</title>
  </head>
  <body>
    <h1>Добро пожаловать!</h1>
    <ul>
      <li>Block 1 - Content 1</li>
      <li>Block 1 - Content 1</li>
      <li>Block 1 - Content 1</li>
    </ul>
    <br />
    <br />
    C:\Dev\Apache\htdocs\cms\modules\news\index.php is loaded!
    <br />
    <br />
    < <b>Ссылка 1</b> >< <b>Ссылка 1</b> >< <b>Ссылка 1</b> >< <b>Ссылка 1</b> >< <b>Ссылка 1</b> >
  </body>
</html>


Может быть у кого есть замечания/идеи/предложения/т.п. по реализации шаблонизатора? Пишу в первый раз, но хочется чтобы все было ок smile

Заранее спасибо smile

Это сообщение отредактировал(а) CyClon - 7.10.2007, 20:11


--------------------
user posted image
PM   Вверх
CyClon
Дата 7.10.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Форум глючит :((( Ну, лан, напишу по сабжу еще раз:

Хотелось бы увидеть ваши "любимые" способы реализации языка шаблонов. Нужны примеры кусков кода, посмотреть smile


--------------------
user posted image
PM   Вверх
Shedar
Дата 7.10.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 10.6.2007

Репутация: нет
Всего: 2



Цитата(CyClon @  7.10.2007,  17:58 Найти цитируемый пост)
предложения

Сначала все вроде просто. Потом захочется условий в шаблоне, потом циклов, потом вызова функций.
Вопрос в том, стОит ли изобретать шаблонизатор.
Если ориентироваться только на php - посмотреть хотя бы в сторону smarty, если более широко, то на связку xml+xslt.
У меня в свое время в процессе написания шаблонизатора получился гибрид xslt и smarty =) Потому бросил не дописав, пользуюсь готовым.

PM MAIL WWW ICQ   Вверх
CyClon
Дата 7.10.2007, 20:44 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



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


--------------------
user posted image
PM   Вверх
Shedar
Дата 7.10.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 10.6.2007

Репутация: нет
Всего: 2



Пример. Раздаем информер новостей.  Есть логика, которая знает какие новости взять и откуда их взять. Есть представление этих новостей. Либо мы вводим еще один слой, который знает как форматировать новости для каждого из партнеров, либо под каждого делаем шаблон вывода. И сразу получаем циклы (пройти по всем новостям), условия (например вывести не в одну колонку а в две), вызов функций (нужно дату новости отформатировать не как у всех, а как нравится партнеру).
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.