共享symfony基本控制器的所有视图中的常见内容

问题描述:

我正在使用ezplatform并试图弄清楚如何自动将常见cms内容共享到所有页面,而无需为每个视图编写单独的控制器。共享symfony基本控制器的所有视图中的常见内容

这是从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); 

正如你可以看到,我们简单地合并原PARAMS一些常见的数据,所有网页需要。该数据用于“maga navi”和页脚内容。

现在的问题是,当我们尝试加载一个页面article_one_column, 因为这是不使用自定义控制器,因此它不会加载公共数据 页眉和页脚这导致树枝错误需要。

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

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

使用自定义控制器的一个选项,要注入你也可以使用https://doc.ez.no/display/DEVELOPER/Injecting+parameters+in+content+views

我们已经捆绑这个概念一般的东西(其它这里之中:https://github.com/Novactive/NovaeZExtraBundle)与ChildrenProvider的概念。

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

对于孩子们,我喜欢用听众而不是自定义控制器。 它在Novactive包中管理,但要小心,如果你自己做,pre_content_view侦听器将在每个视图上触发(行,全等等)。通常,你只想在视图中注入全部东西。

+1

作为任何人发现这一点的说明。如果你打算使用自定义控制器,并且也希望使用这个预渲染事件(这很棒)。请注意,您的自定义控制器(如果它只是调用std渲染)不会自动触发此事件,您必须手动调用它。从ez的心脏渲染的std视图确实会触发事件......如果有一个简单的方法调用来从控制器执行简单渲染时触发所有std事件,将会很酷...... – John