И снова шаблонизатор.

CRL

Новичок
И снова шаблонизатор.

Проектирую шаблонизатор.
Общее описание:
===============
1) Шаблон пассивен
2) Весь механизм визуального отображения разделен на основной шаблон и шаблоны модулей
2) Основной шаблон имеет в основе XHTML:
Пример:
=======
PHP:
	<?xml version="1.0" encoding="UTF-8"?>
	<html>
		<head>
			<title>
				<module name="title" out="page_id" />
			</title>
			<link rel="stylesheet" type="text/css" href="/styles/main.css">
		</head>
		<body>
			<table>
				<tr>
					<td>
						<module name="news" count="10" title="on" />
					</td>
					<td>
						<module name="content" />
					</td>
				</tr>
			</table>
		</body>
	</html>
Вызов модуля осуществляется через тег <module ... /> с обязательным атрибутом name.

3) Шаблоны модулей имеют в основе XHTML с плейсхолдерами
Например:
=========

News.xml
PHP:
	<div id="task_name">
		[+task_name+]
	</div>
	<hr />
	<br />
	<div id="news_title">
		[+news_title+]
	</div>
	<div id="news_body">
		[+news_body+]
	</div>
4) Модель - это класс, методы которого соответствуют модулям основного шаблона.
5) Контроллер - класс-потомок Модели; в нем описан парсер шаблонов, работа с файлом конфигурации и вызов механизма отражения.

Предполагаемый принцип работы:
==============================
1) Контроллер загружает XHTML общего шаблона и находит в нем все теги <module ... /> (используется DOM).
2) Контроллер создает отражение самого себя и получает доступ к методам родителя - Модели.
3) Контроллер ищет среди доступных методов Модели метод, имеющий название, соответствующее значению атрибута name текущего обрабатываемого тега <module ... />
4) Если метод обнаружен, создается его отражение и определяются параметры, которые он принимает. Если параметры, переданные через <module ... /> соответствуют или не противоречат параметрам модуля, производится вызов этого метода-модуля с передаными параметрами, в противном случае генерируется соответствующее сообщение об ошибке. При выполнении метода-модуля, он подгружает соответствующий ему шаблон, заменяет плейсхолдеры на необходимые фактические значения, и на основании этого генерируется результат.
5) Результатом работы модуля или сообщением об ошибке Контроллер заменяет соответствующий тег <module ... /> в dom-документе, созданном из основного шаблона.
6) Вывод документа в браузер.

Теперь, собственно, к вопросам:
===============================
1) В данном случае, шаблоны не содержат никаких "программерских" конструкций и кажутся мне достаточно очевидными для верстальщика. Так же достаточно очевидным кажется мне и взаимодействие между программистом и верстальщиком - первый просто передает второму описание API: формат вызова модуля в общем виде, перечень модулей и принимаемых ими параметров. Однако, как же упростить работу самим програмистам, если предположить, что над проектом работает несколько разработчиков? Модули-методы Модели не являются атомарными, их нельзя рассматривать отдельно от Модели - это следует хотя бы из того, что методы Модели могут обращаться к свойствам Модели или взаимодействовать друг с другом, потому каждый разработчик должен иметь актуальную копию класса Модели, что не есть гут. И как это побороть, я пока не знаю.

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

3) Вполне вероятно, что сам принцип или его предполагаемая реализация имеют еще какие-то изъяны, которых я не вижу, поэтому очень надеюсь на адекватную критику.
 

CRL

Новичок
Автор оригинала: triumvirat
а как в этом шаблоне логика представления осуществляется?
Пожалуйста, поясните, что именно вы имеете в виду?
Управление отображением осуществляется дизайнером путем определения у тега <module ... /> корректный атрибутов (напрмер, <module name="news" count="10" order="desc">) и прямым редактированием шаблона модуля.
 

Фанат

oncle terrible
Команда форума
triumvirat
<module name="news" count="10" title="on" />
то есть, путем вынесения отдельных блоков в отдельные файлы.
работал я когда-то с таким.
думаю, диарея у автора после моих пожеланий до сих пор не проходит.
 

CRL

Новичок
Автор оригинала: *****
то есть, путем вынесения отдельных блоков в отдельные файлы.
работал я когда-то с таким.
думаю, диарея у автора после моих пожеланий до сих пор не проходит.
А в чем, собственно, недостаток вынесения шаблонов модулей в отдельные файлы?
 

Духовность™

Продвинутый новичок
Пожалуйста, поясните, что именно вы имеете в виду?
PHP:
<? 
// генерируем контент
$var = TRUE;
?>
шаблон:
PHP:
<? if ($var) : ?>
    <b>Истина</b>
<? else: ?>
    <i>Ложь</i>
<? endif; ?>
как это будет выглядеть в Вашем случае?
 

CRL

Новичок
Автор оригинала: triumvirat
PHP:
<? 
// генерируем контент
$var = TRUE;
?>
шаблон:
PHP:
<? if ($var) : ?>
    <b>Истина</b>
<? else: ?>
    <i>Ложь</i>
<? endif; ?>
как это будет выглядеть в Вашем случае?
В этом примере Вы передаёте шаблону часть бизнес-логики, а она должна оставаться - как я считаю - в ведении Контроллера. Поэтому, в моём случае, аналогичная описанной Вами ситуация может возникнуть только в Контроллере. Соответственно, будет полностью аналогичная проверка условия в специальном методе Контроллера, который и станет обработчиком всех подобных ситуаций:

PHP:
class control
{
         ...
            
            function url_handler()
            {
                   if(!empty($_REQUEST["var"]))
                   {
                          switch($_REQUEST["var"])
                          {
                                       case "true":
                                       {
                                            $this->что-то_1;
                                            ...
                                       }
                                       break;
                                       default :
                                       {
                                             $this->что-то_2;
                                             ...
                                       }
                                       break;
                          }
                     ...
                   }
                 ...
            }
         ...
}
 

CRL

Новичок
Автор оригинала: triumvirat
каких ситуаций? Вы что, на каждое подобное условие контроллер писать собрались?

Я нифига не понял.
Поясняю свою мысль. Весь движок - грубо - состоит из папки с шаблонами, 2 классов - Контроллера и Модели и индексного файла, в котором создается экземпляр контроллера. Все запросы проходят через него, поэтому он должен уметь парсировать основной шаблон, создавать отражения и обрабаотывать все POST\GET запросы. Одна ипостась Контроллера отвечает за все функции связанные с обработкой параметров, переданных через тег <module ... />, другая - за функции переданные через окружение - это и есть обработчик запросов. Вернемся к вашему примеру:

Автор оригинала: triumvirat

<?
// генерируем контент
$var = TRUE;
?>


шаблон:

<? if ($var) : ?>
<b>Истина</b>
<? else: ?>
<i>Ложь</i>
<? endif; ?>
При каждом конкретном состоянии загруженной станицы на ней отображается либо Ложь, либо Истина. Разница между тем, что предложили Вы и тем, о чем говорю я в том, что в Вашем случае случае механику выбора видно, а в моём - нет, она сокрыта в специальном методе Контроллера, который принимает часть параметров из тега <module ... />, а часть из окружения - при переходе по ссылкам, при принятии данных форм. Сами же ссылки и формы, которые генерируют эту вторую часть параметров, сгенерированы Контроллером из шаблонов.

Пример: при первом запуске Контроллер генерит из шаблона страницу и выдает её в браузер, на странице есть ссылка, которая ссылается на тот же самый index.php, в котором создается экземпляр Контроллера, но сейчас Контроллер обрабатывает еще и то, что пришло с GETом ссылки и снова генерит страницу, уже другую, с другими элементами управления, и т.д.

Пока всё это - только концепция, голая и беззащитная. Я рассказал Вам, как устроен мой паровоз, теперь мне важно понять, поедет ли он без помощи лошадей.
 

korchasa

LIMB infected
Автор оригинала: CRL
...
Пока всё это - только концепция, голая и беззащитная. Я рассказал Вам, как устроен мой паровоз, теперь мне важно понять, поедет ли он без помощи лошадей.
Возьми любую, более менее сложную страницу (например, из социалки) и посмотри во что у тебя превратится контроллер.
 

fixxxer

К.О.
Партнер клуба
CRL
кажется, ты путаешь бизнес-логику и логику представления.

никто не настаивает, что логика представления должна находиться прямо в шаблоне - но это область ответственности view а не controller.

простой пример логики представления - вывод в 2 колонки.
 

CRL

Новичок
Автор оригинала: fixxxer
никто не настаивает, что логика представления должна находиться прямо в шаблоне - но это область ответственности view а не controller.
Я был бы рад вынести логику представления во view, потому как иначе метод-менеджер запросов Контроллера превратится в помойку, но я не представляю, как это сделать. И как будет выглядеть сам view.
 

Фанат

oncle terrible
Команда форума
CRL, тем, что это у тебя не модуль, а блок.
а блоков на странице могут быть десятки.
вот этим и плохо.
 
Сверху