Drupal 7如何渲染页面?

时间:2011-02-22 04:10:30

标签: php drupal drupal-themes

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系统是如何组合在一起的。向厌倦阅读此免责声明的人致歉!

3 个答案:

答案 0 :(得分:10)

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

首先,一个模块(这就是为什么system.module存在,对于所有这些只有模块可以实现的东西,如实现hook_menu())需要通过在{{3中声明它来定义特定主题函数/模板的存在来定义}}

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

要使用主题功能/模板,您可以像这样调用page.tpl.php

$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数组,这是一个可渲染的数组(有些文档在theme()中,然后在其上调用hook_page_alter()

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

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

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

答案 1 :(得分:4)

在尝试了解模板如何组合在一起时,我发现的最佳工具是Theme Developer module。它的工作方式与Firebug类似,允许您单击页面区域以查看用于页面各个部分的主题函数或模板文件,以及可用于{{suggestions的“overriding” 3}}他们。

模板可以通过多种方式组合在一起。 Drupal确实对它们如何嵌套做了一些假设,这些假设反映在模板文件中可用的默认变量中。但是,template suggestionsavailable variables within them都可以修改。

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

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

答案 2 :(得分:2)

试着看一下如何在drupalcon的drupal 7上构建一个关于如何在http://sf2010.drupal.org/conference/sessions/page-render-drill-down-drupal-7建立页面的演示文稿,特别是从开始(05:10)开始5分钟后。对不起,这里不能详细说明因为我仍然看着自己。并尝试理解它。 ;)

<强> [更新]

观看之后的演示文稿是关于drupal 7如何呈现页面的快速结论:

而不是你在问题中提到的常用方法

  

其中顶级布局/页面PHP文件   列出了基本的文档结构,   然后呈现我们的各种子视图   通过包含或查看渲染方法

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

  1. 自举
  2. menu_execute_active_handler
  3. page_callback
  4. delivery_callback
  5. hook_page_alter()
  6. drupal_render($页)
  7.   

    然而,它掩盖了主题如何   得到引擎(是正确的术语吗?)   PHP的各个部分都变成了这个   页面(不是批评,书的   采取与...不同的方法   我正在走的路。)

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