170 likes | 350 Views
Drupal Dev 我想知道 : 什么时候、什么变化. Path--Content--Theme *很简单 *很灵活 *你了解了吗. /index.php?q=user/1 *user/% (% wildcard) *$_GET[‘q’] *arg() * url_alias ( 多语言解决方案 ) *$_GET[‘q’] 不识庐山真面目. Menu System *input: path(user/%) * output: $content *a path, a menu item, a content 必须的 True(200 OK)
E N D
Drupal Dev • 我想知道:什么时候、什么变化
Path--Content--Theme • *很简单 • *很灵活 • *你了解了吗
/index.php?q=user/1 • *user/% (% wildcard) • *$_GET[‘q’] • *arg() • *url_alias (多语言解决方案) • *$_GET[‘q’] 不识庐山真面目
Menu System • *input: path(user/%) • *output: $content • *a path, a menu item, a content 必须的 • True(200 OK) • Path -> Access_Callback -> Page_Callback -> $content • False(403 Forbidden) • Path -> Access_Callback -> $content • False(404 Page Not Found) • Path -> $content
Menu System • *官方文档 node/102338 • *hook_menu • title、title callback、page callback、access callback、file • *menu_router • path、load functions、access_callback、page_callback、file、title、fit • *menu_set_active_item() • *menu_execute_active_handler()
q=user/% => page_callback • *$_GET[‘q’] 用户请求、表达用户意愿 • *一个path有且只有一个menu item • *由load_functions将%转成对象 • *由access_callback决定访问权限 • *由page_callback返回$content • *由theme($hook = ‘page’)输出页面内容 • $content $blocks $menu $link … • *好吧theme()复杂,苦涩,强大
q=user/% => page_callback • 1 q=user/1 • 2 user/% • 3 • 4 user_view() • 5 一般arg(0)是module名称 找到page_callback (user_view) 就知道$content
theme() • 1 theme() 一切输出尽出于此 • 2 hook_theme • 3 _theme_process_registry() • 4 #module#_theme • *$hook_theme[$hook][‘template’] • *$hook_theme[$hook][‘function’] • 5 render_function、preprocess_function、$suggesionts、
hook_theme • 1 function • 'user_signature' => array( • 'arguments' => array('signature' => NULL), • ) • *总能在user.module.php或者user.pages.inc找到函数theme_user_signature($signature = NULL) • *函数theme_user_signature($signature)返回值,就是theme(‘user_signature’)要返回的值 • 2.template • 'user_profile' => array( • 'arguments' => array('account' => NULL), • 'template' => 'user-profile', • 'file' => 'user.pages.inc', • ) • *user_theme() • *arguments 会被合入到$variables • *template: 在user模块目录,总能找到文件user-profile.tpl.php文件,文件内容就是theme(‘user_profile’)要输出的内容 • *file指定了需要include的文件.
theme (template) • 1 hook_theme_info • 2 有一个与之对应的*.tpl.php • 3 *.tpl.php可用到的变量存放在$variables • 4 $variables变量由preprocess functions推送 • 5 默认的render函数theme_render_template • 6 $hook_theme_info[‘template’]指定模板文件
Preprocess function order • *node/223430 已指出 • *template_preprocess • *template_preprocess_hook • Template > Module Name > Theme Engine Name(phptemplate) > Theme Name(garland)
theme(‘page’, $pc_rtn) • * index.php • * hook是page • * $pc_rtn 是page_callback函数返回值 • * hook_theme_info ($hook = ‘page’) • template:page • path:themes/garland • include files: • type:theme_engine • theme path:themes/garland • arguments:,1,1 • theme paths:modules/system,themes/garland • Preprocess functions: • template_preprocess • template_preprocess_page • phptemplate_preprocess_page
theme (‘page’) • * 一个页面调用theme()次数
跟踪theme()调用 • *page_callback() 有可能调用 • *index.php 有且只调用一次theme(‘page’) • *theme()函数自己调用? • *template_preprocess() 没有调用 • *template_preprocess_page() 调用多次 • *phptemplate_preprocess_page() 调用多次
$variables • * theme_render_template() • * var_dump($variables) • * 更好的办法
Edit Theme • *条件 • * page.tpl.php • * page.tpl.php会调用哪些theme() • * theme()通过function还是template输出 • * template对应的*.tpl.php文件 • * *.tpl.php中使用了哪些变量 • *方法 • * #theme_name#_#hook_name# • * css & js • * *.tpl.php • * 重写 theme() function & template
Q & A • MSN:liaowq.box@gmail.com • QQ:913185402 • http://www.perfgeeks.com