theme.inc 阅读笔记:
笔前语: drupal的函数写的还是相对比较复杂的,但是每个函数都有一个中心思想,那是这个函数的主要任务或意图,看一个函数首先要看明白这个。其次,玩儿drupal眼界要高一些, 放眼全局才有更多收获。
_init_theme(); 篇:
目标: 弄明白这个函数到底干了什么,注释信息太笼统,没有意义。
背景: 该函数在theme(); 函数初始阶段被选择性调用。
1. 全局变量
global $theme_info, $base_theme_info, $theme_engine, $theme_path;
这些变量应该是读系统variables 直接获取的数据。
2. 抓取基本模板包样式文件,并添加到$stylesheets变量。
每一个模板包对象,都包含stylesheets数据项,在该对象中,样式表按照media属性分类。
3. 抓取当前模板包样式文件,并添加到$stylesheets变量。
按照这个顺序,可以发现,子模板包样式文件被先导入,而当前模板包样式文件被后导入,
这里有CSS继承性关系。
4. 按照$stylesheets数组,先进先出的顺序,依次通过drupal_add_css函数添加样式文件。
顺序正确。
5. JS脚本的处理方式与CSS相同。
通过drupal_add_js函数把JS脚本添加到输出队列。
6. 如果设置了模板引擎(theme->engine), 则导入模板引擎。
1> 在导入引擎后,开始执行theme hook,命名规则是 $theme_engine . '_init' .
2> 并且该函数将根据基础模板包(相对于子模板包)的数量多次执行,基础模板包对象将作为参数传递给
$theme_engine . '_init' 函数。
3> 在执行完基础模板包HOOK后,开始执行当前模板包HOOK,规则与基础模板包HOOK相同。
根据这些分析,当模板包初始化的时候,模板引擎级别的HOOK会被优先执行。
7. 如果没有设置模板引擎,则直接导入模板文件。
8. 以上程序执行完成后,执行初始化回调函数
$registry_callback($theme, $base_theme, $theme_engine);
默认的回调函数名称为“__theme_load_registry”
总结:该函数实际工作是基础模板包和当前模板包中,样式文件和JS脚本,并添加到输出队列,同时呼叫回调函数。
系统设定的回调函数是"__theme_load_registry", 依据以上的分析,该函数负责模板包初始化。
与模块级别的模板没有关系。
theme.inc 中 _theme_load_registry();函数分析:
函数注释: 从数据库中获取模板注册信息缓存,如果没有则创建,英文原文如下:
Get the theme_registry cache from the database; if it doesn't exist, build it.
(点评:这个注释还差不多,直接了当说明意图)
这个函数比较简单,几行而已,问题是如何创建缓存,数据从哪里来,那么下面我们开始研究
_theme_build_registry(); 看看这个游戏如何玩儿法。
theme.inc 中 _theme_build_registry();函数分析:
~ _theme_process_registry 这个函数是重点研究对象。
theme.inc 中 _theme_precess_registry(); 函数分析:
函数注释:Process a single invocation of the theme hook. $type will be one
of 'module', 'theme_engine', 'base_theme_engine', 'theme', or 'base_theme'
and it tells us some important information.
函数声明: function _theme_process_registry(&$cache, $name, $type, $theme, $path);
1. 执行[HOOK]_theme 函数,其中 HOOK 可以是模块名称、模板引擎名称、模板名称等。
该名字总是和$type 匹配使用。要求,被调用HOOK函数在执行该程序之前已经被导入系统。
也就是说已经启用。
函数名称组织方式很简单 $function = $name .'_theme'; 并且没有任何判断,也就是说,
大多数情况下该函数是默认存在的。
函数执行如下:$result = $function($cache, $type, $theme, $path);
其中返回值$result 是一个数组,记录了function, "include files", path, file, template,
"preprocess functions" 等,用法各不相同,由此来看,应该是一个数据注册类的函数,只需
要返回一些数据就可以了,根据各个模块或类型不同,返回数据也不同。
总结:这个函数的最终目的就是获取 "preprocess functions", 所有的操作和扫描都是为了这个。
扫描的范围包括Module, theme, theme engine 三个部分,自动生成函数名称的,是模块级别的扫描,
($function = $name .'_theme';) 根据一定规则生成函数名称的,是模板和模板引擎级别的扫描。
整体就这样,当然规则还真不少。