8

Drupal 7 如何渲染页面?它相当于 MVC 的视图系统。

在渲染请求的最终 HTML 页面时,我使用过的大多数 PHP 框架(基于 MVC)都采用一种方法,即顶级布局/页面 PHP 文件设置基本文档结构,然后呈现我们通过包含或视图渲染方法的各种子视图。

//Simplified version
Page.phtml
    Head.phtml
    Body.phtml
        Banner.phtml
        Topnav.phtml
        Left.phtml
        Content.phtml
        Footer.phtml

我对 Drupal 对此的看法有点困惑。我正在阅读 Pro Drupal Development,它以page.tpl.php. 然而,它掩盖了主题引擎(这是正确的术语吗?)如何将 PHP 的各个部分放入此页面(不是批评,本书采用的方法与我所走的路径不同)。

此外,Drupal 7 主题似乎没有该page.tpl.php文件,因此(对我来说)页面框架来自何处并不清楚。此外,从我读过的内容来看,似乎涉及“块”,但我不清楚“块”是否构成整个页面,或者块是否是主题有选择地使用的东西。

那么,从高层次的概念开始工作(或者尽可能详细),Drupal 7 是如何渲染页面的呢?

我意识到您可以并且可能应该从 Drupal 开始,而不了解一切是如何联系在一起的。我特别想了解各种 Drupal 系统是如何组合在一起的。向厌倦阅读此免责声明的人道歉!

4

3 回答 3

10

我认为这里有两个问题。首先,单个主题/模板如何渲染/使用/显示,其次,整个站点如何组合在一起。我认为第二个问题上面已经回答了,所以我将尝试对第一个问题进行更多解释。

首先,一个模块(这就是 system.module 存在的原因,对于所有这些只有模块才能做的事情,比如实现 hook_menu())需要通过在hook_theme()中声明它来定义一个特定的主题函数/模板存在

说到这一点,有两种不同的东西可以使用。一个主题函数,即以theme_为前缀的函数。通常用于具有更复杂逻辑/PHP 的页面的较小元素,例如theme_table()。还有一个模板,它是一个带有 tpl.php 的文件,例如page.tpl.php

要使用主题函数/模板,您可以像这样调用theme()

$output = theme('table', array('rows' => $rows, 'header' => $header));

或者你可以使用新的,所谓的可渲染数组的东西。这基本上是一组数据+信息,使用哪个主题:

$output = array(
  '#theme' => 'table',
  '#rows' => $rows,
  '#header' => $header,
);

第二种是首选,因为这意味着它将尽可能晚地进行主题化,并且其他模块可以在钩子中更改它。结果将完全相同,然后 drupal_render() 将在最终渲染期间调用 theme() 本身。

当调用 theme() 时,它会查找要使用的函数/文件,查看它是否已被使用的主题覆盖,是否有所谓的模板建议,然后使用它们。

要覆盖主题中的主题函数,请将其复制到您的 template.php 文件并将“theme_”替换为“yourthemename_”,如果它是 tpl.php 文件,请将其复制到您的目录。

现在,最终的渲染过程基本上是建立一个大的 $​​page 数组,这是一个可渲染的数组(一些文档在hook_page_alter()中,然后调用drupal_render()

页面/模板层次结构的全局结构(不是硬编码,而是通过 $page 中的任何内容给出)是这样的:

html.php.tpl
  head.php.tpl
  page.php.tpl
    multiple regions
      multiple blocks

Drupal 7 中几乎所有的东西都是一个块,包括实际的内容,通常是一个节点。主题定义了它具有哪些区域,然后您可以在 UI 中为其分配块。

于 2011-02-22T07:36:16.090 回答
4

在尝试了解模板如何组合在一起时,我发现最好的工具是Theme Developer 模块。它的工作方式有点像 Firebug,允许您单击页面区域以查看用于页面各个部分的主题函数或模板文件,以及可用于覆盖它们的“建议”。

模板可以以多种方式组合在一起。Drupal 确实对它们的嵌套方式做了一些假设,这些假设反映在模板文件中可用的默认变量中。但是,模板建议和其中的可用变量都可以修改。

据我了解,page.tpl.php在 Drupal 7 中已被html.tpl.php取代。

我听到的关于“块”的最佳描述是,它们是您用来显示将在各个区域站点中重复使用的内容的东西。最常见的用途是侧边栏,例如“最近更新的页面”列表或“现在谁在线”列表。

于 2011-02-22T04:41:04.593 回答
2

尝试在http://sf2010.drupal.org/conference/sessions/page-render-drill-down-drupal-7上查看有关如何在 Drupal 7 上构建页面的演示文稿,特别是在开始 5 分钟后(05 :10)。抱歉,这里不能详细说明,因为我还是自己看。并尝试理解它。;)

[更新]

观看演示后,我对 drupal 7 如何渲染页面的快速结论是:

而不是您从问题中提到的常用方法

其中一个顶级布局/页面 PHP 文件设置了基本的文档结构,然后通过包含或视图渲染方法渲染我们的各种子视图

Drupal 通过像这样的渲染流程方法渲染页面

  1. 引导程序
  2. menu_execute_active_handler
  3. page_callback
  4. 交付回调
  5. hook_page_alter()
  6. drupal_render($page)

然而,它掩盖了主题引擎(这是正确的术语吗?)如何将 PHP 的各个部分放入此页面(不是批评,本书采用的方法与我所走的路径不同)。

从渲染流号 3 (page_callback) 到流号 6 (drupal_render($page)) 开始提供各个部分,其中它开始返回一个 drupal 可渲染数组的数组,然后在您的主题中您可以使用 $page变量(由 drupal_render($page) 提供)来渲染即 drupal 内容。

于 2011-02-22T05:06:12.557 回答