【问题标题】:How Does Drupal 7 Render Out a Page?Drupal 7 如何渲染页面?
【发布时间】:2011-02-22 04:10:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: php drupal drupal-themes


    【解决方案1】:

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

    首先,一个模块(这就是 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 中为其分配块。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 知道为什么 Drupal 7 将 html.tpl.php 存储在系统模块中吗?主题可以有自己的自定义 html.tpl.php 吗?
      • 是的,任何核心/系统模板文件都可以通过将文件复制到您的主题目录并根据需要进行修改来覆盖。请务必清除主题缓存,以便识别新文件:drupal.org/node/337176
      • 我不认为 html.tpl.php 取代了 page.tpl.php。我可能是错的,但据我了解,page.tpl.php 适用于 内的所有内容,html.tpl.php 适用于 及其外部的所有内容。
      【解决方案3】:

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

      [更新]

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

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

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

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

      1. 引导
      2. menu_execute_active_handler
      3. page_callback
      4. delivery_callback
      5. hook_page_alter()
      6. drupal_render($page)

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

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

      【讨论】:

      • 现在正在观看该视频。它非常彻底,并且清楚地表明自 Drupal 6 以来很多发生了变化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多