带有一些PHP逻辑的Twig标签

时间:2012-03-14 10:12:42

标签: php templates twig

我是使用Twig的新手,但我对django模板有很好的把握。

我的网站不是Symfony项目,但我使用Twig作为模板语言。

我需要的是在我网站的每个页面上显示“最新新闻”块。将逻辑放入每个控制器实际上都不是一种选择。

从我的django体验中,我希望创建一个自定义标记并在我的基本模板中呈现它。 Django有所谓的自定义“inclusion tags”。执行某些python逻辑并通过另一个模板呈现其结果的标记。

我在Twig中读到了自定义标签。我成功地为我闪亮的新{% latest_news 5 %}标签创建了一个解析器。但是如何在LatestNews_Node中执行PHP脚本?我读了一些Twig源代码。他们使用$compiler->write(...)来执行PHP代码。这是在标签中执行自定义PHP的唯一方法吗?

如何通过另一个模板渲染它并在结尾处返回结果?

我试图找一个没有结果的工作示例

2 个答案:

答案 0 :(得分:6)

你走错了路。 你可以使用新标签做你想做的事情,但似乎没必要。

只需创建一个新功能并调用它:

{{ 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类,它在内部执行所有操作。

答案 1 :(得分:0)