Faery
Faery

Reputation: 4650

Make controller only give a value to template, not render it - Symfony2

I have a twig template with the navbar and all other templates (the pages) include this template. I have a value in it which should be equal to all pages. How to set this value?

I tries something like this in a controller:

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

and then this in the template:

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

The result I want it like this:

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

but the number should be different and the controller should tell it.

I also tried to create a function which returns the value and to call it in the way like above.

I also tried this syntax

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

but it isn't working, too.

I get the following mistake:

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

Do you have any idea how to achive this and not to have to edit each controller and each template :S Thanks very much in advance!

Upvotes: 2

Views: 1829

Answers (2)

i.am.michiel
i.am.michiel

Reputation: 10404

You don't need the controller part :

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

Be aware however, that a render is a completely new request going through the whole Symfony lifecycle and thus can impact performance if you abuse it.

Edit : And as @Wouter J has pointed out : prior to Symfony 2.2 use above notation. After Symfony 2.2 the following has to be used :

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

Upvotes: 2

Wouter J
Wouter J

Reputation: 41934

Well, I would suggest creating your own Twig extension. Something around the lines of:

<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;
    }
}

Read more about creating your own Twig extension in the Symfony2 documentation.

Upvotes: 3

Related Questions