来自共享 symfony 基本控制器的所有视图中的公共内容
Common content in all views from a shared symfony base controller
我正在使用 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
页面时,
因为这没有使用自定义控制器,所以它不会加载公共数据
页眉和页脚需要,这会导致树枝错误。
问题:
我们如何在不为每种数据类型编写自定义控制器的情况下向所有路由传递通用内容?
您不必为每个内容类型创建一个控制器。如果可以的话,您想要的是将数据注入视图。
使用自定义控制器是一种选择,对于您想注入的通用内容,您也可以使用 https://doc.ez.no/display/DEVELOPER/Injecting+parameters+in+content+views
我们已将此概念(以及此处的其他概念:https://github.com/Novactive/NovaeZExtraBundle)与 ChildrenProvider 的概念捆绑在一起。
此外,您提到您想要在视图中注入与页眉和页脚相关的信息,以便将它们放入布局中。听起来很奇怪。使用 eZ 以及 Symfony,您可以从视图渲染控制器,它们可以独立于视图渲染页眉和渲染页脚。 (这可能是你应该做的)
不过,对于 children,我喜欢使用侦听器而不是自定义控制器。
它在 Novactive 包中管理,但如果你自己做的话要小心,pre_content_view 监听器将在每个视图(行、完整等)上触发。通常,你想在视图中注入东西仅完整。
我正在使用 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
页面时,
因为这没有使用自定义控制器,所以它不会加载公共数据
页眉和页脚需要,这会导致树枝错误。
问题: 我们如何在不为每种数据类型编写自定义控制器的情况下向所有路由传递通用内容?
您不必为每个内容类型创建一个控制器。如果可以的话,您想要的是将数据注入视图。
使用自定义控制器是一种选择,对于您想注入的通用内容,您也可以使用 https://doc.ez.no/display/DEVELOPER/Injecting+parameters+in+content+views
我们已将此概念(以及此处的其他概念:https://github.com/Novactive/NovaeZExtraBundle)与 ChildrenProvider 的概念捆绑在一起。
此外,您提到您想要在视图中注入与页眉和页脚相关的信息,以便将它们放入布局中。听起来很奇怪。使用 eZ 以及 Symfony,您可以从视图渲染控制器,它们可以独立于视图渲染页眉和渲染页脚。 (这可能是你应该做的)
不过,对于 children,我喜欢使用侦听器而不是自定义控制器。 它在 Novactive 包中管理,但如果你自己做的话要小心,pre_content_view 监听器将在每个视图(行、完整等)上触发。通常,你想在视图中注入东西仅完整。