Drupal 7如何渲染页面?

Ala*_*orm 8 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
Run Code Online (Sandbox Code Playgroud)

我对Drupal对此的看法感到有些困惑.我正在通过Pro Drupal Development阅读,它开始于类似的领域page.tpl.php.然而,它掩盖了主题引擎(正确的术语?)如何将PHP的各个部分带入此页面(不是批评,本书的方法与我所使用的路径不同).

此外,Drupal 7主题似乎没有该page.tpl.php文件,所以它(页面骨架)的来源不明确(对我而言).另外,从我所看到的内容看起来似乎涉及"块",但我不清楚"块"是否构成整个页面,或者块是否是主题选择性使用的东西.

因此,从高级概念开始工作(或者根据您的喜好获得详细信息),Drupal 7如何渲染页面?

我意识到你可以,而且可能应该从Drupal开始,而不了解一切是如何结合在一起的.我特意试着学习各种Drupal系统是如何组合在一起的.向厌倦阅读此免责声明的人致歉!

Ber*_*dir 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));
Run Code Online (Sandbox Code Playgroud)

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

$output = array(
  '#theme' => 'table',
  '#rows' => $rows,
  '#header' => $header,
);
Run Code Online (Sandbox Code Playgroud)

第二个是首选,因为它意味着它将以尽可能晚的方式主题化,而其他模块可以在钩子中更改它.结果将完全相同,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
Run Code Online (Sandbox Code Playgroud)

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