从本质上讲现代所有的web软件系统中都用到了渲染数组,只不过在drupal世界里明确给了它这个名字:“渲染数组”。
如果你使用过模板引擎,那么会很熟悉它,要使模板引擎工作,那么需要给它传入一些变量,这些变量将决定模板里面对应变量的显示,传入的这些变量往往是以数组的方式传入,键名代表模板里面的变量名,键值代表变量值,这样的数组就叫做渲染数组,比如著名的php小型框架CodeIgniter(简称CI框架)中的经典用法就是这样:
$this->load->view('show_news', $data);
其中参数show_news指定网页模板,参数$data就是程序中准备好的一个数组,包含了传递给模板的变量
可以说渲染数组是数据系统和显示系统的一个桥梁,在数据系统中程序计算出需要给用户的数据,他们全部放置到渲染数组中,显示系统仅面向渲染数组这一个接口工作,这样一来系统和显示之间解耦了,许多事情变得简单,这里的显示是广义的,它也包括“显示”成json或xml给其他系统“看”。
由此可见渲染数组的重要性,相比CI框架等轻量级系统,drupal中的渲染数组则更上一层楼,它包含更多的功能,在drupal中渲染数组不仅包含传递给模板的变量,还包含缓存数据,附件数据,在不用模板的情况下如何进行渲染的数据,下面来看一看drupal的渲染数组:
在drupal中控制器只有三种行为:返回响应对象、返回渲染数组、抛出异常。如果返回的是渲染数组,将派发视图事件,此事件将触发渲染系统,渲染系统启动渲染器对渲染数组进行渲染,在这个过程中渲染器根据渲染数组包含的信息视情况启动主题子系统,也可能直接进行渲染,最后输出内容。渲染数组在整个系统处理流程中大多被以引用传递给各种处理函数或方法,以便于模块等对渲染数组进行修改。
先给出一个简单的列子,看看渲染数组长什么样:
$page = [
'#type' => 'page',
'content' => [
'system_main' => […],
'another_block' => […],
'#sorted' => TRUE,
],
'sidebar_first' => [
…
],
];
在drupal中“渲染”是什么意思?就是将一个结构化的数组(render array)转换成某格式的字符串,比如html字符串(页面),这个结构化的数组被称为渲染数组。
渲染数组是一个有许多层级嵌套的关联数组,其子元素分为两大类:以#开头的键名表示属性,用于指示怎么渲染及缓存等等,没有以#开头的任意其他命名的元素表示children(理解为子渲染元素、下一层级元素、子内容,html元素是嵌套的),在渲染数组中children子元素必是一个数组类型,他代表下一层级的渲染数组。
属性名是特定的,子元素名是灵活的,它可以是代表分区的变量名(分区概念见后续主题)
在脑海中可以这样理解:渲染数组就像DOM在drupal世界中的体现,从上层元素到下层元素逐级嵌套,形成一棵渲染树