2

私はそのようなレイアウトを持っています:

{# ... #}
{% render 'PamilGooglePlusBundle:Default:sidebar' %}
{# ... #}
{{ globalVariable }}

PamilGooglePlusBundle:Default:sidebarユーザーとグループのリストを生成する DBAL を使用して 2 つのクエリを実行します。sidebarAction() に関数があり、実際のリソースの名前: グループまたはユーザー名が付けられました。テンプレートの他の部分で使用したい。

私はいくつかの考えに達しました。クエリごとにこのメソッドを実行し、その変数を毎回取得する必要がありますが、どうすればよいですか? 変数を取得できるように常に実行されるある種のコントローラーメソッドを意味します。

4

1 に答える 1

2

この問題を解決しました!;)

簡単に言うと、Twig 拡張機能を作成し、いくつかのパラメーターを使用して init 関数を登録し、それをメイン テンプレートで使用します。値は、次のコードのようにレジスター グローバルです。

<?php

namespace Pamil\GooglePlusBundle\Extension\Twig;

use Doctrine\DBAL\Connection;

class Sidebar extends \Twig_Extension
{
    private $dbal;

    private $init = false;

    public $data = array();

    // Specify parameters in services.yml
    public function __construct(Connection $dbal)
    {
        $this->dbal = $dbal;
    }

    public function sidebarInit($pathinfo)
    {
        // This function returns empty string only, cos you can use it only as 
        // {{ sidebarInit(app.request.info) }}, not in {% %}
        if ($this->init === true) {
            return '';
        }

        $this->data = $dbal->fetchAll("SELECT * FROM table");
        // for example:        
        $this->data['key'] = 'value';       

        $this->init = true;
        return '';
    }

    public function getFunctions()
    {
        return array(
                'sidebarInit' => new \Twig_Function_Method($this, 'sidebarInit'),
                );
    }

    public function getGlobals()
    {
        return array(
                'sidebar' => $this
                );
    }

    public function getName()
    {
        return 'sidebar';
    }
}

services.yml

parameters:
    pamil.google.plus.bundle.extension.twig.sidebar.class: Pamil\GooglePlusBundle\Extension\Twig\Sidebar

services:
  pamil.google.plus.bundle.extension.twig.sidebar:
     class: "%pamil.google.plus.bundle.extension.twig.sidebar.class%"
     arguments: ["@database_connection"] #specify arguments (DBAL Connection here)
     tags:
            - { name: twig.extension, alias: ExtensionTwigSidebar }

そして、それをテンプレートで使用できます。たとえば、次のようになりますmain.html.twig

{{ sidebarInit(app.request.pathinfo) }}
<html>
{# ... #}
{% include 'PamilGooglePlusBundle::sidebar.html.twig' %}

sidebar.html.twig

{{ sidebar.data.key }}
{# outputs 'value' #}

それが他の誰かを助けることを願っています;)

于 2012-07-09T07:28:01.227 に答える