MVC. Генерация html страницы шаблонизатором и блоков (или собирание всех данных для этого)?

Схема запроса простая:
1. Пользователь совершает запрос /news/1/
2. роутер определяет контроллер и метод который надо вызвать изходя из запроса (контроллер news метод show)
3. котнроллер вызывает модель , которая получает данные по новости №1
до этого момента все прекрасно (тут можно отдать данные шаблонизатору и вставить их в страницу, отдать пользователю)

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

Я же представляю себе всю модель и работу "движка" так, что все данные для прорисовки страницы уже должны быть у меня в одном месте, которые я передам шаблону.
В этом случае я должен знать заранее какие блоки будут на странице, но не знаю откуда я буду это знать?
  • Вопрос задан
  • 4196 просмотров
Решения вопроса 1
@Masterme
при задании конфигурации роута ты ставишь жёсткое соответствие, например,
"/news/:id" -> контроллер = news, метод = item
таким способом можно получить данные и отрендерить только один хтмл-блок. в то же время по условиям задачи нужно рендерить несколько блоков. выход? а вот:
"/news/:id" -> {
'main' -> controller = news, method = item,
'last_news' -> controller = news, method = last_items,
'now_logged_users' -> controller = users, method = last_logged,
}
и так далее. и в шаблоне отмечаешь блоки 'main', 'last_news', 'now_logged_users'. и каждый блок рендеришь отдельно, а потом вставляешь в шаблон. блоки получаются равноправны и независимы. понятно, что можно назначить какой-то блок по умолчанию, но работать он будет так же - на равных с другими блоками условиях. такая работа с блоками должна быть предусмотрена на уровне роутинга, и если движок это не позволяет - то он говно. есть пхпшная CMS MODx, попробуй её и посмотри, как в ней организованы сниппеты. сама modx может не годится для хай-енд разработки, но в ней правильная идея работы со структурой страниц и вставкой контента в страницы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
ruFelix
@ruFelix
Предсказание будущего по руке, таро, кофе.
Вам надо определиться у вас конкретный метод контролера отвечает за только за вывод блока или за вывод страницы. Если первое то делайте как говорит @Masterme , если второе то разгуливайте всё в контролере.
Ответ написан
Комментировать
Webdesus
@Webdesus
Что мешает в конроле новостей вызвать методы других контролов для получения дополнительной инфы?
Ответ написан
kirillplatonov
@kirillplatonov
Ruby on Rails developer
Создайте для отдельных блоков с узкими задачами "облако тегов", "последние комментарии" и тп отдельную сущность - виджеты. В них выносите логику, и представления этих блоков. Эти блоки вы будете вставлять в представления, например <?php echo $widget->render('tags'); ?>
Ответ написан
dim4ik
@dim4ik Автор вопроса
@Webdesus @Masterme @ruFelix @BloodyHistory
Вопрос по поводу контроллера на примере новостей.

Поясните, что является результатом работы котнроллера в этом случае
массив $data, var_dump которого покажет нам все данные относящиеся к странице новости
или же уже готовая страница?

Хочу поступить следующим образом при формировании страницы новости:
1. контроллер запросил у модели данные, провел все проверки, на выходе получили массив $data для Представления (шаблона) и название шаблона для страницы (или оно внутри $data, возможно еще будет указан формат ответа "html" или "json" для предстваления)
2. Представление (View) получил данные страницы и название шаблона ( тут либо вставил эти данные в шаблон, либо ждем проверки на блоки для вставки все данных сразу вместе с блочными)
3. Теперь ищем блоки и находим блок "комментарии"
4. запускаем контроллер блока, в ответ получаем (данные или html)
5. На этом этапе у нас либо
а) массив $data всех всех переменных для отрисовки страницы
б) либо массив html блоков
6. вставляем их в шаблон

Посоветуйте, пожалуйста, решение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы