如何覆写第三方bundle的模板

3.4 版本
维护中的版本

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 会查找两个位置来定位模板:

  1. app/Resources/AcmeBlogBundle/views/Blog/index.html.twig

  2. 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 将从下面两个地方寻找模板:

  1. app/Resources/AcmeBlogBundle/vews/layout.html.twig

  2. 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 目录下 。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)