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;
}

 

评论 (写第一个评论)