1

我正在使用 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页面时,由于它没有使用自定义控制器,因此它不会加载页眉和页脚所需的公共数据,这会导致 twig 错误。

问题: 我们如何在不为每种数据类型编写自定义控制器的情况下向所有路由提供通用内容?

4

1 回答 1

2

您不必为每个内容类型创建控制器。如果可以的话,您想要的是将数据注入视图。

使用自定义控制器是选项之一,对于您想要注入的通用内容,您也可以使用https://doc.ez.no/display/DEVELOPER/Injecting+parameters+in+content+views

我们已经将这个概念(其中包括:https ://github.com/Novactive/NovaeZExtraBundle )与 ChildrenProvider 的概念捆绑在一起。

此外,您提到您想在视图中注入与页眉和页脚相关的信息,以便将它们放入布局中。听起来很奇怪。使用 eZ 和 Symfony,您可以从视图中渲染控制器,您可以独立于视图渲染页眉和页脚。(这可能是你应该做的)

不过对于孩子们,我喜欢使用监听器而不是自定义控制器。它在 Novactive 捆绑包中进行管理,但如果您自己执行此操作请小心,pre_content_view 侦听器将在每个视图(行、完整等)上触发。通常,您只想在完整视图中注入内容。

于 2017-07-07T23:29:29.233 回答