Sunil kumar
Sunil kumar

Reputation: 771

How to access my template variable in base template file in Symfony

My Controller action

public function viewAction() {
        $breadcrumbs = array();
        $breadcrumbs = array("Home"=>$this->get("router")->generate("admin_home"));
$breadcrumbs = array("View"=>'');
       $this->render('UserBundle:Default:view.html.twig',array('breadcrumbs'=>$breadcrumbs));
}

This is my View template and "breadcrumbs" array here is accessible here.

{% extends 'base.html.twig' %}
{% block body %}
<section class="content">
{{ dump(breadcrumbs) }}
</div>
{% endblock body %}

This is my Base template file but i am not able to access breadcrumbs here.

<!DOCTYPE html>
<html>
    <head>......
<section>
<div class="breadcrumb">
{{ dump(breadcrumbs) }}
</div>
</section>
{% block body %}{% endblock %}

Note :- I don't want to use any bundle for breadcrumbs.

Upvotes: 0

Views: 1935

Answers (2)

Maks
Maks

Reputation: 82

You can use render(controller(...)) for this.

Controller:

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        // replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'breadcrumbs' => [
                'home' => 'home_url',
                'view' => 'view_url',
            ],
        ]);
    }

    public function breadcrumbsAction(array $breadcrumbs = []) {
        return $this->render('AppBundle::breadcrumbs.html.twig', [
            'breadcrumbs' => $breadcrumbs
        ]);
    }
}

base.html.twig

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
        <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
    </head>
    <body>
        {{ render(controller('AppBundle:Default:breadcrumbs', { 'breadcrumbs': breadcrumbs })) }}
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

breadcrumbs.html.twig

{{ dump(breadcrumbs) }}

UPDATE: made breadcrumbs dynamic

Upvotes: 1

Jakub Matczak
Jakub Matczak

Reputation: 15676

You can create a block in base.html.twig:

<!DOCTYPE html>
<html>
    <head>......
<section>
<div class="breadcrumb">
{% block breadcrumb %}{% endblock %}
</div>
</section>
{% block body %}{% endblock %}

and fill it in child template just like the body block:

{% extends 'base.html.twig' %}
{% block body %}
    <section class="content">
    (...) //content
    </div>
{% endblock body %}
{% block breadcrumb %}
    {{ dump(breadcrumbs) }}
{% endblock breadcrumb %}

EDIT Also this may help you, but I didn't test it with current Twig version.

Upvotes: 1

Related Questions