Духовность™
Продвинутый новичок
Проектирую систему. Давайте подумаем
Решил я написать систему, основанную на компонентном подходе. Что бы долго не рассказывать, я приведу пример активного шаблона, описание которого говорит само за себя:
Как происходит формирование страницы:
1. Главное приложение определяет по URL имя активного шаблона, пример которого приведен выше.
2. Шаблон читается, находится содержимое меток {...}
3. Главное приложение поочередно делает вызовы контроллеров, которые описаны в метках {...}, в контроллерах инициализируется представление, которое наполняется результатом работы контроллера.
4. После того, как все контроллеры отработали, главное приложение заменяет содержимое меток {...} на сгенерированный представлением каждого контроллера html-код. Примерно так:
В целом, я думаю, подобная практика позволит создавать независимые контроллеры-компоненты, которые можно будет инициализировать в любых шаблонах и при этом обеспечить полную независимость одного компонента от другого.
Но есть проблема. Я не знаю, как сделать так, что бы один контроллер мог бы получать данные из другого контроллера?
Как пример - как мне добавить в title строку, сгенеированную в контроллере news::view (по примеру приведенного активного шаблона)? Подразумевается, что для title будет свой контроллер:
Решил я написать систему, основанную на компонентном подходе. Что бы долго не рассказывать, я приведу пример активного шаблона, описание которого говорит само за себя:
Код:
<html>
<head>
</head><body>
<div id="wrapper">
{[b]module[/b]=news&[b]controller[/b]=view&[b]template[/b]=view&[b]stdin[/b][limit]=10}
</div>
<hr>
<table width="100">
<tr>
<td>
{[b]module[/b]=articles&[b]controller[/b]=list&[b]template[/b]=bottom_news_list}
</td>
<td>
{[b]module[/b]=comments&[b]controller[/b]=list&[b]template[/b]=bottom_comments_list}
</td>
</tr>
</table>
</body></html>
1. Главное приложение определяет по URL имя активного шаблона, пример которого приведен выше.
2. Шаблон читается, находится содержимое меток {...}
3. Главное приложение поочередно делает вызовы контроллеров, которые описаны в метках {...}, в контроллерах инициализируется представление, которое наполняется результатом работы контроллера.
4. После того, как все контроллеры отработали, главное приложение заменяет содержимое меток {...} на сгенерированный представлением каждого контроллера html-код. Примерно так:
PHP:
// ищем содержимое меток
preg_match_all('~{([^{]+)}~i', $active_template, $matches);
// стек видов, полученных из контроллеров
$view_stack = array();
foreach ($matches[1] as $str)
{
$params = array();
// парсим содержимое меток {...}
parse_str($str, $params);
// определяем имя контроллера
$controller_class_name = ....;
$controller = new $controller_class_name($params);
$controller->run();
// получаем вид
$view = $controller->getView();
// исполняем вид
$view->run();
// помещаем в стек.....
$view_stack[...] = $view->getOut(); // или можно $view_stack[...] = $view;
}
Но есть проблема. Я не знаю, как сделать так, что бы один контроллер мог бы получать данные из другого контроллера?
Как пример - как мне добавить в title строку, сгенеированную в контроллере news::view (по примеру приведенного активного шаблона)? Подразумевается, что для title будет свой контроллер:
Код:
{module=htmltitle&controller=main&template=main}