2 votes

Faire en sorte que le contrôleur ne donne qu'une valeur au modèle, sans le rendre - Symfony2

J'ai un modèle twig avec la barre de navigation et tous les autres modèles (les pages) incluent ce modèle. J'ai une valeur dans ce modèle qui doit être égale à toutes les pages. Comment définir cette valeur ?

J'essaie quelque chose comme ça dans un contrôleur :

public function setNotificationsAction() {
    $this->setNotifications();
    return $this->render('AcmeMyBundle::navbar.html.twig', array(
        'debts' => $this->notifications,
    ));
}

et ensuite ceci dans le modèle :

<span class="badge badge-important">
    {% render(controller('AcmeMyBundle:DebtsLoansController:setNotifications')) %}
    {{ debts }}
</span>

Le résultat que je veux est le suivant :

<span class="badge badge-important">
    3
</span>

mais le numéro devrait être différent et le contrôleur devrait le dire.

J'ai également essayé de créer une fonction qui renvoie la valeur et de l'appeler de la manière décrite ci-dessus.

J'ai également essayé cette syntaxe

{{ render(controller('AcmeMyBundle:DebtsLoansController:setNotifications')) }}

mais ça ne marche pas non plus.

J'obtiens l'erreur suivante :

The function "controller" does not exist in AcmeMyBundle::navbar.html.twig at line 6

Avez-vous une idée de la façon d'y parvenir sans avoir à modifier chaque contrôleur et chaque modèle :S Merci beaucoup par avance !

3voto

Wouter J Points 16327

Eh bien, je vous suggère de créer votre propre extension Twig. Quelque chose autour des lignes de :

<span class="badge">
    {{ acme_notifications() }}
</span>

namespace Acme\DemoBundle\Twig\AcmeDemoExtension

class AcmeDemoExtension extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            'acme_notifications' => new \Twig_Function_Method($this, 'getNotifications');
        );
    }

    public function getNotifications()
    {
        $notifications = ...;

        return $notifications;
    }
}

Pour en savoir plus sur la création de votre propre extension Twig, consultez le site suivant la documentation de Symfony2 .

2voto

i.am.michiel Points 5085

Vous n'avez pas besoin de la partie contrôleur :

{% render "AcmeBundle:MyController:MyAction" %}

Sachez toutefois qu'un render est une requête complètement nouvelle qui traverse tout le cycle de vie de Symfony et peut donc avoir un impact sur les performances si vous en abusez.

Edit : Et comme @Wouter J l'a souligné : avant Symfony 2.2, utilisez la notation ci-dessus. Après Symfony 2.2, il faut utiliser la notation suivante :

{{ render(controller('AcmeArticleBundle:Article:recentArticles', { 'max': 3 })) }}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X