drupal theme.inc 阅读笔记

来源:互联网 发布:软件定制沟通 编辑:程序博客网 时间:2024/05/17 23:25

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';) 根据一定规则生成函数名称的,是模板和模板引擎级别的扫描。
   整体就这样,当然规则还真不少。

原创粉丝点击