Шаблонизатор с синтаксисом PHP и наследованием.

Rin

*
С.
Вот точная ссылка http://www.books.ru/books/php-5-604678/lookinside/

Это когда в шаблон проникают элементы биз. логики или наоборот в модель элементы оформления. И никак от этого не избавишься. Пример: отображение отрицательных сумм красным в бухгалтерских проводках.
Ужас. Это грубое нарушение принципов MVC. Что Вам помешало не допустить этого?
 

С.

Продвинутый новичок
это часть шаблона, логики шаблона
Логика шаблона это когда исполняются некоторые действия исключительно вьюшные. В оформительских целях (зебра) или для поддержки HTML (из массива сделать набор <option>ов). То есть шаблон вообще не в курсе, что он рисует и к какой отрасли знаний это отоносится. А вот когда в логике шаблона начинают участвовать некоторые понятия из бизнес логики (отрицательная сумма -> бухгалтерия), то это уже не "логики шаблона", а то самое нарушение MVC.
 

Вурдалак

Продвинутый новичок
С., а если нужно выделять не красным, а подчёркивать? А если вообще не нужно выделять (потому что отдаём XML-документ, к примеру)? Или я тебя не так понял?
 

Rin

*
С.
>Где там Model-View-Component?
Найдите там вхождение "Четвертый способ: компонентный подход 990", само определение в тексте книги.

>А вот когда в логике шаблона начинают участвовать некоторые понятия из бизнес логики (отрицательная сумма -> бухгалтерия), то это уже не "логики шаблона", а то самое нарушение MVC.

Всё с Вами ясно :)
 

Духовность™

Продвинутый новичок
Логика шаблона это когда исполняются некоторые действия исключительно вьюшные. В оформительских целях (зебра) или для поддержки HTML (из массива сделать набор <option>ов). То есть шаблон вообще не в курсе, что он рисует и к какой отрасли знаний это отоносится. А вот когда в логике шаблона начинают участвовать некоторые понятия из бизнес логики (отрицательная сумма -> бухгалтерия), то это уже не "логики шаблона", а то самое нарушение MVC.
бред. чем рисование отрицательных сумм красным отличается от зёбры?
 

Rin

*
Gas
Мне не ясно кто принимает решение о том, что нужно отрендерить какой-то view-шаблон страницы. Например, обычный flow у известных фреймворков - запрос попадает на FrontController, он используя описанные в конфиге route-правила, решает какой контроллер и его метод(action) запустить, action вытягивает из моделей данные, определает шаблон для рендеринга и запускает. Результат работы реднеринга aсtion'а вставляется в layout-шаблон.
Rin, ты мог бы описать кратко как у тебя сделано, мне действительно интересно но не понятно. В твоих примерах описана уже либо последняя страдия (тогда наверное какой-то вышестоящий код есть и он выполняет функции контроллера), либо http запросы попадают напрямую на скрипты с шаблонами, например, при обращении к site/news.php сразу и вызывается news.php, где идёт иннициализация и подтягивание нужных данных (тогда понятно)
Это можно сделать так (с ЧПУ).
Если запрос это файл/папка, то он сразу отдаётся через Nginx, иначе запрос попадает в index.php, который поднимает ядро App, который грузит конфиг config.php:
PHP:
<?php
return array(

	//...

	//таблица начальной маршрутизации
	//в ключах шаблоны запроса (URL), а в значениях запускаемый шаблон относительно папки "/templates"
	//для URL точное соответствие [O(1)], шаблон поиска (wildcard/fnmatch) или рег. выражение (PCRE) [O(n)] определяется автоматически
	'route' => array(

		//страницы веб-сайта (по-умолчанию)
		'http://domain.com/*' => 'default/main.tpl.php',

		//админка
		'http://admin.domain.com/*' => 'adm/main.tpl.php',

		/*CSS
		  * На prod-сервере: рекурсивная замена инструкций @import "*.css" на содержимое файлов (с проверкой на однократное включение), оптимизация (исключая *.min.css) и сжатие;
							 результат кладётся в styles.css и styles.css.gz (это делается только один раз при первом запросе, за это отвечает Nginx)
		  * На dev-сервере:  вывод шаблона без изменений, с сохранением инструкций @import "*.css", чтобы было удобно отлаживать в браузере.
		*/
		'http://static.domain.com/css/styles.css' => 'js/main.tpl.php', 

		/*JS
		  * На prod-сервере: рекурсивная замена инструкций require('*.js') на содержимое файлов (с проверкой на однократное включение), оптимизация (исключая *.min.js) и сжатие;
		  					 результат кладётся в main.js и main.js.gz (это делается только один раз при первом запросе, за это отвечает Nginx)
		  * На dev-сервере:  рекурсивная замена инструкций require('*.js') на содержимое файлов (с проверкой на однократное включение)
		*/
		'http://static.domain.com/js/main.js' => 'css/main.tpl.php',

		//рекламные спецпроеты, для http://www.domain.com/* сделано перенаправление на http://domain.com/* в Nginx
		'~http://([-_a-z\d]+)\.domain\.com/*~siSX' => 'special/$1.tpl.php',
	),
);
Согласно этому route App запускает выполнение активного шаблона, используя App_View::render().
Дальнейшая маршрутизация происходит прямо в шаблонах.
Всё довольно просто, удобно и функционально :)

updated 2011-11-25 14:40
 

MiksIr

miksir@home:~$
Ну заменили контроллер + view одной лапшой во view. Молодец, чего. Даже MVC заговнокодят ;) Про ЧПУ с nginx особо доставило =)
 

С.

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

С.

Продвинутый новичок
Найдите там вхождение "Четвертый способ: компонентный подход 990", само определение в тексте книги.
Этот форум в конце концов увидит определение, что такое "компонентный подход" и его английскую абревиатуру?
 

Gas

может по одной?
Rin
примерно понял, спасибо.
Я не специалист в django, но кажется краем уха слышал что там нет контролелров, а тоже всё отдаётся на view, которое дальше всем заправляет, у кого есть опыт?

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

С.

Продвинутый новичок
Да это логика, но больше логика визуализации чем бизнес правило, по-этому (имхо) уместней её пихать в шаблон.
Логика визуализации не оговаривается в ТЗ. Ни один клиент не будет диктовать в ТЗ какого цвета полосы у зебры и с какой начинать. Это чистый дизайн. Но если в ТЗ, говорится, что у отрицательных суммы убиратеся минус и они выдаютя красным, то это бизнес логика. Заметьте не оговаривается RGB цвета, а вводится такой БИЗНЕС-термин "красное". Он может быть в дизайне на самом деле малиновым, оранжевым или розовым. Если быть совершенно корректным, то надо в шаблон выдавать число и признак "красности". Естественно этим мало кто будет заниматься, гораздо ведь проще проверку в шаблоне сделать.

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

Про "красное" это был ответ на вопрос выше: "Что делает хелперы в модели?". Или модель в хелперах. А вот то самое. Логика визуализации, это одно. А бизнес логика в шаблонах -- совершенно иное и имеющее место быть.
 

Gas

может по одной?
С.
перечитал ещё предыдущую страницу, теперь понял что это был пример на твой посыл. C ним я тоже согласен :) В каждом случае очень тонкая грань куда подобную логику относить, но если она нужна только для во view, то я действительно делаю template helper и не заморачиваюсь, если иногда (даже хоть раз) нужно использовать в контроллере/моделях - то делаю методом модели.
 

Духовность™

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

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

Шаблон - это не нечто тупое. Шаблон знает о том, какие данные приходят и как их нужно выводить. Иначе от шаблонов нет толка.
 
  • Like
Реакции: Rin

Ирокез

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

С.

Продвинутый новичок
А я полагал, что меня наоборот можно упрекнуть в излишней разборчивости и чрезмерном разделении сущностей . Оказывается MVC прост как огурец. Можно просто позавидовать.

Шаблон - это не нечто тупое. Шаблон знает о том, какие данные приходят и как их нужно выводить. Иначе от шаблонов нет толка.
Это твое мнение. Но есть и иное, тоже вполне оправданное.
 

MiksIr

miksir@home:~$
MiksIr

Ещё раз, это не MVC
;) Расскажите лучше, куда запихиваете обновление данных. Тоже из view вызываете сохранение моделей?
А самое главное, в чем профит то? Ну сделали из главного шаблона view эдакий контроллер в перемешку с html, который подключает компоненты и другие view. Фактически MVC и осталось, только ярлыки наклеили другие. К чему это?
 

atv

Новичок
Эммм. Я тут опять со своим XSL :)

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

Если от абстрактности к конкретике, то:
В коде логика по определению отрицательное число или положительное, в зависимости от ... проставляется какой нибудь абстрактный атрибут (дело имеем с ХМЛ).
В шаблоне для каждого абстрактного атрибута есть свой xsl:template.

Итого: если завтра нужно будет отобразить не красным а другим, в шаблоне правится xsl:template, если нужно дополнительно выделить разметкой, опять же правим xsl:template, CSS тоже можно править как угодно, это не скажется на коде.
Однако, если завтра появится ещё один отличительный признак, т.е. их будет уже ДВА, а способов отображения, соответственно ТРИ, то не избежать доработки как кода, так и шаблона. В коде нужно будет добавить ещё одно условие, а в шаблоне нужно будет дописать ещё один xsl:template.

Таким образом поучили - мухи отдельно, котлеты отдельно :)
 
Сверху