如何覆写第三方bundle的模板
EN本篇文档待译。点击查看官方英文原档。我们将很快返回这里,敬请期待。
Symfony社区对创建和维护了“覆盖了大量不同功能”的高水平bundles(见KnpBundles.com)而感到自豪。一旦你使用了第三方bundle,你就有可能需要覆写和自定义一个或多个模板。
假设你已经包含了开源AcmeBlogBundle到你的项目中,比如目录是src/Acme/BlogBundle,你想覆写blog列表(list)页面来按照你自己的程序风格个性化它。我们打开AcmeBlogBundle的Blog
控制器,可以发现如下内容:
1 2 3 4 5 6 7 8 9 10 |
public function indexAction()
{
// some logic to retrieve the blogs
$blogs = ...;
$this->render(
'AcmeBlogBundle:Blog:index.HTML.twig',
array('blogs' => $blogs)
);
} |
当AcmeBlogBundle:Blog:index.html.twig
被渲染时,Symfony 会查找两个位置来定位模板:
app/Resources/AcmeBlogBundle/views/Blog/index.html.twig
src/Acme/BlogBundle/Resources/views/Blog/index.html.twig
要覆写该bundle的模板,仅仅从bundle中拷贝index.html.twig
模板到app/Resources/AcmeBlogBundle/views/Blog/index.html.twig
。
(注意,如果app/Resources/AcmeBlogBundle
目录不存在,可以手工建立。)之后你就可以随心所欲的个性化处理该模板了。
如果你在一个新的位置添加模板,你可能需要清楚一下缓存(PHP app/console cache:clear
),即使是在调试模式下。
该逻辑同样适用于基bundle模板,假设AcmeBlogBundle中每个模板都是继承于基模板AcmeBlogBundle::layout.html.twig
。Symfony 将从下面两个地方寻找模板:
app/Resources/AcmeBlogBundle/vews/layout.html.twig
src/Acme/BlogBundle/Resources/views/layout.html.twig
同样的,如果要覆写该模板,你仅仅需要从bundle中拷贝到app/Resources/AcmeBlogBundle/views/layout.html.twig
就可以轻松个性化它了。你也可以通过bundle继承来从bundle内部覆写模版。
如果你退一步,你会看到symfony总是从app/Resources/{BUNDLE_NAME}/views/
目录下的模板开始。如果这个模板不存在,它就会到自己bundle的Resources/views
目录寻找。这意味着,所有的bundle模板都能够通过正确的app/Resources
子目录覆盖。
你还可以使用bundle继承从一个bundle内部继承模板。想了解更多,请参阅 如何使用 Bundle 的继承来覆写部分 Bundle.
覆写核心模板 ¶
因为Symfony 框架本身就是一个bundle,所以其核心模板也可以按照同样的方式进行覆写。比如,核心模板TwigBundle包含很多不同”execption”和“error” 的模板,你可以通过复制Resources/views/Exception
目录下每一项到app/Resources/TwigBundle/Views/Exception
目录下 。