Общий контент во всех представлениях с общего базового контроллера Symfony
Я использую ezplatform и пытаюсь выяснить, как автоматически обмениваться общим контентом cms со всеми страницами без написания отдельного контроллера для каждого представления.
Это простая выдержка из файла yml:
root_folder:
controller: "AppBundle:Homepage:homepage"
match:
Id\Location: 58
article_container:
controller: "AppBundle:ArticleContainer:articleContainerChildren"
match:
Identifier\ContentType: "article_container"
article_one_column:
template: "full/article_one_column.html.twig"
match:
Identifier\ContentType: "article_one_column"
Это три простых совпадения с собственными контроллерами, за исключением последнего.
Первые два совпадения поражают контроллер, который расширяет базовый контроллер. Внутри базового контроллера у нас есть стандартная функция рендеринга, которая вызывается так:
return $this->render(
'full/article_container.html.twig',
[
'location' => $location,
'content' => $currentContent,
'articles' => $articles,
'articleLocations' => $locations,
]
);
Указанная функция рендеринга выглядит так:
$parameters = array_merge($parameters, [
'main_navi' => $navigation,
'mega_navi_data' => $navigation,
'quotes' => $contentRenderer->getQuotesData(),
'featured_articles' => $contentRenderer->getFeaturedArticles(),
'contact_form' => $this->getContactForm(),
]);
return parent::render($view, $parameters, $response);
Как видите, мы просто объединяем исходные параметры с некоторыми общими данными, которые нужны всем страницам. Эти данные используются для "maga navi" и содержимого нижнего колонтитула.
Проблема в том, что когда мы пытаемся загрузить article_one_column
страница, поскольку он не использует пользовательский контроллер, поэтому он не загружает общие данные, необходимые для верхнего и нижнего колонтитула, что приводит к ошибке ветки.
ВОПРОС: Как мы можем доставить общий контент на все маршруты без написания настраиваемого контроллера для каждого типа данных?
1 ответ
Вам не нужно создавать контроллер для каждого типа контента. То, что вы хотите, если я могу, это ввести данные в представление.
Использование настраиваемого контроллера является одним из вариантов, для общих вещей, которые вы хотите внедрить, вы также можете использовать https://doc.ez.no/display/DEVELOPER/Injecting+parameters+in+content+views
Мы объединили эту концепцию (среди прочего здесь: https://github.com/Novactive/NovaeZExtraBundle) с концепцией ChildrenProvider.
Кроме того, вы упомянули, что хотите ввести информацию, связанную с верхним и нижним колонтитулом, чтобы получить их в макете. Это звучит странно. С eZ, но также и с Symfony вы можете визуализировать контроллер из представления, а вы можете визуализировать верхний и нижний колонтитулы независимо от представления. (это, вероятно, то, что вы должны сделать)
Для детей я предпочитаю использовать слушателя вместо пользовательского контроллера. Он управляется в пакете Novactive, но будьте осторожны, если вы сделаете это самостоятельно, прослушиватель pre_content_view сработает при каждом просмотре (строка, заполнение и т. Д.). Как правило, вы хотите внедрить материал только в представлении full.