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

Поиск:

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


Опытный
**


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

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



Цитата(Daevaorn @ 6.11.2007,  23:14)
Дизайнеру/верстальщику этот максимум не нужен. Им нужен удобный, просто и быстрый способ извлечения данных. При этом с защитой от дурака, чтобы ничего не сломать в логике случайно. Собственно для того шаблонизаторы и есть.

Не согласен.
Шаблоны не обязательно нужно верстальщику. Шаблоны нужны просто для грамотного вывода. 
Разделить вывод страницы на отдельные этапы - это кстати для аякса очень важно, т.к. там происходит обновление фрагментов страницы.
В сложных проектах очень сложная логика и я считаю, что эта логика должна быть максимально очищена от задач не связанных с ней - например шаблонизацией. Отсюда можно сделать вывод, что задача вывода должна быть вынесена в другой слой. 
Я выношу её в шаблонный слой, т.к. часто сталкиваюсь со сложной шаблонизацией.
Если стоит проблема неграмотного дизайнера, то тут имхо можно создать промежуточный слой между данными скрипта и шаблонизацией.  Этот слой как раз и будет заниматься приготовлением.
PM MAIL   Вверх
Daevaorn
Дата 7.11.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(flashaa @  7.11.2007,  13:58 Найти цитируемый пост)
Не согласен.

так и не понятно почему.
Цитата(flashaa @  7.11.2007,  13:58 Найти цитируемый пост)
Шаблоны не обязательно нужно верстальщику. Шаблоны нужны просто для грамотного вывода. 

ну не знаю как где, а у нас именно ему и нужны. поскольку его работа - интеграция его верстки в систему с помощью шаблонизатора, который мы(программисты) ему предоставляем.
Цитата(flashaa @  7.11.2007,  13:58 Найти цитируемый пост)
Разделить вывод страницы на отдельные этапы - это кстати для аякса очень важно, т.к. там происходит обновление фрагментов страницы.
В сложных проектах очень сложная логика и я считаю, что эта логика должна быть максимально очищена от задач не связанных с ней - например шаблонизацией. Отсюда можно сделать вывод, что задача вывода должна быть вынесена в другой слой. 
Я выношу её в шаблонный слой, т.к. часто сталкиваюсь со сложной шаблонизацией.
Если стоит проблема неграмотного дизайнера, то тут имхо можно создать промежуточный слой между данными скрипта и шаблонизацией.  Этот слой как раз и будет заниматься приготовлением. 

а это вообще из другой темы. и шаблоны тут не причем.
PM MAIL WWW   Вверх
flashaa
Дата 7.11.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Daevaorn @  7.11.2007,  13:06 Найти цитируемый пост)
а это вообще из другой темы. и шаблоны тут не причем. 

Если это Вам не нужно, то это не говорит о том, что оно из другой оперы.
То что вы предоставляете дизайнеру это один из плюсов, но не единственный плюс в использовании шаблонов.
PM MAIL   Вверх
webaliser
Дата 15.12.2007, 21:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Шаблонизаторы... PHP, как супер-шаблонизатор(по мнению SamDark )

А приврати ка, SamDark, древовидное редактируемое 3х уровневое меню

Шаблон:
Код

<table cellSpacing=0 cellPadding=0 border="0" width="100%">
<!-- BDP: bdpcatalog -->
    <tr>
        <td class="lm_g" id='mgr_{FID}_bg'>
            <table cellSpacing=0 cellPadding=0 border="0" width="100%">
                <tr>
                    <td class="lm_arrow" id='mgr_{FID}_i'><img src="{TPLROOT}img/z.gif" width="6px" height="1px" alt="" /></td>
                    <td class="lm{ADM}"><a href='{FLINK}' id='mgr_{FID}' onclick='subgroups_my(this)' onmouseover="lm_a(this,'0')" onmouseout="lm_(this,'0')">{FTITLE}</a>{FADMIN}</td>
                </tr>
            </table>
        </td>
    </tr>
        <!-- BDP: bdpelems -->
            <tr>
            <td>
                <div id='sub_mgr_{FAID}_sub' style='display:{FVISIBLE}'>
                    <!-- BDP: bdpelem -->
                    <table cellSpacing=0 cellPadding=0 border="0" width="100%" class="">
                        <tr>
                            <td class="lm_g_sub" id='sub_mgr_{SID}_bg'>
                                <table cellSpacing=0 cellPadding=0 border="0" width="100%">
                                    <tr>
                                        <td class="lm_arrow" id='sub_mgr_{TID}_i'><img src="{TPLROOT}img/z.gif" width="6px" height="1px" alt="" /></td>
                                        <td class="lm_sub{ADM}"><a href='{SLINK}' id='sub_mgr_{SID}' onclick='sub_subgroups_my(this)' onmouseover="lm_suba(this,'mgr_{FID}')" onmouseout="lm_sub(this,'mgr_{FID}')">{STITLE}</a>{SADMIN}</td>
                                    </tr>
                                </table>
                            </td>
                        </tr>
                        <!-- BDP: bdpeelems -->
                        <tr>
                            <td class="lm_sub_hand">
                                <div id='sub_mgr_{SAID}_sub_sub' style='display:{SVISIBLE}'>
                                <!-- BDP: bdpeelem -->
                                    <div class="lm_g_sub_sub{ACTELEM}"><div class="lm_sub_sub{ADM}"><a href="{TLINK}" onmouseover="slm_suba('mgr_{FID}','sub_mgr_{SID}')" onmouseout="slm_sub('mgr_{FID}','sub_mgr_{SID}')">{TTITLE}</a>{TADMIN}</div></div>
                                <!-- EDP: bdpeelem -->
                                </div>
                            </td>
                        </tr>
                        <!-- EDP: bdpeelems -->
                    </table>
                    <!-- EDP: bdpelem -->
                </div>
                </td>
            </tr>
        <!-- EDP: bdpelems -->
    
<!-- EDP: bdpcatalog -->

{AID}
{AEID}
</table>


Вот во что-то типа такого:
Код

    Результат не дало вставить, так как у него больше 3 тысяч строк и 100000 символов :)

.....................Тут мы код обрежем..............

Результат в полном виде можно увидеть сдесь

Бесшаблонизатрный подход важен там, по моему мнению, где нужна сверх скорость и ничего в алгоритме вывода и шаблоне вывода не будет менятся. Так как вывести шаблонизатором 10000-20000 записей из базы и построить их - это большая нагрузка...

Шаблонизатор и его отсутствие - это как MS Office 2007(Win) и vi(Linux). Чем проще механизм, тем быстрее и бесглючней он отпашет

p.s. Памятник погибшим товарищам, просмотревшим мой код до конца  smile 
PM MAIL   Вверх
Daevaorn
Дата 15.12.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(webaliser @  15.12.2007,  22:08 Найти цитируемый пост)
Бесшаблонизатрный подход важен там, по моему мнению, где нужна сверх скорость и ничего в алгоритме вывода и шаблоне вывода не будет менятся. 

Для сверхскорости можно во первых не использовать php, а если всё-таки зацепило за него намертво, то можно ускориться кешированием и прочими ухищрениями. Но экономить на удобстве не нужно.
PM MAIL WWW   Вверх
Feldmarschall
Дата 15.12.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Интересный топик.

webaliser, а кто говорит о бесшаблонном подходе?
При чем здесь вывод 10000 записей? Даже 1000 выводить нет смысла.

Задавать вопросы "а вот построй-ка на {имя шаблонизатора}" не имеет смысла. Все шаблонизаторы имеют примерно одинаковый функционал.
За исключением применяемого тобой блочного, когда для изменения вывода надо лезть глубоко в код.
PM   Вверх
webaliser
Дата 15.12.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Daevaorn, Я бы с удовольствием сэкономил бы... если бы знал где?! PHP4+MySQL - это все что мона юзать  smile 
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 23:19 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



webaliser, ты просто не понимаешь, что PHP - это не "басшаблонный подход", а просто еще один из шаблонизаторов.

В обсуждении такой сложной темы, как шаблоны, важно, на мой взгляд, соблюдать два очень выжных правила.
1. Не путать понятия. Очень многие люди называют шаблоном только свой движок, а остальное- "лапшой". Очень многие заблуждаются в том, что в шаблоне нет логики. Оень многие думают неправильно, что задача шаблонизатора - это разделить "код" и "PHP" и что верстальщик - единственный, для кого делается шаблон.
2. Не искать единственный идеальный вариант на все случаи жизни. Это вообще ко всем спорам относится.

У твоего - блочного - шаблона есть плюсы и есть минусы.
Он - да, самый простой для понимания. Но и самый сложный для изменения. Поскольку для смены логики шаблона придется лезть в код.
Я не говорю, что это ужасно. Это просто факт.
Ещё один факт состоит в том, что нельзя разделить работу верстальщика и программиста. 
В шаблонах с логикой единственным посредником между верстальщиком и программистом является набор данных. А в твоем шаблоне это ещё и логика их вывода.
Если на пхп написано 
Код

<? if($page==$current): ?>
<?=$number?>
<? else: ?>
<a href=/?<?=$number?>><?=$number?></a>
<? endif ?>
То сразу понятно, что он делает.
А в твоем случае
Код

<!-- BDP: curpage -->
{number}
<!-- BDP: curpage -->
<!-- BDP: nocurpage -->
<a href=/?{number}>{number}</a>
<!-- BDP: nocurpage -->

непонятно, что означает этот curpage - условный переход? цикл? рекурсию?

Я не говорю, что это плохо. Это факт.

У блочных шаблонизхаторов есть зато большой плюс - можно красиво организовать рекурсию. С логическими это pain in the ass.
В общем, у всякого свои недостатки, как говорил один киногерой.
PM   Вверх
flashaa
Дата 17.12.2007, 00:27 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Feldmarschall,
PHP, пожалуй, лучший шаблонизатор, он обладает большими возможностями и свободами. В этом как ни странно,  и его минусы.
Для составления шаблонов на php надо иметь четкую организацию и представление как будут выглядеть блоки, а так же следить, чтобы объявлялись необходимые для работы переменные. Что-то из этого не уследил - гора нотисов, и неправильно отображенная страница.
Здесь вижу плюс XSLT и smarty, места, где они связаны со скриптом четко видны (через сбор XML и методы, соответственно). Так что они мусора просто не нагребут. Думаю за это их предпочитают. Т.к. не надо думать, просто возьми и делай шаблоны, за тебя уже подумали.. Правда благодаря этому не ты управляешь скриптом а шаблонизатор, следовательно, все это не совсем оптимально и не оптимизируется больше определенного уровня.

Это сообщение отредактировал(а) flashaa - 17.12.2007, 00:28
PM MAIL   Вверх
Feldmarschall
Дата 17.12.2007, 00:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Неправильно отображённая страница - из-за нотисов? Так мы вывод ошибок в аутпут отрубим нафиг, и все. 
Я, бы, скорее, в минусы записал потенциальную опасность шаблона для приложения.

Со Смарти и ХСЛТ не всё так просто. К сожалению, слишком часто в этом мире вещь выбирается не из-за реальных потребительских качеств, а из-за неверных представлений о ней.
Смарти часто выбирают в совершенно искреннем стремлении отделить "PHP от HTML", избавиться от "ужасной лапши". Учитывая возможности смарти по части логики.... не удивляешься вопросам, как из неё работать с БД!

Вообще, я для себя решил, что работать на какого-то "дизайнера" - самая дурацкая причина делать шаблон.
Куда важнее, с точки зрения программиста, уметь
- вывести сообщение об ошибке вместо контента, сохранив дизайн сайта.
- иметь возможность выводить несколько вариантов отображения, просто меняя шаблоны.
- иметь возможность обновлять движок, стоящий на разных сайтах (это вообще высший пилотаж, и попытка сделать такое быстро выкидывает из головы все глупые фантазии о шаблонах и оставляет только действительно дельное).
PM   Вверх
SamDark
Дата 9.1.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



webaliser
Цитата

А приврати ка, SamDark, древовидное редактируемое 3х уровневое меню...

Кто ж так меню делает? Списками его надо... тогда проблемы не будет.


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


Опытный
**


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

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



Цитата
Бесшаблонизатрный подход важен там, по моему мнению, где нужна сверх скорость и ничего в алгоритме вывода и шаблоне вывода не будет менятся. Так как вывести шаблонизатором 10000-20000 записей из базы и построить их - это большая нагрузка...

Шаблонизаторы с встроенным компилятором шаблонов и кэшированием показывать очень неплохие результаты. Компиляция производиться только один раз - после изменения шаблона (компиляция - перевод шаблона в PHP-код, то бишь строка "<title>{TITLE}</title>" будет переведена в "<title><?php echo $tpl->getVar('TITLE'); ?></title>"). Кэширование так же дает огромный прирост в производительности.

Я просто в восторге, когда вижу красивый код. Соотвественно я за шаблонизаторы.

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

Сам шаблон выглядит максимально понятным для верстальщика.
Код
<?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>


Сам шаблонизатор:
Код
<?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 = '';
            foreach ($this->blocks[$beginBlockName] as $name => $content) {
                $result .= str_replace(array('{BLOCK:NAME}', '{BLOCK:CONTENT}'), array($name, $content), 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);
        }
    }
}

?>


Использование:
Код
<?php

require('kernel/kernel.php');

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

if (isset($_GET['do']) && preg_match('~^[a-z0-9_-]{1,16}$~', $_GET['do']) && file_exists('modules/' . $_GET['do'] . '/index.php')) {
    include('modules/' . $_GET['do'] . '/index.php');
} else {
    include('modules/' . CONFIG_MAIN_MODULE . '/index.php');
}

$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();

?>



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


9/10 программиста
***


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

Репутация: 56
Всего: 146



CyClon, ваш шаблонизатор мне здорово напоминает CodeCharge Studio
PM MAIL   Вверх
CyClon
Дата 20.2.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Первый раз о таком слышу smile Писал по типу самого простого шаблонизатора PEAR, о котором прочитал в книге PHP 5 Power Programming (точнее взял за основу синтаксис в шаблоне, ибо интрукции в виде HTML комментариев имхо лучший выбор).

Добавлено через 1 минуту и 44 секунды
Да и шаблонизатор мой - только каркас, написанный за 30 минут smile Без кэширования или хотя бы компиляции шаблонизаторы лучше вообще не использовать, ибо не рационально smile


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


Опытный
**


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

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



sTa1kEr, насколько я понимаю, все "блочные" шаблонизаторы похожи один на другой. На php_templates, XTemplate и множество других. Недавно на этом форуме пробегал точно такой же. Идея-то очевидная. Так что искать отдельные совпадения не имеет смысла, имхо =)

CyClon, "без компиляции нерационально" - это заблуждение.
Миллионы РНР скриптов рабтают без компиляции и кеширования. И прекрасно работают.
Как я уже не раз говорил, работа с шаблоном - далеко не "бутылочное горлышко" веб-приложения. Конечно, самопальные шаблонизаторы на регулярках отстают по скорости от модулей на С и шаблонов на РНР, но не настолько, чтобы в первую голову заботиться об их производительности.
Так что, вполне можно пользоваться и этим "каркасом" =)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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