带有一些PHP逻辑的Twig标签

dmz*_*rsk 0 php templates twig

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

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

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

从我的django经验来看,我希望创建一个自定义标签并在我的基本模板中呈现它.Django有所谓的自定义" 包含标签 ".执行某些python逻辑并通过另一个模板呈现其结果的标记.

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

以及如何通过另一个模板呈现它并在结尾返回结果?

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

apf*_*box 6

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

只需创建一个新函数并调用它:

{{ latest_news(5) }}
Run Code Online (Sandbox Code Playgroud)

功能代码示例包括渲染另一个模板

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';
    }
}
Run Code Online (Sandbox Code Playgroud)

您现在必须创建所有的Twig实例,如下所示:

$loader = new Twig_Loader_Filesystem('/your/template/dir');
$twig = new Twig_Environment($loader);
$twig->addExtension(new MyTwigExtension());
Run Code Online (Sandbox Code Playgroud)

所以我认为您可能想要创建一个工厂,为您创建实例(具有扩展的所有依赖项)或创建一个自定义View类,它在内部完成所有这些.