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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонизатор 
:(
    Опции темы
Gold Dragon
Дата 5.2.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ну это упрощено конечно smile Но суть остаётся.. Плохо читаемо


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
-=Ustas=-
Дата 5.2.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

Репутация: 32
Всего: 69



Что то я не вижу тут у вас шаблонизатора?! Где он?
Код

<table>
    <tr><?
        $q['q1'] = 1;
        $q['q2'] = 2;
        <td><?=$q['q1'];?></td>
        <td><?=$q['q2'];?></td>
    <tr>
        <td><? if($w == 1){
            $q['q4'] = 4;
        }else{
            $q['q4'] = 5;
        }
        echo $q['q4'];
        ?></td>
        <? $q['q3'] = 3; ?>
        <td><?=$q['q3'];?></td>
    </tr>
</table>

Здесь у вас часть логики в шаблоне, что само собой противоречит шаблонам (если это не активные шаблоны в компонентном подходе). А шаблон должен выглядеть как
Код

<table>
    <tr>
        <td>{OPT_1}</td>
        <td>{OPT_2}</td>
    <tr>
        <td>{OPT_3}</td>
        <td>{OPT_4}</td>
    </tr>
</table>



--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Gold Dragon
Дата 6.2.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



-=Ustas=-, так я про это и сказал smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
SamDark
Дата 6.2.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

Репутация: 10
Всего: 38



-=Ustas=-
Gold Dragon
Я всё-таки считаю, что конструкциям перебора вроде foreach самое место в шаблонах. Не даром они есть в XSLT.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
-=Ustas=-
Дата 6.2.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

Репутация: 32
Всего: 69



Цитата(SamDark @  6.2.2007,  09:43 Найти цитируемый пост)
Я всё-таки считаю, что конструкциям перебора вроде foreach самое место в шаблонах. Не даром они есть в XSLT.

Я не против активных шаблонов с обходом циклов, но в таком случае нужно реализовывать псевдо-код, чтобы PHP-шными конструкциями не пугать дизайнеров-верстальщиков.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Sardar
Дата 6.2.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Шаблонизатор должен просто размечать места в шаблоне и уметь собирать части шаблона в блоки. Всё остальное должно реализовываться view обьектом (контроль маркеров).

Код
<div id="news_platf">
   <!-- это просто захватывающий блок, может быть использован где угодно по шаблону -->
   {%block-start: "news row"%}
       <div class="news_row">{%title%}....{%body%}</div>
   {%block-end: "news row"%} <!-- избыточность для проверки ошибок, это лучше чем глюки -->

    <!-- собстно вызываем вывод, имена блоков лучше зашить, аргументом отдаём текст если новостейнет (локализоанный шаблон) -->
   {%news: not-found="Нет новых новостей"%}
</div>


Код
//простой хендлер шаблона, в реалиях наследуем от базовых (реализуют инклюды и более продвинутые event'ы)
class NewsTplHanler implements TemplateDocumentHandler {
     //любым путём получаем данные...
     private $rows;
     private $row;

     public function processTag(AbstractTemplateDocumentBlock $block, $action, $markers) {
           switch($action) {
                //выводим инфу
                case 'news': if(sizeof($rows) < 1) echo $markers['not-found']; //наше собщение что нет новостей. его лучше положить бы в блок с вёрсткой
                                    else $block->executeBlock($this, "news row");

                //по дефолту теги без action имеют его как 'marker'
                case 'marker': echo $this->row[$marker[0]]; //выводим инфу из текущей записи
           }
     }

     //выполняем блок (true - принять вывод, false - выбросить)
     public function startBlock($thisblock, AbstractTemplateDocumentBlock $openblock) {
          if($openblock->getName() == "news row") {
               $row = is_null($row)? current($this->rows): $row; //первый вход в блок
               return $row !== false;
          }
          return true;
     }

     //закончен блок, (true - повторить блок, false - идти дальше)
     public function endBlock(AbstractTemplateDocumentBlock $block) {
          if($openblock->getName() == "news row") {
               $row = next($this->rows); //хоть из базы хоть откуда
               return $row !== false;
          }
          return false;
     }
}

...
//во view обьекте
$provider = new LocalizedTemplateDocumentProvider(); //версия провайдера поддерживающая локализованные шаблоны
$tpl = $provider->getTemplate('test/my_template');
$tpl->processOutput($news_template_handler);


Может показатся громоздко, но это удобно. Отказался от подхода Pear:Flexy парсить HTML в DOM и трансформировать его, т.к. шаблонизатор проще для понимания, эффективней и удобно для генерации .rtf документов (любого текста). XSLT трансформации в таких простых случаях кк вывод из базы тоже лишний. Шаблонизатор выше тут.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
SamDark
Дата 7.2.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

Репутация: 10
Всего: 38



Sardar
Если {%block-start: "news row"%} просто заменить на {foreach news as entry} получится практически то же самое.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
BobiKK
Дата 7.2.2007, 20:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

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



Цитата(-=Ustas=- @ 6.2.2007,  12:27)
Я не против активных шаблонов с обходом циклов, но в таком случае нужно реализовывать псевдо-код, чтобы PHP-шными конструкциями не пугать дизайнеров-верстальщиков.

PHP - сам шаблонный движок. И этим надо пользоваться, а не изобретать ещё велосипеды.
http://framework.zend.com/manual/en/zend.view.html - вряд ли ребятки из зенда не смогли написать свою версию smarty. Просто это мало кому нужно. А дизайнером по-прежнему не надо знать, что такое php
PM MAIL   Вверх
SamDark
Дата 8.2.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

Репутация: 10
Всего: 38



BobiKK
Всё правильно, см. начало темы.
Ребята из Zend не стали писать свой Smarty т.к. он уже прекрсано интегрируется с Zend Framework.




--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
artfabrique
Дата 26.2.2007, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Дизайн
*


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

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



что такое шблонизатор - это что-то что собирает из кусков результат и возвращает его, прально?
соответственно, на чем нужно думать при написании:

1)Где и как хранить шаблоны
2)Кокого типа могут быть шаблоны (XML, HTML)
3)Как будут выглядеть управляющие ключевые слова в шаблонах 
(например "blablablabla{[module:news]}blablablabla") их синтаксис итд. чтоб он самому тупому был понятен (интуитивно)
4)какого типа могут быть эти "заменяемые места" в шаблонах (например: "модуль","другой шаблон" итд.
5)как оптимальней при хранении в БД часто используемой инфы её от-туда доставать
Тоесть нужно кеширование провека обновлений итд.
6)Как сделать универсальную таблицу - дерево в БД чтобы в ней хранились все деревья шаблонов
тут кстати очень удобно пользоваться встроенными процедурами (к сожалению в Мускуле они пока не особо)
7)Какие основные методы должен поддерживать шаблонизатор, и,не маловажно, как их назвать чтобы сразу было понятно что он выполняет без документации =))))) и это реально (я в это верю)
8)Какие данные, пардон какой сегмент и тип данных хранить в БД а какой в XML (похоже на первый пункт но не совсем)
9)Обязательно должна быть возможность переключения режимов производительности, например, если сервер перегружен то следующим 10 запросам отдаем только кэшь не старше токого -то времени.

пока больше НЕДЕТАЛЬНЫХ вещей в голову не лезет =)
--------------------
Я спасу мир! © ЙУХ 0000г.
PM MAIL WWW ICQ   Вверх
Sardar
Дата 26.2.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(SamDark @  7.2.2007,  09:18 Найти цитируемый пост)
Если {%block-start: "news row"%} просто заменить на {foreach news as entry} получится практически то же самое. 

Нет, шаблонизатор не знает что такое news, для него не существует понятия переменная, коллекция и т.д. Шаблонизатор просто генерит события для контроллера шаблона, отлавливая весь вывод. Это более гибко.

artfabrique, большинство, что ты перечислил в обязанности шаблонизатора ни каким боком не входит. Шаблонизатор это один из инструментов, с помощью которых view объекты собирают страницу. Главная задача шаблона держать весь текст, возможный на странице, так что бы в програмном коде строковых констант никогда бы не было. Это позволит без проблем сделать многоязычный/локализованный сайт.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Platon
Дата 8.3.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Здравствуйте, уважаемые.

Долго тормозил меня этот смарти, очень неудобная вещь.
Искал выход и пришел к тому с чего начал, т.е. к тому, чем пользовался до использования смарти.
Вот пример, очень схожий с подходом Gold Dragon:

main_frame2.tpl
Код

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?= $title ?></title>
<?= $js ?>
</head>

<body>
<table border="1" width="100%">
<tr>
    <td><a href="<?= $site_root ?>"><img src="<?= $site_root ?>images/logo.jpg" width="200" height="100" alt="logo" /></a></td><td><h1 align="center">SITE_NAME</h1></td>
</tr>
<tr>
    <td width="200" valign="top"><?php $navigation->display() ?></td><td valign="top"><?= $main->display() ?></td>
</tr>
</table>
</body>
</html>


Код

class SiteMainFrame extends MainFrame {
    function SiteMainFrame () {
        parent::MainFrame();
        $nav = new SiteNavigationView();
        $this->setNavigation($nav);
        $main = new VerticalLayout();
        $userPanel = new EmptyView();
        if (SimpleAuth::checkAuth()) {
            $user = UserAuthInfo::createById(SimpleAuth::getUserId());
            $userPanel = new UserPanelView($user);
        }
        else {
            $userPanel = new LoginPanelView();
        }
        $main->addWidget($userPanel);
        $main->addWidget($nav);
        $this->setMain($main);
    }
}

class MainFrame {
    var $site_root;
    var $title;
    var $main;
    var $navigation;
    var $js;
    function MainFrame() {
        $this->site_root = SITE_ROOT;
        $this->title = "Site";
        $this->main = "MainPart";
        $this->navigation = "Navigation";
    }
    
    function display() {
        include (ROOT_DIR . "templates/default.tpl");
    }
    
    function setTitle(&$title) {
        $this->title =& $title;
    }
    
    function &getTitle() {
        return $this->title;
    }
    
    function setMain(&$main) {
        $this->main =& $main;
    }
    
    function &getMain() {
        return $this->main;
    }
    
    function setNavigation(&$navigation) {
        $this->navigation =& $navigation;
    }
}


Вот уже канва есть.

Код

$mainFrame = new SiteMainFrame();
$mainFrame->display();


Выводится базовая страничка.
Редактировать уже существующие разделы можно так:

Код

$main =& $mainFrame->getMain();
// $main - VerticalLayout - это конечно не оч корректно, надо, чтоб он был виджетом, но мне пока и так хватает
$model = ForumManager::createByParentId(1);
// $model - массив тем.
$forumPoster = new ForumView($model);
$main->аddWidget($forumPoster);


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

1. Не надо никаких шаблонизаторов (двойного парсинга PHP, шаблонизатор), а только 1 парс PHP
2. Лишних телодвижений нет, от переприсваиваний можно избавиться.
3. Самое главное! Код отделен от дизайна
4. Собирается как конструктор.
5. Не хранит в памяти уже скомпилированные куски дизайна (часто бывало когда надо делать $smarty->fetch()), весь дизайн сразу улетает адресату.

Минусы конечно тоже есть:

1. Дизайнеру очень трудно смириться с тем что ему придется учить 3-4 конструкции языка.
2. Безусловно приятней писать {$info}, чем <?= $info ?>, тем более <?= $info->display() ?>, не говоря уже о <?= $this->info->display() ?>
3. (Лично мне) работаю в Дримвейвере 8, при работе с смарти в окне дизайнера удобно было видеть <td>{$info}</td><td>{$comment}</td> как "{$info} {$comment}"
с PHP <td><?= $info ?></td><td><?= $comment ?></td> выводится в квадратиках два значка "php php"

оцените подход, дайте варанты решения минусовой стороны подхода.
PM MAIL ICQ   Вверх
nerezus
Дата 8.3.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

Репутация: 12
Всего: 43



Обычно в качестве шаблоизатора использую PHP. Если надо будет сделать что-то сложное, то тогда уж XSLT.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
flashaa
Дата 5.11.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 25



Цитата(SamDark @ 18.12.2006,  11:07)
americanets
Vaulter
Нафига вам шаблонизатор?! PHP и так самый замечательный шаблонизатор сам по себе.

Код

    function postfilter($buffer){
        // тут применяем фильтры уже сформированного html
        return $buffer;
    }
    
    $__content = $_GET['content'];
    ob_start('postfilter');
    include('design.php');
    ob_end_flush();


Шаблон:
Код

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <?php include($__content); ?>
    </body>
</html>

Совершенно согласен.

Добавлено @ 23:35
По моему мнению шаблоны это не только <html>{text}</html>
Шаблоны имхо это и ЛОГИКА и ТЕКСТ связанный с отображением страницы.
Управляющему скрипту совершенно наплевать, какие данные нужны шаблону - в строке или в массиве, если этой информации ДОСТАТОЧНО для построения страницы, она должна быть передана в шаблон, вся дальнейшая работа - в шаблоне.

Думаем дальше: если шаблон связан с логикой и обработкой, то почему бы не оставить логику и возможности PHP для обработки шаблонов. Максимум возможностей.
Что есть смарти? Надстройка над PHP, выполняющая то же самое что и сам PHP.
Что есть XSLT? Язык для трансформации XML. Для начала нам придется сформировать XML. А оно нам надо? К тому же XSLT сильно ограничен.

Это сообщение отредактировал(а) flashaa - 5.11.2007, 23:43
PM MAIL   Вверх
Daevaorn
Дата 6.11.2007, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(flashaa @  6.11.2007,  00:27 Найти цитируемый пост)
Думаем дальше: если шаблон связан с логикой и обработкой, то почему бы не оставить логику и возможности PHP для обработки шаблонов. Максимум возможностей.

Дизайнеру/верстальщику этот максимум не нужен. Им нужен удобный, просто и быстрый способ извлечения данных. При этом с защитой от дурака, чтобы ничего не сломать в логике случайно. Собственно для того шаблонизаторы и есть.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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