Общий контент во всех представлениях с общего базового контроллера 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.

Другие вопросы по тегам