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

Поиск:

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


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



Что по Вашему мнению должен включать в себя шаблонизатор и какие функции вообще иметь?
1) Работа с одном документе с разными шаблонами.
2) Работа с данными (Как вывод простой переменной, так и массива в шаблоне).
3) Компиляция (Если файл шаблона изменился, "компилируем" заного).

Высказывайте мнения, алгоритмы, советы. Интересно всё.
PM MAIL Skype   Вверх
Opik
Дата 6.6.2005, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



Хм, ещё один немаловажный вопрос, какой делать синтаксис шаблонизатора?
можно сделать нечто вроде:
Код

  <tpl:if $var eq '1'>
    <tpl:out>$var</tpl:out>
  </tpl:if>

аля XML, что бы можно было прогонять через валидаторы всякие и т.д.
но получается немного громоздко, кому как удобно? тоже инетересно.
PM MAIL Skype   Вверх
Mal Hack
Дата 6.6.2005, 08:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Для меня шаблонизатор это только парс шаблона и создание документра. Весь программный код вне шаблона.
PM ICQ   Вверх
skalex
Дата 6.6.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


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

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



Обязательно должна быть поддержка циклических и условных операций ... Очень полезная вещь - это возможность получить вывод шаблона в переменную (без вывода на экран) (аналог fetch в Smarty).
PM   Вверх
Master
Дата 6.6.2005, 12:30 (ссылка) |  (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Есть уже готовый смарти, есть xslt, есть php на крайний случай... вопрос. зачем усложнять? я раньше тоже от безделия писал собственные шаблонизаторы и Изотоп этой болезнью болеет smile но только вряд-ли удастся здесь сделать какое-либо революционное открытие smile


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
skalex
Дата 6.6.2005, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


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

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



Master, согласен с Вами!
PM   Вверх
IZ@TOP
Дата 6.6.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Шаблонизатор должен по моему мнению много чего уметь:
1. Замена подстановок.

2. Замена констант (определенные в коде текстовые блоки).

3. Работа с циклами.
3.1 Работа с функциями внутри циклов.

4. Работа с уловными блоками, в т.ч. и в циклах.

5. Возможность подключения текстовых/РНР файлов в шаблон.

6. Некие утилиты для составления select'ов и прочих мелочей используемых в формах.

ОФФ: Master, гы smile . Ну страдаю... просто до xslt не дорос еще... как только время будет разобраться...


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
skalex
Дата 6.6.2005, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


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

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



На написание такой вещи как шаблонизатор может уйти уйма времени ... Все же мне было бы жалко его терять! Тем более что есть масса готовых решений.
IZ@TOP, все, что Вы написали есть в том же Smarty + можно расширять до бесконечности.
Другое дело - если появляется совершенно новая концепция или еще что-нибудь в этом духе ... Но вроде с шаблонизаторами уже все ясно и прозрачно ...
PM   Вверх
Opik
Дата 6.6.2005, 14:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



Mace
посмотри Smarty получше, посмотри СКОЛЬКО оно весит. Посмотри ВО ЧТО оно компилирует простенький пример. Да, Смарти это сила, но для больших проектов это лишний тормоз, ИМХО.
Цитата
есть масса готовых решений.

Есть масса всех примеров, зачем вообще писать что то своё? Однако всё же пишут и создают.
Вот в Смарти есь кеширование, хоть какое то, где оно ещё есть? (в более менее нормальном виде). Ты думал как такое сделать самому? А если попробовать?
Имхо процесс написания своего велосипеда повышает профессиональный уровень программиста. Ведь если на то пошло, 3/4 сайтов можно написать только на PEAR.
Добавлено @ 14:58
Mal Hack
Это я привел пример. Синтаксиса, аля XML, в этом была суть примера.
PM MAIL Skype   Вверх
skalex
Дата 6.6.2005, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


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

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



Цитата
посмотри Smarty получше, посмотри СКОЛЬКО оно весит

Ну я ужал движок Smarty до 170 Kb. Не такой уж и большой размер.

Opr, ты же одно время пропагандировал Smarty. Что заставляет отказываться от него ? Просто я знаком со Smarty чуть более недели ... На первый взгяд мне очень понравилось, хотя некоторая тормознутость имеет место. Может и не стоит начинать пользоваться ?
PM   Вверх
Opik
Дата 6.6.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



Mace
Я не заставляю от него отказываться. Движок хороший, мощный, но для некоторых задач ОЧЕНЬ тяжелый. Имхо выбор шаблнонизатора это что-то из ряда религиозных войн. Можешь специально создать тему, где обсуждать, в этой теме же обсуждается функционал удобного(!) шаблонизатора.
PM MAIL Skype   Вверх
Mal Hack
Дата 6.6.2005, 16:55 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



ИМХО, шаблонизатор - по сути основная нагрузка на скрипт, следовательно он должен наиболее оптимально к эт ом скрипту быть адаптирован.

Цитата(IZ @ 6.6.2005, 14:34)
4. Работа с уловными блоками, в т.ч. и в циклах.

Зачем? Зачем тратить машинное время на парс этих циклов. Не проще ли их выполнять на программном уровне сразу? Просто хочется понять.
PM ICQ   Вверх
Opik
Дата 6.6.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



Mal Hack
Цитата
ИМХО, шаблонизатор - по сути основная нагрузка на скрипт, следовательно он должен наиболее оптимально к эт ом скрипту быть адаптирован.

для этого и служит
Цитата
3) Компиляция (Если файл шаблона изменился, "компилируем" заного).

PM MAIL Skype   Вверх
Mal Hack
Дата 6.6.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Opr но ведь в нем все равно будет оставаться то, что нам (для конкретной задачи) не нужно. Или я чего-то не понимаю...
PM ICQ   Вверх
Aliance
Дата 6.6.2005, 18:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Для меня в шаблонизаторе главное (кроме, естественно, быстродействия, отсутствия багов и прочего) это - простота!
PM MAIL WWW ICQ Skype   Вверх
Opik
Дата 6.6.2005, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



Mal Hack
например!?
т.е в идеале подключается откомлиленный файл. Где нету ничего лишнего, по сути.
PM MAIL Skype   Вверх
IZ@TOP
Дата 6.6.2005, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Цитата(Mal @ 6.6.2005, 17:55)
Зачем? Зачем тратить машинное время на парс этих циклов. Не проще ли их выполнять на программном уровне сразу? Просто хочется понять.

Вообще я если честно долго думал, делать условные блоки или не делать в циклах шаблона, так пока и не сделал. Мне тоже кажется что это будет уже перебор. Хотя как то реализовать некоторые вещи хочется.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 6.6.2005, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



сами подумайте что будет выполнятся быстрее? (цикл)
1) аля IPB
Код

while($row = mysql_fetch_assoc($query))
{
      $out .= parseNews($row);
}
...
function parseNews($data)
{
return <<<EOF
...
EOF;
}

или
Код

<? while($row = mysql_fetch_assoc($query))
{ ?>
 <?=$row['text']?> ....
<? } ?>

PM MAIL Skype   Вверх
IZ@TOP
Дата 7.6.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Opik, и что же бдет работать быстрее?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 7.6.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



IZ@TOP
по моему всё таки второе, потому что не вызывается каждый раз функция, что всё таки тоже требует времени.
PM MAIL Skype   Вверх
IZ@TOP
Дата 7.6.2005, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Opik, ага, мне тоже так кажется. Но тогда если мы так дорожим производительностью, давайте кодить как наши прадеды!? smile


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 7.6.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

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



IZ@TOP
т.е? да и зачем в крайности.
PM MAIL Skype   Вверх
americanets
Дата 15.12.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



замена наборов символов в тексте на другой

у меня есть файл cont.txt

я его читаю
$f = fopen("sh.txt","r");
fclose($f);
он выступает в роли шаблона для страницы, как можно заменить в нем TITLE на $title
CONTENT на вызов функции и т д


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Mystery_of_being
Дата 15.12.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не легче в шаблоне вызывать код? 

Но я вот не совсем понял задачу.. у тебя в sh.txt есть title и ты хочешь его на $title ?  

str_replace ( 1, 2, 3)

Ищем (1), затем то что нашли меняем на (2) , где ищем (3)
PM MAIL WWW ICQ   Вверх
Vaulter
Дата 16.12.2006, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



americanets, есть такое понятие... шаблонизатор
.....
он все это делает, preg_matchи и т.д. 



--------------------
PM MAIL WWW ICQ   Вверх
americanets
Дата 18.12.2006, 08:55 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



понятно , буду искать и пробовать


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 18.12.2006, 11:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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>



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


Эксперт
***


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

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



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


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
nickon
Дата 18.12.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Что по Вашему мнению должен включать в себя шаблонизатор и какие функции вообще иметь?
1) Работа с одном документе с разными шаблонами.
2) Работа с данными (Как вывод простой переменной, так и массива в шаблоне).
3) Компиляция (Если файл шаблона изменился, "компилируем" заного).


Лично я считаю, что в самом шаблоне ничего не должно быть лишнего... только заданный набор тегов... 
всё остальное делается на уровне кода... 

Функций шаблонизатору нужно совсем немного .... замена одичных и блочных переменных... + грамотное кеширование...
как дополнение (опционально) можно сделать поддержку php кода в шаблонах ...

Воопще хотелось бы ещё обсудить принципы построения кеша для динамических шаблонов...  
PM MAIL   Вверх
Vaulter
Дата 18.12.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

так вот. для каждой функции вывода блока должна быть маленькая функция возвращающая время последнего изменения блока (для новостей, дата последней новости, для пользователя например дата последнего привата или даже 0 для стат. блоков!)

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

вот такой... пока TODO


--------------------
PM MAIL WWW ICQ   Вверх
SamDark
Дата 18.12.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Нафига вам шаблонизатор?! 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>



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


Velichko Anton
**


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

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



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

Потому что люди могут и не знать php, дизайнеры например, как у нас в конторе... дизайнер верстает... но php не знает... и шаблоны делать умеет... для нашего движка


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Vaulter
Дата 18.12.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



SamDark, Хех... вот тебе пример банального шаблона, который ну очень сложно делать каждый раз ручками по твоей схеме:
Код

$navbar
<div class='caption'>Заказы на проверку</div>
<report name='oncheck'>
    <template>
        $paging
        <table class='report'>
                <tr><th>действ.</th><th >№</th><th >тема</th><th>откуда</th></tr>
            $items
        </table>
    </template>    
    <itemtemplate>
    <tr><td><a 
            title='посмотреть заказ' href='orders.php?cnt=orders&act=view&oid=$item[order_id]' 
                onClick='return open_popup_window(this.href,"view")'><img 
            src='img/info.gif' width=12 height=11 border=0 /></a>&nbsp;
        <access res='dopay' mask='ACL_ADD'>
            <a  title='назначить конечную цену' href='orders.php?cnt=popup&act=price&oid=$item[order_id]' $item[dis] 
                onClick='return open_popup_window(this.href,"price",500,250)'><img 
                src='img/price.gif' width=16 height=16 border=0 /></a>
        </access>
        </td>
        <td nowrap>$item[sign]-$item[order_id]</td>
        <td><a href='orders.php?act=edit&cnt=orders&oid=$item[order_id]'>$item[subject]</a></td>
        <td class='smltext'>$item[comment]</td>
    </tr>
    </itemtemplate>
    <emptytemplate>
        <p class='empty'>нет ничего</p>
    </emptytemplate>
</report>


    
<comment>
<form method='get'>
    <input type='hidden' name='cnt' value='$cnt' />
    <input type='hidden' name='act' value='$act' />
    <select name='m' onchange='this.form.submit();'>
        <report name='monthes' onpage='0'>
            <template>$items</template>
            <itemtemplate>
                <option value='$item[0]' $item[selected]>$item[1]</option>
            </itemtemplate>
        </report>
    </select>&nbsp;<select name='y' onchange='this.form.submit();'>
        <report name='years' onpage='0'>
            <template>$items</template>
            <itemtemplate>
                <option value='$item[1]' $item[selected]>$item[1]</option>
            </itemtemplate>
        </report>
    </select>
</form></comment>
<report name='orders' callback='doactions' pagingurl='orders.php?cnt=checkorders&act=list&p=%d' <comment>должно передаватся обьекту pager</comment> pagevar='p'>
    <template>
        <div class='w100'><div class='caption' style='float:left'>Заказы в учет</div>$paging</div>
        
        <table class='report'>
                <comment><tr><th rowspan=2>действ.</th><th rowspan=2>№</th><th width=200 rowspan=2>тема</th><th width=200 colspan=2>цены, руб.</th>
                    <th colspan=2>оплачено</th>
                    <th width=100 colspan=2>сроки</th><th  rowspan=2>статус</th><th rowspan=2>автор</th></tr>
                <tr><th>клиента</th><th>автора</th>
                    <th>клиентом</th><th>автору</th>
                    <th>клиента</th><th>автора</th></tr></comment>
                <thead><tr><th>№</th><th >тема</th><th class='cls'>статус&nbsp;<img alt="<span class='impotant_noemail'>отсутствует email клиента</span><br/>
<span class='impotant_deadline'>срок клиента вышел!</span><br/>
<span class='impotant_plan'>на утверждении плана</span><br/>
<span class='impotant_notpayed'>не оплачено</span>"
                        src='img/answer.gif' width='16' height='16' class='answer'/></th><th>откуда</th></tr>
                </thead>    
            $items
        </table>
    </template>
    <itemtemplate>
    <tr>
        <td nowrap>$item[sign]-$item[order_id]</td>
        <td><a href='orders.php?cnt=checkorders&act=edit&oid=$item[order_id]'
            onClick='return open_popup_window(this.href,"view")'
            >$item[subject]</a></td>
        <comment>
        <td>$item[price]</td>
        <td>$item[work_price]</td>
        <td>$item[payed]</td>
        <td>$item[author_payed]</td>
        <td>$item[df_client_deadline]</td>
        <td>$item[df_author_deadline]</td>
        <td class='smltext'>$item[authorname]</td>
        </comment>
        <td class='smltext $item[class]'>$item[str_status]&nbsp;$item[change_sended]</td>
        <td class='smltext'>$item[comment]</td>
    </tr>
    </itemtemplate>
    <emptytemplate>
        <p class='empty'>нет ничего</p>
    </emptytemplate>
</report>



--------------------
PM MAIL WWW ICQ   Вверх
SamDark
Дата 19.12.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Vaulter,
Ничем не хуже...
Код

<? include('navbar.php') ?>
<? include('comment.php') ?>
<td><?=$item[price]?></td>
<td><?=$item[work_price]?></td>
<td><?=$item[payed]?></td>
<td><?=$item[author_payed]?></td>
<td><?=$item[df_client_deadline]?></td>
<td><?=$item[df_author_deadline]?></td>
<td class='smltext'><?=$item[authorname]?></td>


Ваших шаблонов я не понял в полной мере. Получается верстальщику надо будет изучить штук десять самых популярных шаблонных систем... не проще ли изучить 10 конструкций PHP?

Если объясните, что значит
Код

<report name='oncheck'>
    <template>

может напишу полный эквивалент.


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


Эксперт
***


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

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



нашел статейку

) file2compile.tpl – файл который мы будем парсить
2) template.php – главный файл содержащий класс шаблонов

Листинг файла file2compile.tpl:

Код

<html>
<head>{title}</head>
<body bgcolor={bgcolor}>

{sometpltags}

</body>
</html>


Листинг файла template.php:

Код

<?php
class parse_class
    {
    var $vars     = array();
    var $template;

    function get_tpl($tpl_name)
      {
      if(empty($tpl_name) || !file_exists($tpl_name))
        {
        return false;
        }
      else
        {
        $this->template  = file_get_contents($tpl_name);
        }
      }
    function set_tpl($key,$var)
      {
      $this->vars[$key] = $var;
      }
    function tpl_parse()
      {
      foreach($this->vars as $find => $replace)
             {
             $this->template = str_replace($find, $replace, $this->template);
             }
      }
    }
$parse = new parse_class;
?>




Для вывода на экран используйте следующие команды:

Код

<?php
require('template.php'); // Подключаем файл с классом
$parse->get_tpl('template.tpl'); //Файл который мы будем парсить
$parse->set_tpl('{title}','Супер сайт'); //Установка переменной {title}
$parse->set_tpl('{bgcolor}','#f2f2f2'); //Установка переменной { bgcolor }
$parse->set_tpl('{sometpltags}','<font color=red>Это текст обрамленый красным  цветом</font>'); 
//Установка переменной {sometpltags}
$parse->tpl_parse(); //Парсим
print $parse->template; //Выводим нашу страничку
?> 


тут понятно вместо Супер сайт и прочего вставлю $title и прочую инфу

а если у меня цыкл например вывод фот в виде html таблицы, как с ним быть ? 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 19.12.2006, 15:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Нечего морочаться с шаблонами. PHP - сам по себе шаблонизатор и в использовании пары циклов ничего плохого нет:

Код

<?php foreach($articles as $article){ ?>
<div>
<h1><?=$article['title']?></h1>
<?=$article['text']?>
</div>
<?php } ?>



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


Эксперт
***


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

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



ну это понятно, просто удобнее 1 раз написать а потом пользовать, вставляя в шаблон только определенный код указатель,

Добавлено @ 15:59 
и не совсем удобно когда для разный страниц свой дизайн

конечно есть вариант с footer и heаder но тоже не совсем удобно


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Alex13
Дата 20.12.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SamDark, позволь не согласиться. Такой подход становится неудобным при редактировании шаблонов, при корявой реализации может вылиться в php-including и при изменении структура переменных придется менять все шаблоны.


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
americanets
Дата 20.12.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Alex13, вот вот, а как сделать чтоб все нормально было?



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 20.12.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Согласен полностью, но
Цитата
при корявой реализации

неудобен абсолютно любой подход.

Добавлено @ 09:54 
americanets
Проблема с footer-header решается очень просто: делаем шаблон и в месте, где нужен динамический контент вставляем:
Код

include($content);

Перед запуском шаблона просто определяем $content, который указывает на вложенный шаблон.

p.s. что такое шаблоны я знаю - трёхлетнее общение с Smarty.


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


Опытный
**


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

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



Отдельный шаблонизатор - это для бооольших проектов, типа форумов или CMS, движух там разных, а для небольшого сайта пойдет и стандартная замена в цикле.

Может я в чем не прав но пользую всегда str_replace...
PM MAIL   Вверх
americanets
Дата 20.12.2006, 11:23 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ага вопрос в том как в контент оторый будет в тексте выглядеть {content} впишнуть цикл или еще что то что тоже будет базироваться на собственном шаблоне, например html таблица


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 20.12.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



americanets
Код

<table>
  <?php foreach($articles as $article){ ?>
  <tr>
     <td>
        <?=$article['title']?>
     </td>
     <td>
        <?=$article['text']?>
     </td>
  </tr>
  <?php } ?>
</table>



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


Эксперт
***


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

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



а как мне сделать для него шаблон например

Код

<table>
   <tr>
     <td>
        {art_title}</td>
     <td>
     {art_text}
     </td>
  </tr>
</table>


выложить его как art.tmp потом подгрузить обработать и чтоб он сам не прописывался в шаблоне а вставлялся в {content} отделить дизайн шаблона от кода
нужно чтоб оснавной шаблон был просто что то вроде этого 
____________________________________________
|
|                               {title}
|___________________________________________
|                           {content}                              |{news}  
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
------------------------------------------------------------------------

для таблицы тоже шаблон но без кода
код только в php файлах обрабатывающих шаблон и на основе него отдающий в основной инфу


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 20.12.2006, 13:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



americanets
Цитата
код только в php файлах обрабатывающих шаблон и на основе него отдающий в основной инфу

Нет смысла, но если уж очень хочется - Smarty.

То же на PHP:

Главный шаблон main.tpl:
Код

<html>
  <head>
    <title><?=$title?></title>
  </head>
<body>
  <h1 id="top"><?=$title?></h1>
  <div id="content"><?php include($content)?></div>
  <div id="right"><?php include($right)?></div>
</body>


Новости news.tpl:
Код

<?php foreach($news as $item){?>
<dl>
  <dt><?=$item['title']?>
  <dd><?=$item['text']?>
</dl>
<?php } ?>


Статья art.tpl:
Код

<table>
   <tr>
     <td>
        <?=$art['title']?></td>
     <td>
        <?=$art['text']?>
     </td>
  </tr>
</table>


Скрипт index.php:
Код

$title = 'Моя тестовая статья';
//Получаем данные для статьи
$art = Article::get();
$content = 'art.tpl';
//Получаем данные для новостей
$news = News::get();
$right = 'news.tpl';

//Запускаем
include('main.tpl');



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


Эксперт
***


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

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



ясно буду разбираться, может что выйдет


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Rock
Дата 20.12.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



по моему лучше xslt нет ничего, но это имхо. 
PM MAIL ICQ   Вверх
americanets
Дата 21.12.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот, налабал начало шаблонизатора, естественно единичные данные выводит, также естественно динамичные данные мне нужно будет впихнуть в CONTENT, вопрос как это можно сделать? 
Код

<?
$f = fopen("1","r");
$PAGE_CONTENT="контент";
$PAGE_TITLES="титлес";
$CONTENT = @fread($f,filesize("1"));
fclose($f);
$CONTENT = preg_replace("/CONTENT/", $PAGE_CONTENT, $CONTENT);
$CONTENT = preg_replace("/TITLES/", $PAGE_TITLES, $CONTENT);
echo $CONTENT;
?>



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
americanets
Дата 22.12.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

Код

<a href="LINKS_TO_PAGE">TITLE_LINKS</a><br>
TEXT_KRATKO<br>
<a href="LINKS_TO_PAGE">подробно</a><br>
<hr>
либо таблица

Код


<table>
   <tr>
     <td>
        NAZVANIE
</td>
     <td>
    <img srk="FOTO">
     </td>
     <td>
      OPISANIE
     </td>
  </tr>
</table>


Добавлено @ 09:29 
как их обработать и всключить в цикл вобщем размножить, делить на страницы и т д 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 22.12.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



americanets
Так чем не устраивают приведённые мной выше примеры?


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


Эксперт
***


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

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



по моему не полностью разделяют код от дизайна , а нужно допустим чтоб шаблон был 

Код

<a href="LINKS_TO_PAGE">TITLE_LINKS</a><br>
TEXT_KRATKO<br>
<a href="LINKS_TO_PAGE">подробно</a><br>
<hr>


а на выходе после цикла в страницу инклюдилось 

Код

<a href="***.htm">Название</a><br>
бла бла бла<br>
<a href="LINKS_TO_PAGE">подробно</a><br>
<hr>
<a href="***.htm">Название</a><br>
бла бла бла<br>
<a href="LINKS_TO_PAGE">подробно</a><br>
<hr>
<a href="***.htm">Название</a><br>
бла бла бла<br>
<a href="LINKS_TO_PAGE">подробно</a><br>
<hr>..............


с таблицами  тоже самое или 


в шаблоне 

Код

<table>
   <tr>
     <td>
        NAZVANIE
</td>
     <td>
    <img srk="FOTO">
     </td>
     <td>
      OPISANIE
     </td>
  </tr>
</table>


а на выходе 

Код

<table>
   <tr>
     <td>
        Название *******
</td>
     <td>
    <img srk="img**.gif">
     </td>
     <td>
      Описание ***********
     </td>

<tr>
     <td>
        Название *******
</td>
     <td>
    <img srk="img**.gif">
     </td>
     <td>
      Описание ***********
     </td>


<tr>
     <td>
        Название *******
</td>
     <td>
    <img srk="img**.gif">
     </td>
     <td>
      Описание ***********
     </td>

<tr>
     <td>
        Название *******
</td>
     <td>
    <img srk="img**.gif">
     </td>
     <td>
      Описание ***********
     </td>
  </tr>
</table>





--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Eugene_Bond
Дата 22.12.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вариант простого, но хорошего шаблонизатора с ведомым контроллером: XTemplate

Поддерживает инклюды, блоки и переменные. Большего от шаблонизатора с ведомым контроллером и не требуется. Проект практически не обновляется, потому что практически все, что нужно в нем уже есть. Последнее обновление было в 2005 году. Если не ошибаюсь добавили нативное кеширование средствами шаблонизатора.
До этого он не обновлялся с 2003 -- кеширование дописывалось ручками.

Полностью отделяет логику от дизайна. Сам долго пользовался именно этим шаблонизатором. Понятен для дизайнеров. Пример шаблона (для описанной выше задачи):

Код

<!-- BEGIN: news -->
<table>
<!-- BEGIN: one -->
   <tr>
     <td>
        {ITEM.name}
     </td>
     <td>
     <img src="{ITEM.image}">
     </td>
     <td>
      {ITEM.description}
     </td>
</tr>
<!-- END: one -->
</table>
<!-- END: news -->


Пример выводящего кода:
Код

   $xtpl = new XTemplate(.....); // инициализация с нужными параметрами
   ... // получаем новости из базы
   ... // и складываем в массив $news
   ... // используя любой удобный для себя способ
   foreach ($news as $n) {
       $xtpl->assing('ITEM', $n);   // устанавливаем переменную
       $xtpl->parse('news.one');  // и парсим блок одной новости
   }
   $xtpl->parse('news');             // парсим блок всех новостей
   $xtpl->out('news');                 // и выводим его


Код писал по-памяти. Мог где-то немного с методами напутать, но идея именно такая.
PM MAIL   Вверх
americanets
Дата 22.12.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ясно, все же хочется свое , чтоб все понятно было, а то не могу со сторонними шаблонизаторами работать smile

Добавлено @ 12:23 
вобщем как придумаю выложу, может кто раньше подскажет 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 22.12.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



americanets
Цитата
по моему не полностью разделяют код от дизайна

А шаблонизатор полностью? Ничуть!

Eugene_Bond
Дизайнеру (точнее верстальщику) понятно то, к чему он привык. Нет никакой разницы, шаблонные ли это тэги или же пара конструкций PHP.

p.s. извиняюсь, но не сдержался:
Цитата

Код

 $xtpl->assing('ITEM', $n);   // устанавливаем переменную


 smile 


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


Шустрый
*


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

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



Цитата(SamDark @  22.12.2006,  14:36 Найти цитируемый пост)
Дизайнеру (точнее верстальщику) понятно то, к чему он привык.

Они, к сожалению, разные бывают.
Для некоторых и такое сложно.. А для некоторых не важно смарти это или XSLT -- работают со всем.
Но конструкции PHP ИМХО не кошерно использовать


Цитата(SamDark @  22.12.2006,  14:36 Найти цитируемый пост)
p.s. извиняюсь, но не сдержался:

извиняюсь, но не понял прикола
PM MAIL   Вверх
americanets
Дата 22.12.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



и все же есть ряд систем использующих свою систему шаблонов и позволяющих полностью избежать кода в дизайне например кмс мастер


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
americanets
Дата 23.12.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



сдклал так, но неработает

Код

$f = fopen("1","r");
$PAGE_CONTENT="контент";
$PAGE_TITLES="титлес";
$CONTENT = @fread($f,filesize("1"));
fclose($f);
$vstavka=ShowAll ();
$CONTENT = preg_replace("/CONTENT/", $vstavka, $CONTENT);
$CONTENT = preg_replace("/TITLES/", $PAGE_TITLES, $CONTENT);
echo $CONTENT;

function ShowAll () {
$query="SELECT * from `cms_pages`  where `content`  LIKE '%$poisk%'"; 
$query = mysql_query($query) or die (mysql_error()); 

WHILE ($dat=mysql_fetch_array($query))  { 
    print "<li>".$dat['id']."&nbsp;&nbsp;&nbsp;URL: <strong>".$dat['menu_neme']."</strong><br>\n"; 

}



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
americanets
Дата 23.12.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



еще попробвал 
Код

$CONTENT = preg_replace("/CONTENT/", foo(), $CONTENT);


Код

function foo(){
$query="SELECT * from `cms_pages`  where `content`  LIKE '%$poisk%'"; 
$query = mysql_query($query) or die (mysql_error()); 
WHILE ($dat=mysql_fetch_array($query))  { 
$HTMLData= "<li>".$dat['id']."&nbsp;&nbsp;&nbsp;URL: <strong>".$dat['menu_neme']."</strong><br>\n"; 
return $HTMLData;
}

}


но выводит только первое , зато там где надо, как сделать чтоб все выводилось? 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 25.12.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Eugene_Bond
Цитата

Но конструкции PHP ИМХО не кошерно использовать

То же можно сказать и про шаблоны. Всё это - дело вкуса с тем лишь отличием, что шаблонизатор надо ещё написать, придумать свою разметку, обучить верстальшика. Да и нагрузка на сервер дополнительная при парсинге шаблона...


americanets
Код

function foo(){
$query="SELECT * from `cms_pages`  where `content`  LIKE '%$poisk%'"; 
$query = mysql_query($query) or die (mysql_error()); 
WHILE ($dat=mysql_fetch_array($query))  { 
$HTMLData.= "<li>".$dat['id']."&nbsp;&nbsp;&nbsp;URL: <strong>".$dat['menu_neme']."</strong><br>\n"; 

}
return $HTMLData;
}



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


Эксперт
***


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

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



Спасибо, а нагрузка при таком решении сильно увеличивается ? 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 25.12.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



americanets
Не очень, но всё зависит от количества данных.

p.s. см. ob_start() и остальные ob_*().
p.p.s. не лучше ли всё-таки разделить получение и отображение данных как несколькими постами ранее?


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


Эксперт
***


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

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



Цитата(SamDark @  25.12.2006,  13:27 Найти цитируемый пост)
p.p.s. не лучше ли всё-таки разделить получение и отображение данных как несколькими постами ранее? 

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


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Eugene_Bond
Дата 25.12.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(SamDark @  25.12.2006,  12:29 Найти цитируемый пост)
Всё это - дело вкуса

Это дело подхода.
Если у меня набор модулей, которые используются в разных проектах одновременно, то генерировать модулем html я не буду -- для этого мне прийдется копировать каждый модуль и переписывать его в зависимости от дизайна сайта.
PM MAIL   Вверх
americanets
Дата 25.12.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да, шаблоны нужная штука : )


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 25.12.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Eugene_Bond
americanets
См. опять же тот же самый пост.

Получение данных от их вывода не зависит.


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


Шустрый
*


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

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



SamDark
опять таки, применимо только для движков с линейными контроллерами

хотя, на вкус и цвет..
PM MAIL   Вверх
americanets
Дата 26.12.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



вобщем пользовать можно все, кому что нравится, главное чтоб было тому кто делает, кто управляет вобщем всем smile 
Каждому по потребностям и по возможностям


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 26.12.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Eugene_Bond
Что подразумевается под линейными контроллерами?

americanets,
Тут ты прав.


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


Шустрый
*


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

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



SamDark

подразумевается, что код сайта выглядит примерно следующим образом:

article.php
Код

<?php

$title = 'Моя тестовая статья';
//Получаем данные для статьи
$art = Article::get();
$content = 'art.tpl';
//Получаем данные для новостей
$news = News::get();
$right = 'news.tpl';
//Запускаем
include('main.tpl');

?>


news.php
Код

<?php

$title = 'Мои новости';
//Получаем данные для новостей
$news = News::get();
$content = 'news.tpl';
//Запускаем
include('main.tpl');

?>


something.php
Код

<?php

$title = 'Мое что-то еще';
//Получаем данные для чего-то еще
$something = Something::get();
$content = 'something.tpl';

//Получаем данные для новостей
$news = News::get();
$right = 'news.tpl';
//Запускаем
include('main.tpl');

?>


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


В любом случае переводить тему в холи варс смысла не вижу. Задачи бывают разные. Видимо есть и такие, которые можно решить и инклюдами.
PM MAIL   Вверх
SamDark
Дата 26.12.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Eugene_Bond
Ну, какой-то у вас совсем пример тривиальный (как в принципе и у меня).
А вообще любой шаблонизатор работает точно по такому принципу:

1. Получение данных, передача их шаблонизатору.
2. Отображение.

И чем замена некоторого текста на что-то ещё лучше include() не понимаю. Конечно под include() стоит понимать переписанную функцию, возможно принимающую некоторые параметры, проверяющую авторизацию и т.д.

p.s. холи варс начинать даже не думал. Сам крепко подсел на Smarty из за удобства...


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


Эксперт
***


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

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



SamDark
Цитата

p.s. холи варс начинать даже не думал. Сам крепко подсел на Smarty из за удобства...

То ты против шаблонизаторов, то за.. ))


Всем
Юзайте смарти и хватит уже задумываться о роизодительности и остальном, мы не в каменном веше живем... В крайнем случае оптемезировать вручную смарти можно, выкинув не нужное....



PM MAIL   Вверх
awers
Дата 5.1.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Думаю работа шаблона должна заключаться не более чем в этом:
Код

include('style.css');
include('script.js');
<? show('header'); ?>
<? show('content'); ?> ...



Используя тот же "смарти" я понял что уж лучше деревянно чем монстерски огромно.
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 5.1.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(awers @  5.1.2007,  18:18 Найти цитируемый пост)
Думаю работа шаблона должна заключаться не более чем в этом:

Как минимум глупость, как максимум бред. Подключать css, js через инклюд это вообще без комментариев.
PM ICQ   Вверх
Gold Dragon
Дата 6.1.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



я ползуюсь следующем (упростил для восприятия smile )

есть файл шаблонов
Код

function sMainSkin($info){
return <<<EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>{$info['title']}</title>
</head>
<body>
<div>
<table cellspacing="0" cellpadding="0" border="0" width="100%">
    <tr>
        <td>{$info['image1']}</td>
     <td>{$info['image2']}</td>
    </tr>
</table>

<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
    <td>{$info['left']}</td>
    <td>{$info['content']}</td>
    <td>{$info['right']}</td>
</tr>
</table>

<p align='center'>{$info['copyright']}</p>
</div>
</body>
</html>
EOF;
}

function sNews($info){
    return <<<EOF
    <!-- здесь HTML-форма для выводе новостей -->
EOF;
}

function sStat($info){
    return <<<EOF
    <!-- здесь HTML-форма Статьи -->
EOF;
}


а тут всё это формируется и выводится
Код

// здесь создаётся основная страница типа
switch ($page) {
    case 'Stat': // статьи
        $info = fStat_();
        break;
    case 'News': // новости
        $info = fNews();
        break;
    default: // главная
        $info = fIndex();
}

echo sMainSkin($info);

// основные функции вывода страниц
function fIndex(){
    // что-то делается и возвращается
    // $info['title']
    // $info['image1']
    // $info['image2']
    // $info['left'] 
    // $info['content'] 
    // $info['right'] 
    // $info['copyright'] 
    return $info;
}

function fNews(){
    // что-то делается и возвращается
    // $info['title']
    // $info['image1']
    // $info['image2']
    // $info['left'] 
    // $info['content'] 
    // $info['right'] 
    // $info['copyright'] 
    return $info;
}
function fStat_(){
    // что-то делается и возвращается
    // $info['title']
    // $info['image1']
    // $info['image2']
    // $info['left'] 
    // $info['content'] 
    // $info['right'] 
    // $info['copyright'] 
    return $info;
}


это моё мнение, но куда проще и понятнее smile



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


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


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

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



В общем, какие использовать шаблоны - не важно. Главное, чтобы разработчику было комфортно, но использовать их настоятельно рекомендую, иначе о повторном использовании кода не может идти речи.

Для себя сделал вывод, что одному вполне можно писать Native-шаблоны (те, что встроены в PHP), а вот в команде уже проще пользоваться Smarty или другой системой.

Для менее опытных программистов (или что ещё критичнее верстальщиков) шаблоны PHP могут оказаться слишком мощными, из за чего возможно появление ошибок и нарушение концепции MVC.

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


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


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


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

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



что-то настолько привык уже писать шаблоны, что даже для сайтиков из 5-6 страничек это по привычке делаю..

А вообще, по моему, самое главное это разделять PHP и HTML ^)


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


Новичок



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

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



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

Вот требования к парсеру шаблонов, озвученные в этом топике:

Цитата

Обязательно должна быть поддержка циклических и условных операций ... 
Все это есть в php

Цитата

Очень полезная вещь - это возможность получить вывод шаблона в переменную (без вывода на экран) (аналог fetch в Smarty).
http://php.net/manual/ru/ref.outcontrol.php

Цитата

Возможность подключения текстовых/РНР файлов в шаблон.
Зачем? include()

Цитата

Некие утилиты для составления select'ов и прочих мелочей используемых в формах.
Есть море готовых php классов для этих целей.

Цитата

...по моему не полностью разделяют код от дизайна
Разделить код от дизайна полностью невозможно в принципе.

Цитата

Но конструкции PHP ИМХО не кошерно использовать
Eugene_Bond, почему? Хотелось бы услышать хоть один аргумент.

Цитата

люди могут и не знать php, дизайнеры например, как у нас в конторе... дизайнер верстает... но php не знает... и шаблоны делать умеет... для нашего движка 
А что его знать? Во-первых, дизайнер может получить готовые голые шаблоны с реализацией, при этом блоки кода ему не нужно править вообще.
Во-вторых, изучить несколько функций foreach(), if(), print() проще и целесообразней, чем забивать себе голову синтаксисом, который через 5 лет никому нужен не будет.

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

Цитата

так вот. для каждой функции вывода блока должна быть маленькая функция возвращающая время последнего изменения блока (для новостей, дата последней новости, для пользователя например дата последнего привата или даже 0 для стат. блоков!)
Проверка даты изменения каждого блока может занять больше времени, чем просто вывод этих данных из бд.

Цитата

Для менее опытных программистов (или что ещё критичнее верстальщиков) шаблоны PHP могут оказаться слишком мощными, из за чего возможно появление ошибок и нарушение концепции MVC.
Smarty - настолько мощная система, что позволяет запросто разрушить MVC и наделать кучу ошибок.

Пока я не вижу ни одной причины, по которой было бы целесообразно усложнять средства разработки.
PM MAIL WWW ICQ   Вверх
SamDark
Дата 12.1.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Powerhead
Как уже говорилось: 
Цитата
шаблоны PHP могут оказаться слишком мощными

Когда пишешь в одиночку - всё отлично. Никакие шаблоны не нужны.
Если пишет команда, как правило, есть пара опытных программистов и остальные - менее опытные.
Более опытные занимаются обычно разработкой архитектуры, интерфейсов и т.д. Менее опытные часто занимаются частью, отвечающей за представление. Иногда им чего-то нехватает и они начинают писать код, который модифицирует данные модели (не форматирует, а именно модифицирует).

Шаблоны же не позволяют таких вольностей.

Да, Smarty - уже не совсем шаблонная система, в синтаксисе шаблонов которой тоже можно понаделать ошибок, но она как раз не допустит разрушение концепции MVC, что важно.

Цитата
азделить код от дизайна полностью невозможно в принципе.

Согласен. Поэтому надо ставить другую задачу: "Разделить модель от её представления максимально удобным и безопасным способом".

P.s. кэширование организовать на чистом  php не так уж сложно с помощью упомянутых вами ob_*()


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


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


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

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



Цитата(Powerhead @  12.1.2007,  14:50 Найти цитируемый пост)
по моему не полностью разделяют код от дизайна

Цитата(Powerhead @  12.1.2007,  14:50 Найти цитируемый пост)
люди могут и не знать php, дизайнеры например, как у нас в конторе... дизайнер верстает... но php не знает... и шаблоны делать умеет... для нашего движка 

Вот я вывожу типа новостной ленты. Т.е. Есть функция которая где-то по каким-то запроса достаёт данные. Страница состоит из нескольких одинаковых блоков. Вот пример
Код

function sСomment($info){
    return <<<EOF
        <tr>
            <td>Cообщение: {$info['id']}<br>от{$info['user_data']}<br>{$info['bal']} </td>
            <td>{$info['user_com']}<br>({$info['user_nik']}) </td>
        </tr>
        <tr>
                     <td>Комментарий владельца:<br>от {$info['adm_data']} </td>
                     <td>{$info['adm_com']}<br>({$info['adm_nik']})</td>
        </tr>
        <tr>
                     <td><img src="images/1x1_c.gif" width="100%" height="1" border="0"></td>
        </tr>
EOF;
}

А теперь если мне надоела форма вывода, то я просто меняю шаблон и не задумываюсь над тем как работает сам скрипт. И второе, есть люди, которые нефига не понимают в PHP (да им это и не нужно), но которые отвечают за сам дизайн сайта. Вот и получается, что один специалист в PHP, другой HTML+CSS. PHP тут только сама функция, всё остальное чистый HTML

Цитата(Powerhead @  12.1.2007,  14:50 Найти цитируемый пост)
Во-вторых, изучить несколько функций foreach(), if(), print() проще и целесообразней, чем забивать себе голову синтаксисом, который через 5 лет никому нужен не будет.

это полная ерунда! Что значит изучить несколько функций? А остальное? Вот если я из английского знаю только "Май нэйм из Ваня",  то я не думаю что способен разговаривать с англичанами!

Цитата(Powerhead @  12.1.2007,  14:50 Найти цитируемый пост)
Пока я не вижу ни одной причины, по которой было бы целесообразно усложнять средства разработки.

а такой встречный вопрос... ты возвращался к своим старым проектам? Даже если всё комментировать намного сложнее менять дизайн если он не отделён от кода.



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


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


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

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



Gold Dragon
В твоём подходе есть минус - верстальщику не видно кода всей страницы. Да, для программиста так удобней.
Но вот открывать кучу тэгов в function head() и закрывать в function foot() не очень удобно...


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


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


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

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



Согласен, только это просто шаблон повторяющейся части, а целая страница есть конечно smile

И в любом случае лучше так, чем мешать с PHP


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


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


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

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



Gold Dragon
Цитата
 <td>Cообщение: {$info['id']}<br>от{$info['user_data']}<br>{$info['bal']} </td>

Вылитый синтаксис Smarty ;)


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


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


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

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



SamDark, ну может и так smile зато ничего придумывать и парсить не нужно.

по моему и IPB так написан...


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


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


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

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



Gold Dragon
Да, IPB написан именно так.


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


Эксперт
***


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

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



Проблемка с динамичным созданием шаблона выводит ерунду, то что нужно + код шаблона влезает  

Код

<?php
function LastNews() { 
$sql = "SELECT * FROM `news_config`";
    $result=mysql_query($sql);
    $dat=mysql_fetch_array($result);
    $titles=$dat[sitename];
    $news_kratko=$dat[news_kratko];
    $templates=$dat[templates];
$query="SELECT * from news ORDER BY 'id' DESC LIMIT 0,$news_kratko";
$query = mysql_query($query) or die (mysql_error());
WHILE ($dat=mysql_fetch_array($query))
     {
    $templater= file_get_contents('templates/news/last');
    $HTMLData .= preg_replace('/NEWS/', $dat[nazvanie],$templater);
    $HTMLData .= preg_replace('/KRATKO/',$dat[kratko],$templater);
    
    /* если вывожу так то все путем
    $HTMLData .= "<a href=\"/news/".$dat[id]."/\"><strong><font style=\"BACKGROUND-COLOR: #E05617\" color=\"#ffffff\"> &nbsp; ".$dat[den]." / ".$dat[mecyac]." / ".$dat[god]."  </font><font style=\"BACKGROUND-COLOR: #D7D7D7\" color=\"#000000\">&nbsp;&nbsp;".$dat[nazvanie]."</font></strong></a><br><font color=#666666>".$dat[kratko]."....&nbsp;&nbsp;</font><br><br>\n";*/
    
    }        
    return $HTMLData;        
        }
$TEMP_BLOCKS["LAST-NEWS"] = LastNews();
?>



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SamDark
Дата 25.1.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



americanets
Это как раз не шаблон, а антишаблон. Весь смысл шаблона - не мешать его с кодом.


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


Эксперт
***


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

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



ну вот как раз в шаблоне у меня написано 
NEWS <br>
KRATKO

должно туда все вставиться , а на выходе получается смешение информации в шаблоне и нужной информации

Добавлено @ 14:10 
а вот как сделать чтоб выводилось нормально ума не приложу хотя если делаю в коде

Код

$HTMLData .= "<a href=\"/news/".$dat[id]."/\"><strong><font style=\"BACKGROUND-COLOR: #E05617\" color=\"#ffffff\"> &nbsp; ".$dat[den]." / ".$dat[mecyac]." / ".$dat[god]."  </font><font style=\"BACKGROUND-COLOR: #D7D7D7\" color=\"#000000\">&nbsp;&nbsp;".$dat[nazvanie]."</font></strong></a><br><font color=#666666>".$dat[kratko]."....&nbsp;&nbsp;</font><br><br>\n";


то все пучком а разелить пока не получается


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
IZ@TOP
Дата 2.2.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Может кто-то и высказывался за PHP Plain, но я еще раз скажу: нафиг смарти когда он в точности повторяет PHP код? Неужели проще написать {{$var}} вместо <?=$var?>, {{if $var == 1}}...{{/if}} вместо <?if($var == 1)?>...<?}?>?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Gold Dragon
Дата 5.2.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



может и не проще, но истетичнее smile

на мой взгляд, например, это
Код

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

 хуже читается чем это
Код

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



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


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


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

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



Gold Dragon
Можно немного покороче:
Код

<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>



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


Опытный
**


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

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



Цитата
CyClon, "без компиляции нерационально" - это заблуждение.
Миллионы РНР скриптов рабтают без компиляции и кеширования. И прекрасно работают.
Как я уже не раз говорил, работа с шаблоном - далеко не "бутылочное горлышко" веб-приложения. Конечно, самопальные шаблонизаторы на регулярках отстают по скорости от модулей на С и шаблонов на РНР, но не настолько, чтобы в первую голову заботиться об их производительности.
Так что, вполне можно пользоваться и этим "каркасом" =)


Нерациональность в данном случае - это то, что шаблонизатор будет пожирать больше всех ресурсов, чем остальные модули сайта. Там используются регурарыные выражения, которые сами по себе прожорливы, к тому же их много. Особенно в сложных шаблонах. Да и тот же кэш или компилятор написать труда не составит smile Для меня сложнее все продумать так, чтобы потом не было гемора при дальнейшей разработки, в связи с этим и задался поиском книги по ООА smile


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


Опытный
**


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

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



ну-ну. в шаблоне у нас уже откуда-то взялись регулярные выражения. и он пожрал все ресурсы. 
просто фильм ужасов.

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

Это сообщение отредактировал(а) GeneralElectric - 23.2.2008, 17:36
PM MAIL   Вверх
CyClon
Дата 24.2.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Имелось ввиду что в шаблонизаторе используются регулярные выражения и в сложных шаблонах слишком часто происходит их вызов (много блоков / переменных и т.п.). Так ясно?


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


Опытный
**


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

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



Немного переписал, сделал, чтоли, "более абстрактным" xD Тем, кто искал простейший шаблонизатор, ловите...

Шаблон (templates/lite/main.html)
Код
<?xml version="1.0" encoding="utf-8"?>
<!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="en-US" lang="en-US">
  <head>
    <title>{TITLE}</title>
  </head>
  <body>
    <h1>{WELCOME}</h1>
    <ul>
      <!-- BEGIN blocks-left -->
      <li>{BLOCK:NAME} - {BLOCK:VALUE}</li>
      <!-- END blocks-left -->
    </ul>
    <br />
    <br />
    {MAIN}
    <br />
    <br />
    <!-- BEGIN blocks-foot -->< <b>{BLOCK:VALUE}</b> ><!-- END blocks-foot -->
  </body>
</html>


Шаблонизатор (kernel/classes/Template.class.php)
Код
<?php

class Template
{
    private $template;
    private $variables;
    private $blocks;

    public function __construct($template)
    {
        if (file_exists($template)) {
            $this->template = file_get_contents($template);
        } else {
            $this->template = '';
            trigger_error('Not found: ' . $template);
        }
    }

    public function assign($data, $blocks = null)
    {
        if ($blocks == null) {
            foreach ($data as $name => $value) {
                $this->variables[$name] = $value;
            }
        } else {
            foreach ($data as $name => $value) {
                $this->blocks[$blocks][$name] = $value;
            }
        }
    }

    public function display()
    {
        $this->parse();
        print $this->template;
    }

    private function parse()
    {
        $this->template = preg_replace('~<!-- BEGIN (.+) -->(.+)<!-- END (.+) -->~esU', '$this->parseBlocks(\'\\1\', \'\\2\', \'\\0\')', $this->template);
        foreach ($this->variables as $key => $value) {
            $this->template = str_replace('{' . $key . '}', $value, $this->template);
        }
    }

    private function parseBlocks($blocks, $template, $pattern)
    {
        if (isset($this->blocks[$blocks])) {
            $result = '';
            foreach ($this->blocks[$blocks] as $name => $value) {
                $result .= str_replace(array('{BLOCK:NAME}', '{BLOCK:VALUE}'), array($name, $value), rtrim($template));
            }
            return ltrim($result);
        } else {
            return $pattern;
        }
    }
}


Использование (index.php)
Код
<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

require_once 'kernel/kernel.php';

if (isset($_GET['do']) && file_exists('modules/' . $_GET['do'] . '/main.php')) {
    include 'modules/' . $_GET['do'] . '/main.php';
} else {
    include 'modules/' . CONFIG_DEFAULT_MODULE . '/main.php';
}

$variables = array('TITLE' => 'SH-Framework',
                   'WELCOME' => 'Welcome to party! :)',
                   'MAIN' => main(),
                   );

$blocks_left = array('Block 1' => 'Content 1',
                     'Block 2' => 'Content 2',
                     'Block 3' => 'Content 3',
                     );

$blocks_foot = array('Content 1', 'Content 2', 'Content 3');

$tpl = new Template('templates/lite/main.html');
$tpl->assign($variables);
$tpl->assign($blocks_left, 'blocks-left');
$tpl->assign($blocks_foot, 'blocks-foot');
$tpl->display();


Результат
Код
<?xml version="1.0" encoding="utf-8"?>
<!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="en-US" lang="en-US">
  <head>
    <title>SH-Framework</title>
  </head>
  <body>
    <h1>Welcome to party! :)</h1>
    <ul>
      <li>Block 1 - Content 1</li>
      <li>Block 2 - Content 2</li>
      <li>Block 3 - Content 3</li>
    </ul>
    <br />
    <br />
    This is /var/www/localhost/htdocs/cms/modules/news/main.php
    <br />
    <br />
    < <b>Content 1</b> >< <b>Content 2</b> >< <b>Content 3</b> >
  </body>
</html>



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


Эксперт
***


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

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



ну чем же вам XML/XSL не угодили то? ведь все проще чем вы тут расписываете. могу дать код шаблонного движка который делал сравнительно недавно. Тут и блоки данных и динамическая подгрузка частей шаблонов. Тестовая версия..

modules/mod_templates.php

Код

<?php

/**
 * Модуль для работы с XSLT шаблонами
 *
 * @author awers
 * @package awFrameWork
 */

/**
 * Основной класс
 *
 */
class mod_templates{
    /**
     * Экземпляр класса DOMDocument
     *
     * @var DOMDocument
     */
    private $dom;
    /**
     * Корневой элемент (root)
     *
     * @var DOMElement
     */
    private $document;
    /**
     * Массив коллекций
     *
     * @var array
     */
    private $collections;
    /**
     * XSLT процессор
     *
     * @var XSLTProcessor
     */
    private $xslt;
    /**
     * Зарезервированные коллекции
     *
     * @var array
     */
    public $reserver_collections = array('main','config');
    /**
     * Массив подгружаемых шаблонов
     *
     * @var array
     */
    private $templates = array();
    private $styles = array();
    
    /**
     * Функция создания класса
     *
     */
    public function __construct($encoding = 'UTF-8'){
        $this->dom = new DOMDocument('1.0',$encoding);
        $this->document = $this->dom->createElement('root');
        $this->xslt = new XSLTProcessor();
        foreach ($this->reserver_collections as $collection){
            $this->createCollection($collection);
        }
    }
    
    /**
     * Функция создания новой коллекции
     *
     * @param string $name
     * @param mixed $template
     */
    public function createCollection($name,$template = false, $style = false){
        if ($template === true){
            // выбираем шаблон из директории элементов
            $this->templates[] = dir_tpl_elements.$name.'.xslt';
        }elseif ($template == true){
            // указанный шаблон
            $this->templates[] = $template;
        }
        
        if ($style === true){
            // выбираем шаблон из директории элементов
            $this->styles[] = dir_css_elements.$name.'.css';
        }elseif ($style == true){
            // указанный шаблон
            $this->styles[] = $style;
        }
        $this->collections[$name] = new mod_templates_collection($name,$this->dom,$this->document);
        // Создает алиас коллекции вида cl_коллекция и возвращает ссылку на нее
        return $this->{'cl_'.$name} = $this->collections[$name];
    }
    
    /**
     * Отчистить коллекцию
     *
     * @param string $name
     */
    public function clearCollection($name){
        $this->collections[$name] = new mod_templates_collection($name,$this->dom,$this->document);
    }
    
    /**
     * Удалить коллекцию
     *
     * @param string $name
     */
    public function deleteCollection($name){
        // удаляем из массива
        unset($this->collections[$name]);
        // удаляем алиас
        unset($this->{'cl_'.$name});
    }
    
    /**
     * Функция производит XML/XSLT трансформацию, подключение
     * дополнительных шаблонов
     *
     * @param string $template
     */
    public function release($template){
        /* получаем данные из коллекций */
        foreach ($this->collections as $collection){
            $collection->release();
        }
        // добавляем в основное дерево
        $this->dom->appendChild($this->document);
        
        // проверяем наличие выбранного шаблона
        if (!file_exists($template)) die('Не найден основной шаблон '.$template);
        // выбираем данные из файла
        $xslt_data = file_get_contents($template);

        $xslt = new DOMDocument();
        
        if (!@$xslt->loadXML($xslt_data)){
            die('Ошибка при загрузке шаблона');
        }
        /* Новая работа с шаблонами */
        $xpath = new DOMXPath($xslt);
        $stylesheet = $xpath->query('//xsl:stylesheet')->item(0);
        
        foreach ($this->templates as $tpl){
            if (!file_exists($tpl)) die ('Не найден шаблон '.$tpl);
            $include = $xslt->createElementNS('http://www.w3.org/1999/XSL/Transform','xsl:include');
            $includeEl = $stylesheet->insertBefore($include,$stylesheet->childNodes->item(0));
            $includeEl->setAttribute('href',$tpl);
        }
        
        $styles = null;
        foreach ($this->styles as $css){
            $styles .= "@import url($css); \n";
        }
        /* (NEW!) Работа со стилями css */
        $head = $xpath->query('//xsl:stylesheet/xsl:template/html/head')->item(0);
        $incCss = $xslt->createElement('style');
        $incCssData = $xslt->createCDATASection("\n<!-- \n$styles -->\n");
        $incCss->appendChild($incCssData);
        $head->appendChild($incCss);
                
        if (!$this->xslt->importStylesheet($xslt)){
            die('Ошибка при импортировании шаблона');
        }
        if (!$data = $this->xslt->transformToXml($this->dom)){
            die('Ошибка при трансформации');
        }else{
            // вывод данных
            echo $data;
        }
            
    }
}

/**
 * Вспомогательный класс, описывающий коллекцию данных
 * и работу с ними
 *
 */
class mod_templates_collection{
    /**
     * Экземпляр класса DOMDocument
     *
     * @var DOMDocument
     */
    private $dom;
    /**
     * Корневой элемент (root)
     *
     * @var DOMElement
     */
    private $document;
    /**
     * Родительский элемент
     *
     * @var DOMElement
     */
    public $owner;
    
    /**
     * Имя коллекции
     *
     * @var string
     */
    public $name;
    
    /**
     * Функция создания коллекции
     *
     * @param string $name
     * @param DOMDocument $dom
     * @param DOMNode $owner
     */
    function __construct($name,DOMDocument $dom,DOMNode $owner){
        $this->name = $name;
        $this->dom = $dom;
        $this->owner = $owner;
        // создаем корневой элемент коллекции
        $this->document = $dom->createElement($name);
    }
    
    /**
     * Закончить работу с коллекцией и вернуть результат работы
     *
     */
    function release(){
        $this->owner->appendChild($this->document);
    }
    
    /**
     * Функция создает новый узел
     *
     * @param string $name
     * @param string $value
     */
    function createNode($name,$value){
        $node = $this->dom->createElement($name);
        // все данные записываем в CDATA
        $value = $this->dom->createCDATASection($value);
        $node->appendChild($value);
        // добавляем узел к документу
        $this->document->appendChild($node);
    }
    
    /**
     * Добавить массив к коллекции
     *
     * @param string $name
     * @param array $array
     * @param DOMElement $rootNode
     * @param boolean $return
     * @return DOMElement
     */
    public function append_array($name,$array,$rootNode = false, $return = false){
        $dom = $this->dom;
        $node = $rootNode ? $rootNode : $dom->createElement($name);
        foreach ($array as $fname=>$fvalue){
            if (!is_int($fname) and !is_array($fvalue)){
                // если это обычный элемент асоциативного массива
                $fnode = $dom->createElement($fname);
                $fdata = $dom->createCDATASection($fvalue);
                $fnode->appendChild($fdata);
                
                $node->appendChild($fnode);
            }elseif (is_array($fvalue)){
                // если ключ числвой - переименовываем элемент
                if (is_int($fname)) $fname = 'row';
                // если элемент является массивом
                // рекурсивно вызвываем функцию
                $fnode = $this->append_array($fname,$fvalue,false,true);
                
                $node->appendChild($fnode);
            }elseif (!is_array($fvalue) and is_int($fname)){
                // если 
                $fnode = $dom->createElement('value');
                $fdata = $dom->createCDATASection($fvalue);
                $fnode->appendChild($fdata);
                
                $node->appendChild($fnode);
            }
        }
        if ($return) return $node; else $this->document->appendChild($node);
    }
    
    /**
     * Добавить DataSet к коллекции
     *
     * @param string $name
     * @param DataSet $ds
     */
    public function append_dataSet($name,DataSet $ds){
        $this->append_array($name,$ds->data);
    }
}
?>


index.php

Код

<?php
/* config */
define('dir_tpl_elements','templates/elem/');
define('dir_tpl_files','templates/');
define('dir_tpl_modules','templates/modules/');
define('dir_css_elements','templates/css/');
$standart_template = dir_tpl_modules.'common.xslt';

/* include */
include_once('modules/mod_templates.php');

/* operations */
$tpl = new mod_templates();

/* module operations */
$tpl->createCollection('awers',true,true);
$tpl->createCollection('awersx',false,true);

/* release */
$tpl->release($standart_template);
?>


templates/elem/awers.xslt
Код

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/" name="awers">
    Привет, я awers на UTF-8!
</xsl:template>
</xsl:stylesheet>



templates/modules/common.xslt

Код

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<html>
    <head>
        <title>My Title</title>
    </head>
    <body><xsl:call-template name="awers" /></body>
</html>
</xsl:template>
</xsl:stylesheet>

PM MAIL WWW ICQ Skype   Вверх
GeneralElectric
Дата 25.2.2008, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



XML/XSL не угодили тем, что в них лежит китайская лапша - html перемешан с кодом, в большинстве случаев XSL кода больше, чем HTML. Как следствие, требуется отдельный программист на проект. Яндекс может себе это позволить. Другие обходятся решениями более гибкими.
PM MAIL   Вверх
awers
Дата 25.2.2008, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А как же генерация самих блоков? Или там все по взмаху волшебной палочки? Или пхп программист стоит дешевле чем HTML верстальщик со знанием XSL?
PM MAIL WWW ICQ Skype   Вверх
GeneralElectric
Дата 25.2.2008, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Видимо, дешевле =)
Вообще, популярнос шаблонов-лапши, таких, как XSLt или Смарти, сравнима с популярностью шлочных шаблонов. Так что я не возьмусь судить ,какой подход лучше, а какой хуже. Видимо, у всех есть свои положительные стороны.
Другое дело, что XSLT, как верно было замечено, вносит дополнительное усложнение в среду разработки ,и не всегда это выгодно
PM MAIL   Вверх
awers
Дата 25.2.2008, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Мой последний заказчик - дизайнер. Он меня чуть не расцеловал когда я ему показал знакомые, почти ХТМЛ исходники. Теперь сам вкуривает что как и жутко доволен. Если человек чайник - ему и с   <!-- BEGIN blocks-left --> не справится. А XSLT дает явные приемущества, как по контролю ошибок в "десигн тайм" так и в "ран тайм".
PM MAIL WWW ICQ Skype   Вверх
GeneralElectric
Дата 25.2.2008, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну, возможно, ты и прав - все дело в субьективных ощущениях конкретных людей. кому-то нравится обилие кода в шаблоне, кому-то - нет.
правда, следует отметить, что прошлый проект "знакомых, почти ХТМЛ исходников" - ColdFusion - тихо скончался в нищете и забвении.

По поводу же явных приемуществ по контролю ошибок я с удовольствием выслушаю конкретные факты.
Думаю, остальным тоже будет интересно
PM MAIL   Вверх
awers
Дата 25.2.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



я только начал вырабатывать концепцию, но смысл следующий: необходимо введение своего пространства имен, на нем собирать логику. это будет кратно быстрее смарти. над кешами я даже не начинал думать. вполне возможно что в Винград ЦМС войдет уже доработанная версия
PM MAIL WWW ICQ Skype   Вверх
GeneralElectric
Дата 25.2.2008, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я тут решил машину собрать. Трехколесную. У трехколесных устойчивость выше. Конкретные факты - я пока ещё не думал, но собираюсь поркасить в зеленый цвет - должна получиться быстрее формулы 1.

Все ясно.
PM MAIL   Вверх
awers
Дата 25.2.2008, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ты посмотрел мой пример?
PM MAIL WWW ICQ Skype   Вверх
CyClon
Дата 25.2.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



awers, заинтриговал конечно, но все-равно мой вариант более простой для верстальщика.

Мне понравилось XSLT в твоем примере, гибко так. Но пока остановлюсь на своем варианте, ибо вообще с XML не дружу и не понимаю его смысл, как когда-то ООП smile

ЗЫ: Результат обрабоки тех двух шаблонов какой будет?

Добавлено через 2 минуты и 25 секунд
P.S. Может даст кто ссылочку, где можно побольше почитать о взаимодействии XML/XSLT с PHP?


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


Опытный
**


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

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



Э, нет. Так не пойдет.
Вы, ребятки, не тестовыми шаблонами меряйтесь, а боевыми.

Какой результат тех двух шаблонов - это и так ясно: такая же тестовая рыба.
А нарисуйте-ка, оба, вывод строки навигации, вот, хотя бы, как в этом форуме:
« Первая ... 3 4 [5] 6 7 ... Последняя » 

Вот и посмотрим, чего на самом деле стоят оба подхода =)

PM MAIL   Вверх
CyClon
Дата 25.2.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Вот и посмотрим, чего на самом деле стоят оба подхода =)


Смотри выше...

Код
$blocks_foot = array('[1]', '2', '3');
$tpl->assign($blocks_foot, 'blocks-foot');


Ясно, что строки [1], 2 и т.д будут генерироваться скриптом тех же новостей.

ЗЫ:

Код
<!-- BEGIN blocks-foot --><a href="http://example.com/news.php?id={BLOCK:VALUE}"><b>{BLOCK:VALUE}</b></a> <!-- END blocks-foot -->



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


Опытный
**


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

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



Извини, но то, что ты сейчас здесь набросал на скорую руку - это не ответ на мой вопрос.
Где в твоем шаблоне выделение текущей строки? где вывод "первая", "полследняя"? 
С какой стати строка [1] будет генерироваться скриптом новостей? Почему оформление текущей страницы пишеть программист? А если дизайнер захочет не квадратные скобочки, а фигурные? Выделить болдом? Или вообще - картинку?
Какой смысл мы вкладываем в шаблонизацию? Согласен ли ты, что в РНР коде не должно быть ни одного хтмл тега?

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

Поэтому у меня будет просьба: если уж ты решишь ответить, то отвечай не как это будет с точки зрения теории, а напиши конкретный, рабочий пример. Он все равно тебе пригодится, ведь постраничный вывод - одна из самых распространенных задач.

Это сообщение отредактировал(а) GeneralElectric - 25.2.2008, 11:45
PM MAIL   Вверх
flashaa
Дата 25.2.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GeneralElectric @  25.2.2008,  01:07 Найти цитируемый пост)
Как следствие, требуется отдельный программист на проект. 

Ничего нет в XSLT сложного. Есть HTML, есть управляющие команды. Конечно часть логики вынесена в шаблон. Но это логика отображения. И чтоб делать гибкий вывод, лучше уж пусть останется этот кусочек логики в шаблоне. Сложность "освоения" шаблона дизайнером зависит не от языка шаблонов. У всех шаблонизаторов суть примерно одна. И вряд ли дизайнеру будут нужны какие-то фундаментальные познания. Типа того как изменить приоритет включаемого шаблона или даже сделать собственный цикл. Если дизайнеру дается работающий XLST шаблон, то все что ему надо - посмотреть общую структуру страницы (здесь - правая колонка, тут - левая, тут - баннер  и тп) и заменить старый HTML на свой, новый. И то, как быстро он это сделает, зависит скорее от того, насколько хорошо шаблон был комментирован и от его структуризации. Т.к. XSLT  по сути - XML-дерево, то сделать в нем неудобное оформление весьма сложно. В любой момент можно автоматически выстроить дерево в каком-нибудь редакторе. По поводу комментариев. XSLT по своей природе блочен (xls:template). Если для каждой страницы сделать свои шаблоны, которые будут состоять из "обертки" сайта (<html>...) и отдельного файла шаблона на каждый раздел, то все и так понятно. 

index.php
index_header.xls
index_users.xsl
index_chapters.xsl

admin.php
admin_header.xsl
admin_rights.xsl
admin_bans.xsl

Пара комментариев в заголовке каждого файла - и у вас готовый учебник по XLST. К минусам XLST можно отнести негативные факторы древовидной структуры - управляющие структуры вынуждают писать много кода. Чтоб освоить xslt, надо 2 недели максимум. На моем опыте, дизайнер, не знающий XSLT, правил шаблоны XSL за 2 дня и все у него получалось отлично.

Это сообщение отредактировал(а) flashaa - 25.2.2008, 12:33
PM MAIL   Вверх
awers
Дата 25.2.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



flashaa, "надо 2 недели максимум. " пошутил видимо? может ты имел в виду первое знакомство - 2 недели? или зря пишут книги по 2 тысячи страниц по XML/XSL? огромное количество вариаций.... 


GeneralElectric, с суть XML/XSL случаем не отчистка PHP от HTML тегов? даже морочиться писать не буду ничего для приведения примеров. Там в 10 строк кода.
PM MAIL WWW ICQ Skype   Вверх
GeneralElectric
Дата 25.2.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



awers, спасибо за то, что ты опять со мной согласился, подтвердив абсолютную равнозначность XSLT любому ддругому шаблонизатору, суть которого сводится к очистке PHP от HTML тегов.
Учитывая же озвученную тобой чрезмерную сложность XSL, в связи с которой даже 10 строк кода представляют собой ощутимую по трудозатратам задачу, получается, что на свой вопрос - чем нам XML/XSL не угодили то - ты сам себе и ответил =)

Это сообщение отредактировал(а) GeneralElectric - 25.2.2008, 18:00
PM MAIL   Вверх
awers
Дата 25.2.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Оо упал в обморок. Я имел в виду что все настолько просто что я деже небуду на это заморачиваться. И к тому-же ниодин другой шаблонизатор не предоставит таких возможностей как XSLT. Передергивать мои слова ненужно
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 25.2.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(awers @  25.2.2008,  17:15 Найти цитируемый пост)
" пошутил видимо? может ты имел в виду первое знакомство - 2 недели? или зря пишут книги по 2 тысячи страниц по XML/XSL? огромное количество вариаций.... 

Эээ. Ну как бы тебе сказать. На одном из рабочих мест я не знал XLST, но знание требовалось. На изучение его потратил 1 неделю. Через неделю уже во всю работал. Ну конечно во время работы подсматривал в мануалы и дальше что-то новое узнавал. Это обычное дело. Или с PHP ты никогда не совершенствуешься в процессе работы? 
Какие тысячи страниц. XML это максимум 100 страниц. В XSL теория займет тоже около 100 страниц МАКСИМУМ. Остальное - рациональные решения, наработки, которые можно писать бесконечно. А можно просто понять суть и дальше все само собой вытекает.
ХSL стоит на нескольких китах. Просто несколько необычны они в сравнении с операцией замены {title} на "превед" smile Но XSL не содержит никакой мишуры, не нужной для шаблонов, поэтому просто не в чем запутываться и неправильно что-то использовать.

Ах, да. При использовании XSL нужно знать XPath. А по нему наверняка тоже некоторые пишут тысячи страниц )

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


Эксперт
****


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

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



Есть мнение, что заставлять писать человека xml это не гуманно и должно быть запрещено конвенцией ООН. Полностью согласен, там более когда им злоупотребляют, как в случае XLST-шаблонизатора.
PM MAIL WWW   Вверх
awers
Дата 25.2.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



тогда PHP стоит запретить в первую очередь
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 25.2.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ага. XML писать негуманно. А все остальное гуманно? Пусть ООН запретит вообще что-либо писать. И будет нирвана.

PM MAIL   Вверх
GeneralElectric
Дата 25.2.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



awers, не смог привести ни одного примера или простого и непротиворечивого доказательства превосходства XSL над другими шаблонизаторами. Все, что он говорит, в одинаковой мере присуще любым другим системам. Только голословные утверждения - "XSL быстрее всех", "XSL предоставляет такие возможности, которых у других нет". И ни одного догазательства

Я думаю, стоит прекратить эту беседу в стиле священной войны.

PM MAIL   Вверх
flashaa
Дата 25.2.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Забыл ещё аргумент в пользу XSLT. Он является некоторой абстракцией отображения. Т.е. часто шаблонизаторы работают с PHP. А XSLT поскольку работает с XML деревом работает на многих платформах. Во всяком случае, точно работает с Perl, и , возможно, с Java. Вообще будет работать везде, где есть поддержка XSLT-трансформации.
Если подытожить, то мое мнение такое - либо PHP-шаблоны, либо XSLT. В зависимости от сложности проекта, аудитории. Для коммерческих популярный сайтов, конечно, стоит отказываться от XSLT, ибо несколько тяжелее.  В этом случае, имхо, использовать надо PHP или вообще менять платформу.

Дополнительные шаблонизаторы - зло, потому что
1) стоят времени
2) добавляют нагрузки процессору
3) добавляет кучу классов/функций/файлов, в которых нужно дополнительно разбираться
4) без них легко можно обойтись

И ещё. Если человек способен понять {title}, но не способен понять <xsl:value-of select="/page/@title"/> или <?php echo $title; ?>, то гнать такого в шею.

Это сообщение отредактировал(а) flashaa - 25.2.2008, 19:06
PM MAIL   Вверх
awers
Дата 25.2.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Брависсимо, но вы товарисч забываете что мы живем не в 10 веке, когда компутер совершал 4 операции в минуту. На моей слабой тачке, мой шаблонизатор обрабатывает страницу (из 4х частей по 4-10 кил каждый) плюс подключение к бд, статистика ... всего за 0,012 сек. Это очень ресурсоемко?
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 25.2.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



awers, ну и хорошо, что так. Но серьезные проекты так не делаются -  "ну и пофиг, что мое решение больше тормозит. Все равно комп то мощный!". Хотя зависит все, как я уже сказал, от конкретной задачи. Если никак не удается найти дизайнера, который поймет <?php echo $title; ?>, то тогда да, решение оптимально.
PM MAIL   Вверх
awers
Дата 25.2.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я думаю что мало кто из Вас товарисчи делал такие сайты, где это было бы критично.
Давай рассмотрим ситуацию: есть время 86 400. Это кол-во секунд в сутках. Даже если работа скрипта займет 0,3 секунды - это уже 288 тысяч посещений в день. Логично?
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 25.2.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пусть приемлимо в плане производительности. Мне сам подход не нравится. Я писал так же и другие недостатки. 
К тому же не люблю я шаблоны, которые занимаются заменой одних букв на другие. Мое убеждение - если мы собрали данные, которых достаточно для для вывода страницы, то их необходимо передавать шаблонизатору. А он уже с этими данными разбирается. В основном скрипте должна быть по максимуму логика, и меньше рутины. В частности, меньше рутины по отображению.
Если не оставлять логики в шаблонизаторе, то необходимо либо навтыкать кучу кода по подготовке данных в основной скрипт, либо создавать промежуточный уровень между основным скриптом и шаблонизатором.
Все это - дополнительное усложнение. При отображении сложных страниц, шаблонизаторы типа str_replace бессильны и огромные куски кода по работе с данными висят в скрипте. Например делал я когда-то большую многостраничную, многораздельную анкету. Скрипту необходимо получить названия полей ввода, значения и группы, в которых объединены поля. При использовании "умного" шаблонизатора, работа скрипта заключалась в выборке. При использовании простого - вся эта мишура по компоновке полей была в скрипте. При чем для разных разделов одна и та же мишура. Только с разными данными.

Это сообщение отредактировал(а) flashaa - 25.2.2008, 19:41
PM MAIL   Вверх
awers
Дата 25.2.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



flashaa, именно это XSLT ))
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 25.2.2008, 19:41 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(awers @  25.2.2008,  19:38 Найти цитируемый пост)
flashaa, именно это XSLT )) 

Да, с ОЧЕНЬ сложными страницами не справится.

Я ж писал, что шаблонизатор выбирается в зависимости от задачи. В одном месте у меня есть сотрудничество с Перлом. Там используется XSLT-шаблоны. Для единообразия. К тому же там сайты не нуждаются в быстродействии. В остальных местах использую PHP.

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


Эксперт
****


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

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



Цитата(flashaa @  25.2.2008,  19:44 Найти цитируемый пост)
Ага. XML писать негуманно. А все остальное гуманно? Пусть ООН запретит вообще что-либо писать. И будет нирвана.

XML это машинный формат по сути, и зачем его использовать там, где можно без него обойтись? Классический шаблонизатор удобнее из-за своей простоты. А как показывает практика, для дизайнера/верстальщика чем проще шаблонный язык тем лучше и продуктивнее его работа и работа коллектива. И он не отвлекает программиста и-за того что какие-то замуты из XSLT ему не понятны. Да и читается, и сопровождаются императивный код шаблонизатора лучше.
PM MAIL WWW   Вверх
awers
Дата 25.2.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Daevaorn @ 25.2.2008,  19:49)
Цитата(flashaa @  25.2.2008,  19:44 Найти цитируемый пост)
Ага. XML писать негуманно. А все остальное гуманно? Пусть ООН запретит вообще что-либо писать. И будет нирвана.

XML это машинный формат по сути, и зачем его использовать там, где можно без него обойтись? Классический шаблонизатор удобнее из-за своей простоты. А как показывает практика, для дизайнера/верстальщика чем проще шаблонный язык тем лучше и продуктивнее его работа и работа коллектива. И он не отвлекает программиста и-за того что какие-то замуты из XSLT ему не понятны. Да и читается, и сопровождаются императивный код шаблонизатора лучше.

Машинный формат это 00101011 ... 
Или ты HTML и иже с ним тоже считаешь нашинным форматом? 
PM MAIL WWW ICQ Skype   Вверх
CyClon
Дата 25.2.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я не противник XML, я просто его слишком слабо знаю. Однако рекомендую всем почитать ну это только твоя предирчивость к словам ) не более того , может кого-то и направит на путь истинный smile


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


Опытный
**


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

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



Цитата(Daevaorn @  25.2.2008,  19:49 Найти цитируемый пост)
XML это машинный формат по сути, и зачем его использовать там, где можно без него обойтись? Классический шаблонизатор удобнее из-за своей простоты.

Со сложностью XSLT согласен. Точнее не сложен он, а непривычен просто.
По поводу "зачем использовать, если можно обойтись" - абсолютно такой же вопрос к кастомным шаблонизаторам типа смарти - зачем их использовать, если можно обойтись PHP.

Цитата(Daevaorn @  25.2.2008,  19:49 Найти цитируемый пост)
А как показывает практика, для дизайнера/верстальщика чем проще шаблонный язык тем лучше и продуктивнее его работа и работа коллектива.

Вот только как связаны работа дизайнера/верстальщика и работа остального коллектива? Обычно программирование идет параллельно с разработкой дизайна. Затем дизайн и шаблоны из "программерской" версии сайта скидываются верстальщику. Верстальщик работает, а остальные переходят к новому проекту. И зачем всем ждать верстальщика - непонятно.
Цитата(Daevaorn @  25.2.2008,  19:49 Найти цитируемый пост)
И он не отвлекает программиста и-за того что какие-то замуты из XSLT ему не понятны.

Если читать мои предыдущие посты, то станет понятно, что если не заставлять дизайнера писать самому XSLT-шаблон с нуля, то его задача состоит в разборе стуктуры HTML-кода и замене старого HTML на новый. При этом он не трогает управляющие структуры, т.к. они связаны с логикой, а не с дизайном. Если меняется логика отображения сайта, то тут уже должен участвовать программист. Если в одном месте был список, то он не может с бухты барахты по воле одного верстальщика превратиться в таблицу. Вообще работа верстальщика - править HTML. И более ничего.

Это сообщение отредактировал(а) flashaa - 26.2.2008, 13:02
PM MAIL   Вверх
Daevaorn
Дата 25.2.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(flashaa @  25.2.2008,  23:09 Найти цитируемый пост)
Вот только как связаны работа дизайнера и работа остального коллектива? Обычно программирование идет параллельно с разработкой дизайна. Затем дизайн и шаблоны из "программерской" версии сайта скидываются верстальщику. Дальше программер занимается новым проектом. И зачем всем ждать дизайнера - непонятно.

к словами придираешься?smile Я лишь имел ввиду что это может быть как один человек, так и несколько.
Цитата(flashaa @  25.2.2008,  23:09 Найти цитируемый пост)
Если читать мои предыдущие посты, то станет понятно, что если не заставлять дизайнера писать самому XSLT-шаблон с нуля, то его задача состоит в разборе стуктуры HTML-кода и замене старого HTML на новый. При этом он не трогает управляющие структуры, т.к. они связаны с логикой, а не с дизайном. Если меняется логика отображения сайта, то тут уже должен участвовать программист. 

И зачем?
Я в шаблон передаю контекст данных, а тот кто пишет шаблоны эти данные интерпретирует так как ему надо, абсолютно меня не трогая. Он лишь иногда говорит, что тут мне нужна ещё эта информация, а тут другая. А чем сложнее шаблонный язык, тем чаще не-программист будут к программисту обращаться.
Ну и потом, продолжаю настаивать на том, что xml слишком verbose и не для человека по сути. 
PM MAIL WWW   Вверх
awers
Дата 25.2.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Daevaorn, еще раз переспрошу, ты считаешь HTML тоже слишком многословным и не для людей?
А C++ разве можно назвать языком для людей? Он вообще не в какие рамки по сравнению с XML
PM MAIL WWW ICQ Skype   Вверх
solenko
Дата 27.2.2008, 13:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Начнем с того, что я сторонник использования php по прямому его назначению -- как шаблонизатора. И он прекрастно позволяет отделить логику от отображения.

Далее... Как факторы против такого подхода из этой темы:
1. Верстальщики не знают php.
2. Религия не позволяет

Как предлагаемые альтернативы:
1. Свой шаблонизатор
2. Распространенный шаблонизатор
3. XML+XSLT

Теперь давайте посмотрим на первый пункт для всех альтернатив:
1, 2 -- а что, тут своего языка не будет? Еще не видел ни одного шаблонизатора без встроенных условий, циклов и т.п.
3 - 
Цитата

"надо 2 недели максимум. " пошутил видимо? может ты имел в виду первое знакомство - 2 недели? или зря пишут книги по 2 тысячи страниц по XML/XSL? огромное количество вариаций.... 

все уже сказано до нас. намного сложнее чем базовый синтаксис php.

Второй пункт и рассматривать не стоит -- против религии не попреш.

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

P.S. Да, я прочитал тему целиком.

Это сообщение отредактировал(а) solenko - 27.2.2008, 18:49


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Daevaorn
Дата 27.2.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(solenko @  27.2.2008,  14:51 Найти цитируемый пост)
1. Верстальщики знают php.

Не все. Плюс php избыточен по сути для шаблонизатора. Можно ненароком что-то попортить. Шаблонизатор - как часть защиты от дурака.
Цитата(solenko @  27.2.2008,  14:51 Найти цитируемый пост)
Если есть еще доводы против использования php как шаблонизатора, то, пожалуйсто, приведите. Если нет, то все таки сводится к религии.

Всё можно свести к "религии". Разве не религия писать сайты на php, а не на ассемблере например?
PM MAIL WWW   Вверх
solenko
Дата 27.2.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Daevaorn, "Верстальщики не знают php" -- должно было быть так. Опечаталя.
Цитата

Плюс php избыточен по сути для шаблонизатора. Можно ненароком что-то попортить. Шаблонизатор - как часть защиты от дурака.

Что вы подразумеваете под "попортить"? Удалить файлы, дропнуть базу? Ну тогда такому дураку и к svn доступ давать нельзя.

Цитата

Всё можно свести к "религии". Разве не религия писать сайты на php, а не на ассемблере например?

Не религия, т.к. есть измеримый параметр -- время написания (есть и другие, но этот самый очевидный).
А вот писать на php или ASP -- это уже религия )


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Daevaorn
Дата 27.2.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(solenko @  27.2.2008,  19:56 Найти цитируемый пост)

Что вы подразумеваете под "попортить"? Удалить файлы, дропнуть базу? Ну тогда такому дураку и к svn доступ давать нельзя.

Имею ввиду именно пхп. Т.е. позвать(случайно) какую-нибудь функцию с не очевидным side-effect, который повлияет на дальнейшую работу; присвоить какой-то переменной что-то чего в ней не должно быть и т.д. Поскольку пхп шаблонизатор живет в том же окружении что и логика, то отсюда могут появиться всякие неприятности. А вот отдельный хороший движок шаблонизации позволяет только получить доступ туда, куда указал программист и не более.
Цитата(solenko @  27.2.2008,  19:56 Найти цитируемый пост)
Не религия, т.к. есть измеримый параметр -- время написания (есть и другие, но этот самый очевидный).
А вот писать на php или ASP -- это уже религия ) 

Ха!smile Так время написания от языка (кстати, asp не язык, так что его сравнивать с php не очень корректно, если не рассматривать сам php как платформу) в приделах одной прикладной области, зависит тоже не слабо. Взять те-же ruby и python. Так что время не параметр "религиозности":)
PM MAIL WWW   Вверх
solenko
Дата 27.2.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Т.е. позвать(случайно) какую-нибудь функцию с не очевидным side-effect, который повлияет на дальнейшую работу; присвоить какой-то переменной что-то чего в ней не должно быть и т.д. Поскольку пхп шаблонизатор живет в том же окружении что и логика, то отсюда могут появиться всякие неприятности. А вот отдельный хороший движок шаблонизации позволяет только получить доступ туда, куда указал программист и не более.

Вызвать функцию... Пожалуй прийдется согласиться. Можно, хоть и маловероятно. Опять же, обычно функции упакованы по неймспейсам. 
По поводу переменных -- в шаблоне работаем с глобальныйми переменными (они становятся глобальными при передаче управления в шаблон), все остальное вне глобального пространства.

Цитата

Ха! Так время написания от языка (кстати, asp не язык, так что его сравнивать с php не очень корректно, если не рассматривать сам php как платформу) в приделах одной прикладной области, зависит тоже не слабо. Взять те-же ruby и python. Так что время не параметр "религиозности":)

Вы хотите сравнить разницу во времени написания сайта на РHP/ASP/Python и ASM? ))
А если серьезно, то естественно, у каждого языка/технологии своя предметная область. У ASP и PHP они одинаковы, потому я и говрю, что выбор между ними -- впрос религии. Точно так же вы можно устроить холивар на сравнении, например, dBase, ForPro и Paradox -- тоже вопрос религии.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
SamDark
Дата 27.2.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Странно. Вы даёте верстальщику делать что-то кроме разметки (html+css)?

Я беру кучу статичных страниц, сделанных верстальщиком и перегоняю всё на шаблонный язык, будь то Smarty, XSL, php или ещё что.

Верстальщик в данном случае не заморачивается с шаблонами вообще и не вносит хаос в приложение (особенно, если он не может изучить азы программирования). Получается быстро и безопасно.


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


Эксперт
****


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

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



А если дизайн и соответственно верстка изменятся(пусть даже чуть-чуть) что, опять по новой?
Программист должен бизнес логику писать, а не разбираться, куда какой блок на странице переместить.

Цитата(solenko @  27.2.2008,  20:43 Найти цитируемый пост)
По поводу переменных -- в шаблоне работаем с глобальныйми переменными (они становятся глобальными при передаче управления в шаблон), все остальное вне глобального пространства.

ну так и их можно попортить. шаблонизатор хотя бы может проверки делать.
Цитата(solenko @  27.2.2008,  20:43 Найти цитируемый пост)
Вы хотите сравнить разницу во времени написания сайта на РHP/ASP/Python и ASM? ))
А если серьезно, то естественно, у каждого языка/технологии своя предметная область. У ASP и PHP они одинаковы, потому я и говрю, что выбор между ними -- впрос религии. Точно так же вы можно устроить холивар на сравнении, например, dBase, ForPro и Paradox -- тоже вопрос религии. 

Я лишь к тому, что время  не является мерой "религии".
PM MAIL WWW   Вверх
SamDark
Дата 27.2.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Daevaorn
Цитата

А если дизайн и соответственно верстка изменятся(пусть даже чуть-чуть) что, опять по новой?

Если не сильно - правит программист. Если сильно - конечно по новой. Дизайн меняется после утверждения через год-два.

Цитата

Программист должен бизнес логику писать, а не разбираться, куда какой блок на странице переместить.

Это чистый server-side-программист.


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


Опытный
**


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

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



Да, Daevaorn решил, что в основах работы PHP лежат потребности его фирмы smile Без обид, но это так - все время пытается навзяать свои принципы работы. 
PM MAIL   Вверх
GeneralElectric
Дата 27.2.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще, на последних двух страницах тема превратилась в holy war, "бессмысленный и беспощадный" (это читата из классики, а не попытка кого-то оскорбить).
Каюсь, я сам приложил к этому руку. Но я всего лишь хотел объяснить адептам XSL, что их шаблонизатор не является уникальным, а ничем принципиальным не выделяется среди других.
И ответил на вопрос, почему кто-то выбирает простой блочный шаблонизатор.
При этом я нигде ни одним словом не говорил, что какой-то тип шблонизатора значительно хуже или значительно лучше других ,Что сейчас пытаются сделать некоторые участники.

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


Новичок



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

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



Первые версии PHP были написаны на CGI\Perl, был такой себе велосипед для велосипеда, который и задумывался как шаблонизатор.
Потом он стал отдельным языком, но всё-равно почему-то хотят и под него написать велосипед.

Если тенденция продолжится, то и для шаблонизаторов начнут писать шаблонизаторы.

Если бы PHP был досихпор написан на перле, то вышел бы "Велосипед для велосипеда, для велосипеда, который написан для велосипеда"

ПХП сам по себе шаблонизатор.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 24.5.2008, 16:09 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(TSVET @  24.5.2008,  12:44 Найти цитируемый пост)
ПХП сам по себе шаблонизатор. 

Ок. Только теперь новая проблема - что в таком случае использовать в качестве языка программирования для бизнес логики?
PM MAIL WWW   Вверх
Feldmarschall
Дата 24.5.2008, 16:36 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Daevaorn, вот зачем писать такие неконструктивные вещи?

Зачем вообще спорить с очевидным?  TSVET прав. Так же, как и все другие выступавшие, со своими подходами. Да, ПХП - наиболее простой и очевидный из вариантов шаблонизации. но никто никого силком не тянет им пользоваться. Нравится тебе твое - используй. Не нравится чужое - ругай. Только аргументированно. А не так, как сейчас. Что, кроме флейма, ты ожидаешь получить в ответ на свой вопрос?
PM   Вверх
Daevaorn
Дата 24.5.2008, 20:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Feldmarschall @  24.5.2008,  17:36 Найти цитируемый пост)
Что, кроме флейма, ты ожидаешь получить в ответ на свой вопрос? 

Хм... название языка.
PM MAIL WWW   Вверх
Feldmarschall
Дата 24.5.2008, 20:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



PHP
PM   Вверх
AntonShevchuk
Дата 26.5.2008, 10:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Шаблонизатор должен разделять логику и отображение. Если Вы этого не понимаете - никакой template engine Вас не спасет. "Разделение" должно быть у Вас в голове, а получается, что многие считают - использую Smarty (и т.п.) - значит разделяю...

Если Вы считаете, что с шаблонизатором облегчаете жизнь дизайнерам - то посмотрите на Wordpress - сколько шаблонов дизайна создано людьми не знающими PHP, они всего-лишь читали мануал на сайте WP.

P.S. Сам подсел на ZF - и очень доволен Zend_View...
PM MAIL WWW   Вверх
Валерия
Дата 30.7.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ИМХО задача шаблонизатора, что бы дизайнер мог легко открывать в фронтпейдже/дримвювере и тп. редактор твои шаблоны и легко их редактировать НЕ ЛАЗАЯ В ИСХОДНЫЙ КОД ШАБЛОНА
PM MAIL   Вверх
bars80080
Дата 30.7.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



а фронтпейдж не визивиг случаем?
PM MAIL WWW   Вверх
Fortop
Дата 1.8.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Kefir @  1.8.2008,  18:01 Найти цитируемый пост)
то есть парсер должен переводить язык шаблона в язык ПХП. потом, к примеру, делаешь в классе шаблонизатора:
Код

funciton fetch( $path ) {
  if(!Templater::compiled( $path ) || Templater::needsRecompile( $path )) {
    Templater::compile( $path );
  }
  include( Templater::getCompiledVersion( $path );
}



Вот объясните мне...
почему не делать последнее действие сразу?
Т.е. писать шаблон сразу на PHP....
Это избавит от половины плясок с бубнами.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Kefir
Дата 1.8.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



Fortop, хехе. хороший вопрос. просто всё это будет громоздко и некрасиво. можно, конечно можно сразу писать этот пхп. только согласись - намного лучше и удобнее как читать так и писать <p>{$name}</p>, чем <p><?php echo $name; ?></p>. а с появлением циклов и условий этот пхп можно будет показывать как страшилку В). а шаблонизатор - один раз написал и радуйся всю жизнь, пока не задолбает. вот и всё.

а вообще это  smile 
PM MAIL WWW Skype   Вверх
skyboy
Дата 1.8.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Fortop, пожалуй в тему про лучший шаблонизатор. единственный, как мне кажется, бесспорный факт, не выводящий тему в ранг религиозных войн: шаблонизатор должен предоставлять более высокий уровень абстракции, что сопровождается снижением контроля(к примеру, в том же smarty результат шаблонизации не отдается немедленно), но при этом - ускорению разработки(несмотря на то, что все же логика модели находится в РНР скрипте, который надо создавать кроме шаблона). так в теории. на практике, конечно, попадаются шаблонизаторы, не повышающие уровень абстракции.
PM MAIL   Вверх
Fortop
Дата 1.8.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Так и не понял. Чем вот это
Код

{if $myImage != ""}<img src="{$myImage}">{else}<p>No image specified</p>{/if}

плюс
Код

funciton fetch( $path ) {
  if(!Templater::compiled( $path ) || Templater::needsRecompile( $path )) {
    Templater::compile( $path );
  }
  include( Templater::getCompiledVersion( $path );
}


Лучше такого

Код

$myImage = $myImage? 'lalala' : '<p>No image specified</p>';
include( $templatePath );


или вот такого

Код

$this->view->myImage = $myImage? 'lalala' : '<p>No image specified</p>';
$this->render($templatePath);


Ну, а если посмотреть на циклы в Смарти.... то все становится еще веселее.

Удобочитаемость? Нет.
Скорость? Нет.
Скажите кеширование? Так, извините меня, кеширование вещь в себе, и с шаблонами связана слабо.

Вот и не понятно мне, чем же лучше?

Добавлено через 9 минут и 9 секунд
Цитата(skyboy @  1.8.2008,  19:09 Найти цитируемый пост)
шаблонизатор должен предоставлять более высокий уровень

IMO - Шаблоны и шаблонизаторы отзвуки тех далеких времен, когда MVC или понимание о правильном разделение логики-представления в PHP практически не существовало.
Как результат велосипеды слабо повышающие уровень абстракции.

Тот же Смарти... Мне сложно понять, почему не принять правило что все входящие данные должны обрабатываться следующим образом (это если без ООП)
Код

$TEMPLATE_DATA['templateParent']['key1'] = date('Y-m-d', time());
$TEMPLATE_DATA['templateParent']['key2'] = 'some string';
$TEMPLATE_DATA['templateParent']['templateChild'][] = 'some text';

.....

include $templateName;


И все. Все необходимые циклы на PHP, условный операторы тоже на PHP. Небольшая логика в отображении нужна - с этим все согласны... 
Тогда зачем псевдоконструкции?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 1.8.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(Fortop @  1.8.2008,  19:15 Найти цитируемый пост)
Так и не понял. Чем вот это

хм. я н говорил конкретно про СМАРТИ. 
Цитата(Fortop @  1.8.2008,  19:15 Найти цитируемый пост)
Тогда зачем псевдоконструкции? 

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

$id= 5;
echo $id;
....
$id= 20;
....
if($id == 7)
...

псевдоязык того же СМАРТИ, раз уж про него(с XSLT практически не знаком, потому про него говорить не буду) предполагает вполне определенную область видимости. нет, конструкция assign тоже есть, но неудобство(как ті сам заметил) такой конструкции позволяет надеяться: переменые будут иметь однозначные и определенные в любом месте шаблона значения. вариации на тему переменных переменных и выполнение функции по её имени в виде строки в произвольной переменной если не улучшают стиль кода, упрощают отладку.
я бы провел аналогию с C#  и автоматического управления памятью, против С++ с ассемблерніми вставками и винегретом ссілок и указателей.
Цитата(Fortop @  1.8.2008,  19:15 Найти цитируемый пост)
Удобочитаемость? Нет.

смотря какой код.
Цитата(Fortop @  1.8.2008,  19:15 Найти цитируемый пост)
Скорость? Нет.

смотря какой код.
вне зависимости от используеміх инструментов можно создать неудобочитаемый и дико тормозящий код. будем спорить? надеюсь, нет.
тогда вопорс в другом: возможно ли используя  язык разметки, основанный на XML со специального вида вставками читаться хорошо? мне почему-то кажется, что можно.
можно ли при помощи подобного языка создать не тормозящий код? я думаю, это в большей мере зависит от компилятора(например, в случае со smarty - компилятор в РНР).
так что за обобщенные оценки?

Цитата(Fortop @  1.8.2008,  19:15 Найти цитируемый пост)
Шаблоны и шаблонизаторы

ой, обобщать не надо. HTML-вставки любой РНР-скрипт превращают в шаблон.

Добавлено через 2 минуты и 40 секунд
Цитата(Fortop @  1.8.2008,  19:15 Найти цитируемый пост)
Так и не понял. Чем вот это
Код

{if $myImage != ""}<img src="{$myImage}">{else}<p>No image specified</p>{/if}

фи. у меня это выглядело бы так:
Код

<img src="{$myImage | default: "no_image_specified.png"}" />

наверное, ни черта ни понятно в сравнении с 
Код

echo '<img src="';
if($myImage == '')
    echo 'no_image_specified.png';
else
   echo $myImage;
echo '" />';

PM MAIL   Вверх
Fortop
Дата 2.8.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(skyboy @  1.8.2008,  23:02 Найти цитируемый пост)
хотя бы затем, что все переменные(суть - модель) инициализированы ещё до использования шаблона

т.е. проблема в инкапсуляции? я правильно понял?

Так и заводи отдельный массив/коллекцию/модель данных для вывода
и тогда будет

Код

$id= 5;
$data['id'] = $id;

echo $data['id'];
....
$id= 20; // хотя уже это странно зачем ему быть в представлении?
....
if($data['id'] == 7)
...


Цитата(skyboy @  1.8.2008,  23:02 Найти цитируемый пост)
псевдоязык

Пока я понял, что ты возлагаешь на него ужесточение синтаксического контроля. Возможно это и выход... но... тогда уж действительно лучше перейти на другой язык.
Цитата(skyboy @  1.8.2008,  23:02 Найти цитируемый пост)
тогда вопорс в другом: возможно ли используя  язык разметки, основанный на XML со специального вида вставками читаться хорошо? мне почему-то кажется, что можно.
можно ли при помощи подобного языка создать не тормозящий код? я думаю, это в большей мере зависит от компилятора

У PHP пока еще не тот уровень абстракции, чтобы были эффективными такие финты ушами. Можно, прекрасно можно... но кто сказал что это будет лучше?
Чем этот язык и специальные вставки будут отличаться от простейшего PHP синтаксиса?
Да ничем. Кроме лишней прослойки, которая в итоге дает сомнительные выгоды (в виде простоты и понятности). Мы ничего не получаем.
Я думаю, проще/дешевле и быстрее будет договориться о корпоративных стандартах кодирования... Получим тот же эффект.

Я вот в свое время, слишком доверял одному разработчику smile Теперь приходится вилизывать перлы из кода.
В виде расставленных куда ни попадя @, бросания exception там, где достаточно просто вернуть false (например при пустой выборке из базы) и т.д.

это
Код

echo '<img src="';
if($myImage == '')
    echo 'no_image_specified.png';
else
   echo $myImage;
echo '" />';


поправил
Код

<img src="<?php echo $myImage ? $myImage : 'no_image_specified.png'; ?>" />

Как ты считаешь, это сильно отличается от твоего варианта ниже?

Цитата(skyboy @  1.8.2008,  23:02 Найти цитируемый пост)
фи. у меня это выглядело бы так:
Код

<img src="{$myImage | default: "no_image_specified.png"}" />[/quote]



Заметь, в моем случае мы не учим "новые" операторы {} | smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 2.8.2008, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(Fortop @  1.8.2008,  23:00 Найти цитируемый пост)
договориться о корпоративных стандартах кодирования.

конечно, это надежнее, чем использовать систему, которая и не допускает реинициализации или unset переменных. если бы было проще договориться, не было бы ужасного кода.
Цитата(Fortop @  1.8.2008,  23:00 Найти цитируемый пост)
$id= 20; // хотя уже это странно зачем ему быть в представлении?

тебя смущает инициализация переемнных в пределах логики отображения? т.е.. к примеру, порядковые номер строки в таблице надо генерировать в пределах модели? создавать сущность "счетчик строки для таблицы №3"? сама по себе инициализация тоже ни плоха, ни хороша. но когда бы объявляем явно
Код

{counter name="table_terator}
....

как если бы мы использовали исключительно циклы for - это одно. а если "где ни попадя" может встретиться реинициализация - это другое.
Цитата(Fortop @  1.8.2008,  23:00 Найти цитируемый пост)
что ты возлагаешь на него ужесточение синтаксического контроля

ты спросил, чем я считаю один язык лучше другого. я и пишу, что специализированный язык разметки(html) со слабыми механизмами логики в виде дополнительных вставок - лучше языка с мощной алгоритмической составляющей. лучше для реализации представления. лучше своей однозначностью, большей строгосьтю(те же переменные переменные, замыкания, вызов функции по имени в переменой и т.д.), и, следовательно, потенциально меньшей бажностью. можно пседоязык smarty, можно xslt. все равно.

Добавлено через 4 минуты и 45 секунд
Цитата(Fortop @  1.8.2008,  23:00 Найти цитируемый пост)
Заметь, в моем случае мы не учим "новые" операторы {} |

зато надо знать, что 
Код

if($myImage)

вернет false не только для значения false, но и для неустановленной переменной, числа 0, пустой строки, пустого массива и т.д.
PM MAIL   Вверх
Fortop
Дата 2.8.2008, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(skyboy @  2.8.2008,  00:16 Найти цитируемый пост)
тебя смущает инициализация переемнных в пределах логики отображения?

меня смущает отсутствие простейшего разделения логики отображения и места где формируются исходные данные.

Код


$id= 5; // данные
$data['id'] = $id; //данные
echo $data['id']; //данные
....
// представление? а почему все в одном модуле/функции?
$id= 20;
....
if($data['id'] == 7)
...


Цитата(skyboy @  2.8.2008,  00:16 Найти цитируемый пост)

зато надо знать, что 
Код

if($myImage)

вернет false не только для значения false, но и для неустановленной переменной, числа 0, пустой строки, пустого массива и т.д. 

Это обязан знать любой программист на PHP. А верстальщику должно быть абсолютно безразлично, что это за код smile
Главное его не трогать (код, а не верстальщика ) smile

Цитата(skyboy @  2.8.2008,  00:16 Найти цитируемый пост)
конечно, это надежнее, чем использовать систему, которая и не допускает реинициализации или unset переменных.

Ты невнимательно смотрел мое предложение
договоритесь о двух вещах.
1. массив $DATA_FOR_TEMPLATE может только читаться во всех представлениях.
2. Вызов или include всех представлений инкапсулируй в одной единственной функции
Все.

Код

render('templatename', $DATA_FOR_TEMPLATE);


Если разработчики не могут придерживаться этих 2х простых правил. То тогда кто тебе сказал, что при своих умственных способностях они разберутся в Smarty?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 2.8.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(Fortop @  2.8.2008,  02:13 Найти цитируемый пост)
Ты невнимательно смотрел мое предложение
договоритесь о двух вещах.
1. массив $DATA_FOR_TEMPLATE может только читаться во всех представлениях.
2. Вызов или include всех представлений инкапсулируй в одной единственной функции

так потихоньку переходим к созданию CMS с разделением модулей согласно схемы  MVC: сначала обрабатываются все модели, наполняя $DATA_FOR_TEMPLATE, потом выполняются код формирования представлений. 
Цитата(Fortop @  2.8.2008,  02:13 Найти цитируемый пост)
Вызов или include всех представлений инкапсулируй в одной единственной функции

"всех" - это значит "всех", или "для каждого"? второе логичнее, потому как позволяет просто реализовать кеширование.
в любом случае, необходима система кеширования. тем более, если $DATA_FOR_TEMPLATE неизменен, то обращение к одному и тому же представлению должно возвращать одни и те же данные(если содержимое детерменизировано). так мы наворотим тот же "шаблонизатор", но только на РНР + вызов специализированных функций. Как минимум, по сложности это не будет отличаться от спецвставок в HTML в том же СМАРТИ. Потому, как на меня, вариант с РНР ничем не лучше. В принципе, и не хуже. Разве что вопрос ограничений, о которых мы с тобой уже страницу говорим, в одном случае - вопрос договоренности, в другом - данность.
PM MAIL   Вверх
Fortop
Дата 2.8.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(skyboy @  2.8.2008,  12:37 Найти цитируемый пост)
сначала обрабатываются все модели, наполняя $DATA_FOR_TEMPLATE, потом выполняются код формирования представлений.

Это самый разумный вариант. Можешь предложить что-то лучшее?

Цитата(skyboy @  2.8.2008,  12:37 Найти цитируемый пост)
или "для каждого"

Конечно для каждого. Функция может быть универсальной.
Всех сразу - не выгодно smile

Цитата(skyboy @  2.8.2008,  12:37 Найти цитируемый пост)
(если содержимое детерменизировано).

Не совсем так, оно детерменизировано в данном текущем вызове. Кто-то обещал, что оно будет таким же при следующем вызове?

Цитата(skyboy @  2.8.2008,  12:37 Найти цитируемый пост)
Как минимум, по сложности это не будет отличаться от спецвставок в HTML в том же СМАРТИ. Потому, как на меня, вариант с РНР ничем не лучше. В принципе, и не хуже.

Бритва Оккама - не плодите сущностей сверх необходимого...
Еще один язык поверх PHP - на мой взгляд, пока это неразумно.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 2.8.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(Fortop @  2.8.2008,  12:17 Найти цитируемый пост)
Не совсем так, оно детерменизировано в данном текущем вызове. 

т.е. представление от вызова к вызову при неизменных входящих данных не может иметь другой вид? к примеру, случайная фотография должна подсвечиваться на стороне модели? точнее, подсветка должна стать частью модели...
а почему ж не возложить этот выбор случайного элемента на представление?
Цитата(Fortop @  2.8.2008,  12:17 Найти цитируемый пост)
Еще один язык поверх PHP - на мой взгляд, пока это неразумно.

речь только о том, что другой, отличный от РНР синтаксис?
или о том, что CMS по модели MVC вносит свою структуру функци/объектов/классов и свою логику - забыли? или эти сущности под бритву Оккакма не попадают?  smile

Добавлено через 4 минуты и 22 секунды
Цитата(Fortop @  2.8.2008,  12:17 Найти цитируемый пост)
Это самый разумный вариант. Можешь предложить что-то лучшее?

нет. предлагаемый механизм просто все ближе к шаблонизатору. только и того, что синтаксис отличается. логика работы(наполни модель, потом формируй представление) одна и та же, функциональность(циклы, условия - базовая логика в представлении) схожа. единственная претензия - другой подход к синтаксису(html + smarty vs. php + html). так? даже претензию на более высокий уровень абстракции я снимаю: CMS вполне в состоянии предоставить необходимое абстрагирование. итак, считаю, что шаблониазтор ничем не лучше CMS. но и не хуже. и не быстре, не медленнее в общем случае.
PM MAIL   Вверх
Fortop
Дата 2.8.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(skyboy @  2.8.2008,  14:28 Найти цитируемый пост)
т.е. представление от вызова к вызову при неизменных входящих данных не может иметь другой вид? к примеру, случайная фотография должна подсвечиваться на стороне модели? точнее, подсветка должна стать частью модели...
а почему ж не возложить этот выбор случайного элемента на представление?

Подсветка - часть представления.
Выбор случайного элемента - часть модели.
Я так считаю. 

Модель/Контроллер определяет, что выводить. Представление - как выводить.

Цитата(skyboy @  2.8.2008,  14:28 Найти цитируемый пост)
речь только о том, что другой, отличный от РНР синтаксис?

Совершенно верно.

Вот смотри, сейчас для нормальной работы нужно знать 4 вещи

SQL, PHP, HTML, JS. (можно обойтись без последнего, но сейчас не модно, да и впрочем не нужно обходиться).

Ты предлагаешь добавить 5й элемент. Псевдоязык дополнительной разметки.
Мне это не нравится потому что у нас уже есть 2!!! динамических скриптовых языка, которые полностью покрывают все область которую можно предумать для этого псевдоязыка.

Я понимаю, была бы логика, если бы программа была на чем-то строгом и тяжелом в виде Java, C/C++ - Тогда да смысл упростить и облегчить есть (ввести легковесный динамический скрипт для логики разметки, хотя чем не угодил в таком случае XSL?)... В нашем же случае - не вижу смысла.

Цитата(skyboy @  2.8.2008,  14:28 Найти цитируемый пост)
предлагаемый механизм просто все ближе к шаблонизатору

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

Добавлено через 2 минуты и 41 секунду
Цитата(Fortop @  2.8.2008,  15:18 Найти цитируемый пост)
Модель/Контроллер определяет, что выводить. Представление - как выводить.

Вообще-то,
тут может быть ситуация размазанности функций Контроллера.

Когда Модель будет представлять не только коннект к данным, но и существенную часть логики.
Это то, что я хочу сейчас реализовать - мета-модель с включенной бизнеслогикой, которая будет объединять в себя более мелкие и простые аксессоры к данным.

а представление тоже может распадаться на два уровня.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 2.8.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(Fortop @  2.8.2008,  14:18 Найти цитируемый пост)
SQL, PHP, HTML, JS. (можно обойтись без последнего, но сейчас не модно, да и впрочем не нужно обходиться).

ога. какие программисты бедные и несчастные smile
т.е. если потребуется использовать mathML или SVG - люди начнут падать в обморок?
я тут вижу: два императивных языка(php и js), причем один на стороне клиента, другой на стороне сервера; один - декларативный(sql) и один язік разметки(догадйтесь сами). дополнительный язык разметки при наличии справочника по основным конструкциям не должны смутить при любом раскладе. так же, как не должен вызвать конвульсий переход на VBScript или Perl. Да, другой синтаксис. Некоторые(совсем некоторые) вещи сделаны по-другому. но подход к программированию тот же. только синтаксис другой.

Это сообщение отредактировал(а) skyboy - 2.8.2008, 22:39
PM MAIL   Вверх
Страницы: (13) [Все] 1 2 3 ... Последняя »
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.5599 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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