我正在使用symfony2 + twig尝试我的第一个项目。我创建了具有已定义块的基本树枝模板。它基本上看起来像这样
{% block content %}
some content...
{% endblock %}
{% block footer %}
{{ footer.content}}
{% endblock %}
我希望所有页面的页脚都相同。页脚从DB加载并在控制器中设置。我希望从上面描述的模板继承到其他页面,但我必须始终在控制器中设置页脚,否则未定义变量。
我的问题是,如果存在任何“好”的话。如何为从父模板继承的多个模板设置页脚变量?
答案 0 :(得分:7)
在某些情况下,您需要做的不仅仅是包含一个简单的模板。 假设您的布局中有一个包含最多三个边栏的侧边栏 最近的文章。检索这三篇文章可能包括查询 数据库或执行其他无法完成的重要逻辑 在模板中。
解决方案是简单地嵌入整个控制器的结果 来自您的模板。首先,创建一个呈现某个特定的控制器 最近文章的数量:
<强> 控制器 强>
// src/AppBundle/Controller/ArticleController.php
namespace AppBundle\Controller;
// ...
class ArticleController extends Controller
{
public function recentArticlesAction($max = 3)
{
// make a database call or other logic
// to get the "$max" most recent articles
$articles = ...;
return $this->render(
'article/recent_list.html.twig',
array('articles' => $articles)
);
}
}
<强> 查看 强>
{# app/Resources/views/article/recent_list.html.twig #}
{% for article in articles %}
<a href="/article/{{ article.slug }}">
{{ article.title }}
</a>
{% endfor %}
<强> 布局 强>
{#app / Resources / views / base.html.twig#}
{# ... #}
<div id="sidebar">
{{ render(controller(
'AppBundle:Article:recentArticles',
{ 'max': 3 }
)) }}
</div>
答案 1 :(得分:0)
您可以使用以下其中一项,&#39;编写自定义的Twig Extension&#39;
<?php
namespace AppBundle\Extension;
class MyTwigExtension extends \Twig_Extension
{
private $em;
private $conn;
public function __construct(\Doctrine\ORM\EntityManager $em) {
$this->em = $em;
$this->conn = $em->getConnection();
}
public function getFunctions()
{
return array(
'users' => new \Twig_Function_Method($this, 'getUsers'),
);
}
public function getUsers()
{
$sql = "SELECT * FROM users ORDER BY accountname";
return $this->conn->fetchAll($sql);
}
public function getName()
{
return 'smproc4_twig_extension';
}
}
将分机注册为服务
services:
my.twig.extension:
class: AppBundle\Extension\MyTwigExtension
tags:
- { name: twig.extension }
arguments:
em: "@doctrine.orm.entity_manager"
使用自定义扩展程序
Hello {{ name }}!
<ul>
{% for user in users() %}
<li>{{ user.accountname }}</li>
{% endfor %}
</ul>
看看