Проектирую систему. Давайте подумаем

Духовность™

Продвинутый новичок
Проектирую систему. Давайте подумаем

Решил я написать систему, основанную на компонентном подходе. Что бы долго не рассказывать, я приведу пример активного шаблона, описание которого говорит само за себя:

Код:
<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}
 

AmdY

Пью пиво
Команда форума
только это, попробуй прицепить к странице форму логина и отпишись, как реализовал.

сейчас чай допью и расскажу как делаю, а то ещё полусплю.

-~{}~ 15.08.09 16:34:

итак, есть основной контроллер, который вызывается вьюху посаженную на singleton, соответственно другим контроллерам доступны данные из вьюхи, которые как бы глобальные. но есть методы assingBlock и соответственно clearBlock, чтобы чистить. ну и регистри для db, cache и всего того, что ещё захочу.
а для SEO добавил соответствующие методы, так например добавляю данные из менюхи.
PHP:
    $this->_view->setPageHeadTitle(Amdy_Core::locale($menu, 'seotitle'));
            $this->_view->setPageHeadKeywords(Amdy_Core::locale($menu, 'keyword'), true);
            $this->_view->setPageHeadDescription(Amdy_Core::locale($menu, 'description'), true);
 

baev

‹°°¬•
Команда форума
То, что в первом посте описано, очень похоже на битрикс.
 

iceman

говнокодер
а если у страницы будет и фронт-контроллер и активный шаблон?
 

zerkms

TDD infected
Команда форума
triumvirat
Там всё то, что ты описал и реализовано :)
 

Духовность™

Продвинутый новичок
zerkms
ну там много сложного кода! ты на словах расскажи,а? ))

-~{}~ 16.08.09 17:55:

я вот думаю, что нужно ввести какую-то поочередность выполнения контроллеров...
 

zerkms

TDD infected
Команда форума
triumvirat
чо на словах рассказывать? то что ты хочешь - у нас реализовано.
удобно - да, мне очень удобно.
как - тут лучше код сможет рассказать.
 

AmdY

Пью пиво
Команда форума
triumvirat
блин, у тебя же разработчик под боком, поможет разобраться. чё тебя вечно тянет идти по трудному пути. лучше один раз разобраться в сложном проекте, чем самому десять раз изобретать колесо.
 

Beavis

Banned
И всё же было бы очень интересно хотя бы в общих чертах узнать как это реализовано в mzz, не копаясь в коде :)
 

zerkms

TDD infected
Команда форума
triumvirat
прааааааааативный!!1

-~{}~ 17.08.09 01:38:

Beavis
{load ...}

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

Beavis

Banned
Автор оригинала: zerkms
Beavis
{load ...}

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

AmdY

Пью пиво
Команда форума
Автор оригинала: Beavis
И всё же было бы очень интересно хотя бы в общих чертах узнать как это реализовано в mzz, не копаясь в коде :)
вспомнил из одного обсуждения: "читал про орм - не понравилось, прочёл маны по CI и Cake, не тыркнуло, скринкасты по симфони не впечатлили, zend не смотрел, но понял что говно. ща напищу свой мега фремворк с mvc."

у меня тоже как функция смарти, причём сразу встроил кэширование
PHP:
public function _forward($params) {
        if ($cache = $this->_cacheLoad($params)) {
            echo $cache;
            return ;
        }
        // проверки
        if (!empty($params['cache_name'])) {
            ob_start();
            ob_implicit_flush(false);
        }
        $front = new Amdy_Front($params['url']);
        $front->run();
        if (!empty($params['cache_name'])) {
            $result = ob_get_contents();
            ob_end_clean();
            $this->_cacheSave($result, $params);
            echo $result;
        }
    }
 

Духовность™

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

-~{}~ 16.08.09 18:54:

load - функция смарти. по вызову дёргает контроллер и возвращает результаты его работы.
да, понятно.

не понятно, как в один из одного {load ...} передат переменную в другой {load ...}
 

zerkms

TDD infected
Команда форума
triumvirat
ы? считай, что все данные контроллеру должны передаваться в аргументах load. потому как аргументы здесь - это параметры запроса.
более того - у нас при вызове вложенного load создаётся "новое окружение" (точнее так выглядит для контроллера, ничего нового не инстанциируется, конечно). т.е. контроллер не знает как и откуда его запросили - как "главным" контроллером для отображения, или из {load другого контроллера (шаблона).

-~{}~ 17.08.09 02:03:

Beavis
ну впринципе тоже самое как и в первом посте
// ищем содержимое меток
preg_match_all('~{([^{]+)}~i', $active_template, $matches);
пардон, конечно, но тут префильтр (или даже боюсь представить какой ещё изврат), а у меня реализация с функцией.
 

Beavis

Banned
zerkms
Ну в недрах смарти наверное тоже самое и происходит) Это уже детали реализации
 
Сверху