Тег Twig с некоторой логикой PHP внутри - PullRequest
0 голосов
/ 14 марта 2012

Я новичок в использовании Twig, но хорошо разбираюсь в шаблонах django.

Мой сайт не является проектом Symfony, но я использую Twig в качестве языка шаблонов.

Мне нужно отобразить блок "последние новости" на каждой странице моего сайта. Ввод логики в каждый контроллер на самом деле не вариант.

Из моего опыта работы с django я надеялся создать собственный тег и отобразить его в своем базовом шаблоне. У Django есть так называемые « теги включения ». Тег, который выполняет некоторую логику Python и отображает результаты через другой шаблон.

Я читал о пользовательских тегах в Twig. И я успешно создал парсер для моего нового блестящего тега {% latest_news 5 %}. Но как выполнить PHP скрипт в моем LatestNews_Node? Я прочитал некоторый исходный код Twig. Они используют $compiler->write(...) для выполнения кода PHP. Это единственный способ выполнить пользовательский PHP в теге?

А как отрендерить его через другой шаблон и вернуть результат в конце?

Я пытался найти рабочий пример без результата

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

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

Просто создайте новую функцию и вызовите ее:

{{ latest_news(5) }}

Пример кода функции с отображением другого шаблона

class MyTwigExtension extends Twig_Extension
{
    public function latest_news ($limit)
    {
        $templateVariables = array(
            'latestNews' => SomeClass::getLatestNews($limit)
        );

        // you would want to make this in a factory / a separate view class
        $loader = new Twig_Loader_Filesystem('/your/template/dir');
        $twig = new Twig_Environment($loader);

        // display actual sub-template
        $template = $twig->loadTemplate('your_existing_template.twig');
        return $template->render($templateVariables);
    }


    public function getFunctions ()
    {
        return array(
            'latest_news' => new Twig_Function_Method($this, 'latest_news', array('is_safe' => array('html')))
        );
    }


    public function getName ()
    {
        return 'my-twig-extension';
    }
}

Теперь вам нужно создать все свои экземпляры Twig, как это:

$loader = new Twig_Loader_Filesystem('/your/template/dir');
$twig = new Twig_Environment($loader);
$twig->addExtension(new MyTwigExtension());

Поэтому я думаю, что вы можете захотеть создать фабрику, которая создаст для вас экземпляр (со всеми зависимостями от расширений), или создать собственный класс View, который делает все это внутренне.

0 голосов
/ 11 марта 2014

Создание расширения http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension

Как сделать расширение для ветки Symfony2 (Леонард Остин) http://www.leonardaustin.com/blog/technical/how-to-make-a-symfony2-twig-extension/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...