我是使用Twig的新手,但我对django模板有很好的把握。
我的网站不是Symfony项目,但我使用Twig作为模板语言。
我需要的是在我网站的每个页面上显示“最新新闻”块。将逻辑放入每个控制器实际上都不是一种选择。
从我的django体验中,我希望创建一个自定义标记并在我的基本模板中呈现它。 Django有所谓的自定义“inclusion tags”。执行某些python逻辑并通过另一个模板呈现其结果的标记。
我在Twig中读到了自定义标签。我成功地为我闪亮的新{% latest_news 5 %}
标签创建了一个解析器。但是如何在LatestNews_Node
中执行PHP脚本?我读了一些Twig源代码。他们使用$compiler->write(...)
来执行PHP代码。这是在标签中执行自定义PHP的唯一方法吗?
如何通过另一个模板渲染它并在结尾处返回结果?
我试图找一个没有结果的工作示例
答案 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)
创建扩展程序 http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension
如何制作Symfony2 Twig扩展(作者Leonard Austin) http://www.leonardaustin.com/blog/technical/how-to-make-a-symfony2-twig-extension/