我正在使用ezplatform并试图弄清楚如何自动将常见的cms内容共享到所有页面,而无需为每个视图编写单独的控制器。
这是 yml 文件的简单摘录:
root_folder:
controller: "AppBundle:Homepage:homepage"
match:
IdLocation: 58
article_container:
controller: "AppBundle:ArticleContainer:articleContainerChildren"
match:
IdentifierContentType: "article_container"
article_one_column:
template: "full/article_one_column.html.twig"
match:
IdentifierContentType: "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 错误的页眉和页脚是必需的。
问:如何在不为每种数据类型编写自定义控制器的情况下向所有路由提供通用内容?
不必为每种内容类型创建控制器。如果可以的话,您想要的是将数据注入视图。
使用自定义控制器是选项之一,对于要注入的通用内容,您也可以使用 https://doc.ez.no/display/DEVELOPER/Injecting+parameters+in+content+views
我们将这个概念(包括其他:https://github.com/Novactive/NovaeZExtraBundle(与儿童提供者的概念捆绑在一起。
此外,您提到要在视图中注入与页眉和页脚相关的信息,以便在布局中获取它们。听起来很奇怪。使用eZ,也只是使用Symfony,您可以从视图渲染控制器,他们可以独立于视图渲染页眉和渲染页脚。(这可能是你应该做的(
不过,对于孩子们,我喜欢使用侦听器而不是自定义控制器。 它在 Novactive 捆绑包中进行管理,但如果您自己执行此操作,请注意,pre_content_view侦听器将在每个视图(行、完整等(上触发。通常,您只想在视图中注入内容。