1.1 Drupal页面开发案例1 - 项目列表页
本文从一个网站页面实例出发,讲解drupal是如何处理呈现一个页面的。http://www.qingfan.com/zh/project_list 这个是项目列表页面。 首先在drupal中我们要定义一个页面,是使用hook_menu()钩子函数,假定我们是在模块:custom_project里定义,代码见辅助内容区:
我们先来简单解析下代码: 大家看到函数的命名格式是:模块名_menu(),每个模块都可以以这样的方式来定义页面被drupal识别。 然后project_list就是我们要定义的页面地址,到最后访问时,就是:域名/project_list这样。 title参数是定义页面的标题,page callback是指定页面的回调函数,file参数是指定回调函数所在的文件,access callback是指定该页面的访问权限的回调函数,也可以直接赋予TRUE表示任何人都可访问。type参数是声明页面的类型,MENU_CALLBACK就是最常用的类型,其它的这里暂不予详细介绍。
/**
* Implements hook_menu().
*/
function custom_project_menu() {
// 项目列表页面
$items['project_list'] = array(
'title' => '项目列表',
'page callback' => 'project_list',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
'file' => 'custom_project.pages.inc',
);
return $items;
}
然后我们去custom_project.pages.inc文件里(若没有就创建一个,就在模块根目录下)定义这个回调函数,代码见辅助内容区:
写好后,清除下drupal的缓存即可生效(模块要保证已启用哦),访问下project_list页面,就会看到中间主要内容部分显示了你在页面回调函数里返回的内容。 这里实验如果没没问题的话,我们接着往下: 按照这个页面的设计,我们要在回调里返回的内容应该有:1.banner,2.项目查询表单,3.项目列表结果。(页面的header和footer部分是全站统一的设计,我们就将其放在全局的header.php和footer.php了,然后在页面模版里将其include引入即可) 内容还是不少的,所以我们准备定义一个模版来让前端先把前端部分做好。
/**
* Page callback of menu - 'project_list'.
*/
function project_list() {
$output = '';
$output .= '这里是项目列表页面的内容';
return $output;
}
如何定义一个新模板呢?要先介绍下drupal的hook_theme钩子函数,它可以让我们来声明新的主题来指定模版,废话少说先上代码示例(见辅助内容区):
我们定义了一个新的主题叫project_list,然后给主题定义了一个可用变量叫projects,就是项目列表的数据,然后通过template参数指定了一个模版文件。这个路径是相对于当前模块的,我们在drupal当前启用的主题里也放一个这个模版来使用即可。文件名叫:project-list.tpl.php。 我们先让前端去在这个模版里添加前端代码。
/**
* Implements hook_theme().
*/
function custom_project_theme() {
return array(
'project_list' => array(
'variables' => array('projects' => NULL),
'template' => 'templates/project-list'
),
);
)
回到我们的页面回调函数,我们需要改成调用这个主题模版来返回显示内容,代码见辅助内容区:
我们通过theme函数调用了project_list主题,并传入了projects变量的值,这样在project-list.tpl.php模版文件里就可以使用projects变量了,等前端完成工作,我们就套用即可。
/**
* Page callback of menu - 'project_list'.
*/
function project_list() {
$output = '';
// 获取项目列表数据
$projects = array();
$output .= theme('project_list', array('projects' => $projects));
return $output;
}