Доступ до змінних шаблонів гібриду з php

Чи можна отримати доступ до будь-якої змінної, визначеної у шаблоні з шаблонами з php?

Наприклад:

Template:
...
{% set foo = 'foo' %}
...

І з PHP:

echo $template->foo

Або щось подібне.

6

3 Відповіді

Доступ до кожної змінної є дуже громіздким, тому я, в кінці кінців, мав створити розширення, яке містить дані, які мені потрібні:

class SampleExtension extends Twig_Extension {
    private $foo;

    function getName() {
        return 'sampleExtension';
    }

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

    function setFoo($value) {
        $this->foo = $value;
    }

    function getFoo() {
        return $this->foo;
    }
}

І в класі, де мені потрібні дані:

$this->sampleExtension = new SampleExtension();
$twigEnv->addExtension($this->sampleExtension);
...
$html = $twigEnv->render('myTemplate.tpt', ...);

Використання цього шаблону:

...
{{ setFoo('bar') }}
...

Після відтворення:

echo $this->sampleExtension->getFoo();//Prints bar
3
додано

Variables you set in Twig are set into the $context array you pass to Twig_Template->display(). This array is passed by value so any modifications to it will not be seen in the outer (PHP) scope.

Таким чином, немає , ви не можете використовувати змінні, які ви встановили у Twig у PHP.

0
додано
Це може працювати, якщо змінні всередині цього масиву є посиланнями. Не протестували, але ніколи не говорите ніколи :)
додано Автор hakre, джерело
@ ZenMaster Так, це було б можливо;)
додано Автор NikiC, джерело
Чи можливо це, якщо я надіслав в масиві контексту об'єкт і встановив властивості цього об'єкта за допомогою спеціальної функції "гілочка"?
додано Автор ZenMaster, джерело

Якщо ви хочете отримати доступ до змінної шаблону, ви можете надіслати цю змінну як посилання.

$foo = '';
$args['foo'] = &$foo;
$twig->render($template, $args);
...
echo $foo;

Приклад: (мета полягає в тому, щоб організувати електронну пошту та тему в одному шаблоні)

Twig_Autoloader::register();
$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);
$tl = << 'John', 
    'subject' => &$mail['subject']
);
$mail['message'] = $twig->render($tl, $args);
print_r($mail['subject']);

This code prints: Subject of a letter

0
додано
Додайте додаткові пояснення
додано Автор Chandrayya G K, джерело
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php