2016-05-22 2 views
0

Я использую расширение Twig для передачи глобальных переменных из базы данных, как в приведенном ниже коде. Но я хочу, чтобы сделать это более динамичным, чтобы получить данные из базы данных с помощью параметра id ..Передача параметров в расширение Twig из шаблона?

сервис

app.twig.database_globals_extension: 
class: Coursat\CoursatBundle\Twig\Extension\DatabaseGlobalsExtension 
arguments: ["@doctrine.orm.entity_manager"] 
tags: 
    - { name: twig.extension } 

расширение

<?php 

namespace Coursat\CoursatBundle\Twig\Extension; 

use Doctrine\ORM\EntityManager; 

class DatabaseGlobalsExtension extends \Twig_Extension 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function getGlobals() 
    { 
     return array (
       "myVariable" => $this->em->getRepository('CoursatBundle:test')->find(##I want to pass a var here from the template##), 
    ); 
    } 

    public function getName() 
    { 
     return "CoursatBundle:DatabaseGlobalsExtension"; 
    } 

} 

шаблон

{{ myVariable.name() }} 
+0

Добавить дополнительную Twig_SimpleFunction, в которой вы можете передать параметры 'key', и просто делать такие функции, как' function ($ key) {return $ this-> getGlobals() [$ key]; } ' – DarkBee

+0

Привет, пожалуйста, вы можете объяснить больше :) –

+0

См. Ответ, который я создал – DarkBee

ответ

1

Это очень плохая идея, чтобы сохранить это в ваших глобал, потому что ваша база данных будут запрошены для каждых вызовов вашего сайта.

Вы можете использовать функцию для извлечения этих данных:

<?php 

namespace Coursat\CoursatBundle\Twig\Extension; 

use Doctrine\ORM\EntityManager; 

class DatabaseGlobalsExtension extends \Twig_Extension 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('my_test', array($this, 'myTest')), 
     ); 
    } 

    public function myTest($id) 
    { 
     return $this->em->getRepository('CoursatBundle:test')->find($id); 
    } 

    public function getName() 
    { 
     return "CoursatBundle:DatabaseGlobalsExtension"; 
    } 

} 

Затем в шаблоне Twig, используйте это, чтобы загрузить объект:

{% set twigVar = my_test(42) %} 

Это по-прежнему плохая практика, хотя, вам должен загружать ваши объекты в контроллерах, а не в ваши представления.

+0

OMG это действительно amaizing :)! –

+0

Привет, братан, почему это плохая практика? И если мне нужна глобальная переменная, такая как «имя сайта», которая хранится в базе данных (например, WordPress) –

+0

@ hassen-zouari, здесь есть две проблемы. Во-первых, в конструкции MVC (разделение проблем) контроллер обрабатывает доступ к данным, представление должно просто отображать. Во-вторых, попадание в базу данных для данных не используется = потраченные впустую циклы. Вторая проблема может быть не с использованием Doctrine, если вам нужно загрузить объект в любом месте в приложении (то есть: пользовательский объект) или он кэшируется, тем самым пропуская вызов БД. – davmor

1
class DatabaseGlobalsExtension extends \Twig_Extension 
{ 
    ... 
    ... 
    public function getFunctions() { 
     return array(
      'get_db_global', function($key) { 
        $globals = $this->getGlobals(); 
        return isset($globals[$key]) ? $globals[$key] : null; 
       } 
     ); 
    } 
    ... 
    ... 
} 

Внутри сучок:

The global with key "Foo" is : {{ get_db_global('foo') }} 
+0

Спасибо, но он показывает ## Примечание: Неопределенная переменная: key ## –

+0

Если бы там была опечатка. Смотрите редактирование – DarkBee

+0

Привет, спасибо, брату за помощь, но это не работает так, как я хочу ... пожалуйста, могу ли я связаться с вами в скайпе? спасибо :) –

Смежные вопросы