2017-07-07 4 views
1

J'utilise ezplatform et j'essaie de comprendre comment partager automatiquement le contenu commun de cms sur toutes les pages sans écrire de contrôleur séparé pour chaque vue.Contenu commun dans toutes les vues d'un contrôleur de base symfony partagé

Ceci est un simple extrait du fichier 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" 

Ce sont trois matchs simples pour y propres contrôleurs personnalisés, à l'exception du dernier.

Les deux premières correspondances touchent un contrôleur qui étend un contrôleur de base. Dans le contrôleur de base, nous avons un rendu standard fonction qui est appelée comme ceci:

return $this->render(
    'full/article_container.html.twig', 
    [ 
     'location'   => $location, 
     'content'   => $currentContent, 
     'articles'   => $articles, 
     'articleLocations' => $locations, 
    ] 
); 

Le dit rend la fonction ressemble à ceci:

$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); 

Comme vous pouvez le voir, nous fusionnons simplement les params d'origine avec certaines données communes dont toutes les pages ont besoin. Ces données sont utilisées pour le "maga navi" et le contenu du pied de page.

Le problème est maintenant que lorsque nous essayons de charger une page article_one_column, car cela n'utilise pas un contrôleur personnalisé, il ne donc charge pas les données communes nécessaires à l'en-tête et pied de page qui se traduit par une erreur de brindille.

QUESTION: Comment pouvons-nous fournir un contenu commun à toutes les routes sans écrire un contrôleur personnalisé pour chaque type de données?

Répondre

2

Vous n'avez pas besoin de créer un contrôleur pour chaque type de contenu. Ce que vous voulez, si je peux, est d'injecter des données dans la vue.

L'utilisation d'un contrôleur personnalisé est l'une des options, pour des trucs génériques que vous voulez injecter, vous pouvez également utiliser https://doc.ez.no/display/DEVELOPER/Injecting+parameters+in+content+views

Nous avons fourni ce concept (entre autres ici: https://github.com/Novactive/NovaeZExtraBundle) avec un concept de ChildrenProvider.

De plus, vous avez mentionné que vous vouliez injecter des informations relatives à l'en-tête et au pied de page dans la vue pour les inclure dans la présentation. Cela a l'air bizarre. Avec eZ mais aussi avec Symfony, vous pouvez rendre un contrôleur à partir d'une vue, vous pouvez ainsi rendre l'en-tête et rendre le pied de page indépendamment de la vue. (c'est probablement ce que vous devriez faire)

Pour les enfants cependant, j'aime utiliser l'écouteur au lieu du contrôleur personnalisé. Il est géré dans le bundle Novactive mais attention si vous le faites vous-même, l'écouteur pre_content_view se déclenchera sur chaque vue (ligne, plein, etc ..) Et généralement, vous voulez injecter des choses dans la vue uniquement.

+1

Comme note pour n'importe qui trouvant ceci. Si vous avez l'intention d'utiliser des contrôleurs personnalisés et souhaitez également utiliser cet événement pré-rendu (ce qui est génial). Sachez que votre contrôleur personnalisé (s'il appelle simplement le rendu std) ne déclenche pas automatiquement cet événement et vous devez l'appeler manuellement. Le rendu de vue Std du coeur d'ez bien sûr déclenche l'événement ... serait cool s'il y avait une méthode simple à appeler pour déclencher tous les événements std lors d'un rendu simple à partir d'un contrôleur ... – John