我认为这里有一个位断开连接 - 至少有足够的术语断开连接,导致很难解析大量关于Drupal主题系统的公开文档。
从技术上讲,全部 Drupal的输出是模板化的。除了少数例外(比如用户用户名的链接),标记的每一位都位于由模块或当前主题提供的foo-bar.tpl.php样式模板文件中。 Drupal模块建立数据,然后将其传递到模板中以生成HMTL。实际上,每个模板的输出都像一套Matryoshka娃娃一样嵌套在下一个模板中。例如:
html.tpl.php (the HTML wrapper)
page.tpl.php (everything inside the body tag)
region.tpl.php (the 'main content' portion of the page)
node.tpl.php (post in the main content)
field.tpl.php (the post's "related links" field)
的field.tpl.php
获取呈现,并与所有的其他领域连接在一起,那么总HTML变成则传递到node.tpl.php
模板和包裹在其他标记之外的变量,然后将其作为哑HTML传递到region.tpl.php
和...好吧,你明白了。好消息是,您可以深入挖掘一小部分标记,并在整个站点范围内对其进行修改。坏消息是,组成页面的单个标记位有数千个小模板。
对象本身的嵌套由Drupal的配置系统指定,但模板本身仍然控制着实际的HTML输出。如果主题开发者想要,他们可以将传统的PHP应用程序转储到html.tpl.php
,它将执行 - 在菜单路由系统请求页面时执行Drupal代码,但完全忽略它在打印时产生的输出这一页。
实质上,整个系统就像一个Play-Do Fun Factory一样工作。数据被推入Fun Factory,并且主题系统通过模板挤压它以产生有趣的形状。
长话短说,它是可能堵塞导航菜单等东西到单个模板中。但重要的是要记住嵌套系统 - node.tpl.php
模板只控制包含单个帖子的标记片段,而不是包含它的包装或包含它的页面。并且在不编写自定义代码的情况下,page.tpl.php
模板不知道内部的是什么;它只知道如何将它们包装在正确的容器div中。
整个方法可以非常方便地放入各种插件模块,这些插件模块可以为页面添加额外的位,有条件地响应正在显示的内容等,而不必每次都触摸模板本身 - 因为它们只是简单地控制每个微小的元素都被渲染,并且连接的聚合如何被包含在包含标记中。另一方面,这种方法对于那些习惯于构建完整模板并从CMS中提取有用位来填充它的人来说也可能令人生气。 Drupal的“构建东西,然后通过模板推送”方法与许多其他系统使用的“构建模板并将其引入其中”方法不匹配。
有许多模块可以让站点构建者对页面及其布局等采取更全面的方法,但它仍然使用相同的嵌套模板方法,可以从HTML开始。
另外,在Drupal 8中,模板本身正在变成树枝模板而不是我们自己生成的PHPTemplate系统。然而,基本概念 - 通过深深嵌套在彼此之中的“愚蠢”模板推送数据 - 仍然应该在那里。 – Eaton