Drupal 6 Views模块
一、 原理
Views模块通过hook_menu_alter()插入页面项,通过hook_form_alter插入block项。模块的核心为view对象,通过执行view对象的execute_display()方法来获取输出,View对象是数据库表views_view的映射。对view对象的各个属性(如field、argument、sort、filter等)通过handler对象实现,view对象的界面方面则通过plugin对象和hook_views_plugins()来实现。在views_theme()函数里通过调用views_fetch_plugin_data()将各个plugin集成到theme_registry里。
对于页面,view对象通过execute_hook_menu()方法获得该view对象的页面menu项,通过views_arg_load()函数加载路径上的对象,通过views_access()函数判断该menu项的access属性,通过views_page()函数来获取输出,而views_page()函数内部则调用view对象的execute_display()方法。
对于区块,view对象通过execute_hook_block()方法获得该view对象的区块项,通过access()方法判断区块的access属性,通过execute_display()方法来获取view区块的输出。
有四种plugin:
1、 Display:包括default、block、page、attachment、feed;
2、 style:包括default、list、grid、table、default_summary、unformatted_summary和rss;
3、 row:包括fields;
4、 argument default:包括fixed、php
5、 argument validator:包括php、numeric;
二、 区块流程
1、 在views_block()中,list op列出views建立的区块列表,execute_hook_block();
2、 在views_block()中,view op返回当前请求views区块的内容,$view->execute_display();
3、 在view对象的execute_display()方法中,执行步骤为
$this->set_arguments($args);
$this->attach_displays();
$this->display_handler->pre_execute();
$output = $this->display_handler->execute();
4、 在display_handler对象的pre_execute()方法中,执行步骤为
$this->view->set_use_ajax($this->use_ajax());
// Copy pager information from the display.
$this->view->set_use_pager($this->use_pager());
$this->view->set_pager_element($this->get_option('pager_element'));
$this->view->set_items_per_page($this->get_option('items_per_page'));
$this->view->set_offset($this->get_option('offset'));
5、 在display_handler对象的execute()方法中,执行步骤为
$info['content'] = $this->view->render();
$info['subject'] = filter_xss_admin($this->view->get_title());
6、 在view对象的render()方法中,执行步骤为
$this->execute($display_id); //生成并执行query,结果保存在$this->result里。
$this->init_style();
$this->style_plugin->pre_render($this->result);
$this->field[$id]->pre_render($this->result);
$this->display_handler->render();
7、 在display_handler的render()方法中,执行theme($this->theme_functions(), $this->view);返回最后的输出;
三、 Menu流程
1、 在views_menu_alter函数里挂载进views生成的各个menu项,调用views_get_applicable_views('uses hook menu')获得所有的hook menu view,遍历这个列表,执行每个view的$view->execute_hook_menu($display_id)方法,获得符合menu项的数组单元;
2、 当请求view路径时,系统调用views_page()函数,在该函数内部:
$view = views_get_view($name)
$view->execute_display($display_id, $args)
剩余执行步骤与block流程一样。
四、 API
1、 hook_views_data(),暴露给views模块的所有数据以及相关的handler。数据保存在缓存cache_views数据表中。
2、 hook_views_plugins(),暴露给theme的所有数据,以便于view界面的定制。
3、 hook_views_default_views(),默认view对象。数据保存在缓存数据表cache_views中。
- wilson's blog
- Login or register to post comments

