16.3 通过hook_page_build组装区域区块
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
让我们来试一下,打开block.module文件,搜索block_page_build,还真找到了。真聪明,你猜对了。我们来看一下block模块的具体实现。
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
让我们来试一下,打开block.module文件,搜索block_page_build,还真找到了。真聪明,你猜对了。我们来看一下block模块的具体实现。
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
这是我们这里实际执行的语句。用来合成页面的是drupal_render_page函数。这个时候,传递过来的$page_callback_result,只是一个包含节点对象的呈现数组,节点外面的区域、区块是怎么加进来的呢?这是很多初学者的疑问。让我们来看这个函数的定义:
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
我们在node_menu里面,并没有定义'delivery callback',所以这里的$default_delivery_callback将会使用Drupal的默认值。$page_callback_result就是刚才返回的包含节点对象的呈现数组。现在,让我们来看一下drupal_deliver_page,是怎么将这个数组转换成整个页面,并返回给浏览器的。
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
现在,包含节点对象的可呈现数组,已经返回来了。这个页面是怎么构件出来的呢?让我们回到函数menu_execute_active_handler上面来。
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
曾经有人在这里,问过我一个这样的问题,我怎么没有看到SQL语句啊?我们前面讲了,在向node_page_view传递参数之前,调用了node_load函数,将节点ID转为了节点对象。我们来看一下node_load函数的定义。
/**
* Loads a node object from the database.
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
现在让我们来看一下node_page_view返回了什么,我们在node.module里面找到这个函数。
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
下面来看这句抽象的代码:
$page_callback_result = call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);
作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
打开menu.inc文件,找到menu_execute_active_handler函数,阅读这个函数的源代码。