2016-09-14 2 views
0

Клянусь, я искал это и пытался понять документы, но я просто не понимаю. Я пишу функцию ветви, я не могу понять, как я могу получить доступ к переменным, переданным в визуализацию внутри функции.php twig get переменные переданы в визуализацию в функции расширения

Так что, если у меня есть это регистрирующий мое расширение и вызов визуализации:

$o = new SomeObject(); 
$twig->addExtension(new MyExtension()); 
$twig->render('example.html',array('obj'=>$o)) 

И example.html просто {{ myfunc('foo') }} Как я могу получить доступ к переменной «Obj» изнутри MyFunc в MyExtension:

class MyExtension extends \Twig_Extension 
{ 
    public function getName() 
    { 
    return 'myextension'; 
    } 
    public function getFunctions() 
    { 
    return array(
     new \Twig_SimpleFunction('myfunc', 'MyExtension::myfunc', array('needs_environment' => true)) 
    ); 
    } 
    public static function myfunc(\Twig_Environment $env, $name) 
    { 
    //how to I get 'obj' from $twig->render in here? 
    } 
} 
+0

Вы уверены, что это действительно необходимо сделать? Чаще всего просто передавать переменные, которые нужны функции при ее вызове. – Cerad

ответ

3

Вы хотите использовать 'needs_context' => true на объявлении функции:

new \Twig_SimpleFunction('myfunc', [$this, 'myfunc'], [ 
    'needs_environment' => true, 
    'needs_context' => true, 
]) 

После этого вы получите, как первый (или второй, если needs_environment также верно) аргумент, массив с данными текущего контекста. Это будет содержать ваши переменные.

public function myfunc(\Twig_Environment $env, $context, $name) 
{ 
    var_dump($context); 
} 
+0

Спасибо, Yoshi, что сделал. Примеры в ветках docs не используют пространства имен, но я, и я не получал никаких функциональных ошибок, когда twig пыталась eval() имя передавалось в getFunctions(), поэтому это статический метод в классе. Если есть лучший способ, я открыт для этого. –

+1

@RobertLabrie Я изменил свой ответ, чтобы показать, как использовать нестатический метод. Надеюсь, поможет! :) – Yoshi

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