欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

用drupal 搭建一个传统留言版模块 1

Drupal模块就是由PHP写成的包含了子过程的文件集. 因为这些模块在整个站点的上下文中运行, 因此它能使用基于主引擎的所有函数,访问所有的变量和结构. 事实上,一个模块和普通的PHP文件没任何不同,下面我们将以一个实例说明模块如何建立。备注,模块基础可以看看:Drupal模块开发指南


首先,我们在sites/all/modules底下建立feedback文件夹,并在feedback文件夹下面建立3个文件。分别是 feedback.info, feedback.module, feedback.install

 

第二步,feedback.info
feedback.info 是要来记录模块的基本资料的,打开feedback.info 输入下面内容:

1
2
3
4
5
name = 留言板
description = 用drupal 做的留言板
core = 7.x
package = Drupalla
files[] = feedback.module

name 是模块名称, description 是模块说明,core是drupal核心, package是模块在会在drupal后台哪个组里面显示,files[] 是模块包含的文件。

 

第三步,feedback.install
feedback.install是要来实现数据库的表增加,删除,版本控制等功能的。下面详细的说明,首先,我们得建立留言板的数据表:

表feedback
fid               唯一id
title             留言标题
body           留言内容
email         留言发起者的邮箱
ftype           留言类型
created     创建留言的时间

实现数据表建立,我们需要调用 hook_schema(),hook_schema()是要来建立数据表的,具体详细api 介绍可以查看官网api,地址:http://api.drupal.org/api/drupal/includes%21database%21schema.inc/group/...

编辑feedback.install,我们加上下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
function feedback_schema() {
  //表名是feedback
  $schema['feedback'] = array(
    'description' => '表名是feedback.',
    'fields' => array(
      'fid' => array(
        'description' => 'The primary identifier for fid.',
        'type' => 'serial',//serial 是自动增加字段,可参看api
        'unsigned' => TRUE,//整型的每一种都有无符号(unsigned)和有符号(signed)两种类型,有符号的就可以有负数,无符号的就不能有负数。
        'not null' => TRUE,//不能为空
      ),
      'title' => array(
        'description' => '留言标题.',
        'type' => 'varchar',
        'length' => 255,
      ),
      'body' => array(
        'description' => 'feedback body.',
        'type' => 'text',
      ),
      'email' => array(
        'description' => 'feedback email.',
        'type' => 'varchar',
        'length' => 255,
      ),
      'ftype' => array(
        'description' => 'Type.',
        'type' => 'varchar',
        'length' => 255,
      ),
      'created' => array(
        'description' => 'Created Date.',
        'type' => 'int',
      ),
    ),
    'primary key' => array('fid'), //主键定义
  );
  return $schema;
}

 

好了,上面代码就能帮我们完成建表工作,可能你会问,为什么不能直接打开数据库增加一个表啊?我可以告诉你,最好别这么做,这样当卸载模块后,数据表还得手动删除。 但现在假使我们卸载了feedback,系统也还不会帮我们同时删除掉feedback 表,我们的再在feedback.install 文件调用 hook_unstall()钩子来做卸载工作,代码很简单,增加:

1
2
3
function feedback_uninstall() {
  variable_del('feedback');
}

好了,这样feedback.install就完成了。

 

第四步,feedback.module

feedback.module 可以说是模块的核心文件,大部分的功能实现,我们都是写在module文件。现在让我们试想一下,留言板该怎么的体现方式。 我们首先需要一个地址,让用户能添加留言,以猪跑啦为例,我们设定地址为http://www.drupalla.com/feedback 我们还需要一个查看所有留言的地址,为了安全,只能管理员查看,还是以猪跑啦为例,我们设定地址为:http://www.drupalla.com/admin/structure/feedback Ok,下面我们用hook_menu 建立两个地址,具体详细api 介绍可以查看官网api,http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
/**
* Implements hook_menui().
*/
function  feedback_menu() {
  // 设定地址为http://www.drupalla.com/feedback.
  $items['feedback'] = array(
    'title' => '留言',
    'description' => '留言',
    'page callback' => 'drupal_get_form',//调用系统函数 function drupal_get_form(),drupal_get_form() 是要来建立表单的。
    'page arguments' => array('feedback_form'),//给drupal_get_form参数,变成drupal_get_form('feedback_form'), feedback_form 是我们定义的一个函数 function feedback_form()
    'file' => 'feedback.pages.inc',//function feedback_form() 函数所在的文件地址
    'access arguments' => array('feedback submit'),// 访问权限控制,需要调用hook_permission()钩子。
    'type' => MENU_NORMAL_ITEM,
  );
  // 设定地址为http://www.drupalla.com/admin/structure/feedback.
  $items['admin/structure/feedback'] = array(
    'title' => '留言',
    'description' => '留言',
    'page callback' => 'feedback_view',//调用自定义函数 function feedback_view()
    'file' => 'feedback.admins.inc',//function feedback_view() 函数所在的文件地址
    'access arguments' => array('feedback view'),// 访问权限控制,需要调用hook_permission()钩子。
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

 

由于我们'access arguments' 用到了hook_permission()钩子,所以我们还得调用hook_permission()钩子,具体详细api 介绍可以查看官网api,http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct...: 由于我们上面定义了两个权限,一个是feedback submit(发表留言)权限;另外一个是feedback view(查看留言)权限。所以代码如下:

1
2
3
4
5
6
7
8
9
10
function feedback_permission() {
  return array(
    'feedback submit' =>  array(
      'title' => t('feedback submit'),
    ),
    'feedback view' =>  array(
      'title' => t('feedback view'),
    ),
  );
}

当建立起后,后台的权限控制里面,将会出现我们这两个权限选项。

 

第五步,建立feedback.pages.inc,feedback.admin.inc

因为我们在hook_menu 中设定了函数所在地址,如'file' => 'feedback.pages.inc',表示函数是放在feedback.pages.inc,所以我们还得建立这两个文件,首先是feedback.pages.inc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
//建立提交表单
function feedback_form($form, &$form_state) {
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => '简短标题',
    '#required' => TRUE,
  );
  $form['email'] = array(
    '#type' => 'textfield',
    '#title' => '您的邮箱',
    '#required' => TRUE,
  );
  $form['type'] = array(
    '#type' => 'select',
'#title' => '请选择一项',
    '#required' => TRUE,
    '#default_value' => '关于drupalla.com的一般性反馈',
    '#options' => drupal_map_assoc(array('关于drupalla.com的一般性反馈', t('建议一个新功能'), t('合作伙伴机会'), t('删除我的账户'))),
    '#required' => TRUE,
  );
  $form['body'] = array(
    '#type' => 'textarea',
'#title' => '内容',
    '#required' => TRUE,
  );
 
 
  // Add the buttons.
  $form['buttons'] = array();
  $form['buttons']['#weight'] = 100;
  $form['buttons']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('提交'),
    '#weight' => 5,
    '#submit' => array('feedback_form_submit'),//定义表单提交到数据库的函数,为function  feedback_form_submit
    '#prefix' => '<div class="feedback_form">',
    '#suffix' => '</div>',
  );
  $form['#validate'][] = 'feedback_form_validate';//定义表单验证函数,为function  feedback_form_validate
  return $form;
}
//表单提交到数据库的函数
function feedback_form_submit($form, &$form_state) {
//插入数据库
  db_insert('feedback')
    ->fields(array(
      'email' => $form_state['values']['email'],//获取表单email资料
      'ftype' => $form_state['values']['type'], //获取表单type资料
      'title' => $form_state['values']['title'],//获取表单title资料
      'body' => $form_state['values']['body'], //获取表单body资料
      'created' => time(),//获取当前时间
))->execute();
  drupal_set_message(t('感谢给我们反馈意见。我们将以最快的速度回复。<br> <a href="/">回到首页</a>'));//提交完成后,显示提示消息
}
//表单验证函数
function feedback_form_validate($form, &$form_state) {
  //这里使用正则表达式,来验证网址的有效性,注意,这里的正则表达式,包围在"/...../"之间。
  if(!preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/", $form_state['values']['email'])){
    form_set_error('email',t('您输入的邮件地址格式不正确。'));
  }
}

然后是feedback.admin.inc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function feedback_view(){//读出数据库资料,并且以table格式显示,同时分页
$output = "";
$query = db_select('feedback','f')->extend('PagerDefault');
    $query -> fields('f');
    $query -> limit(20);
$objects = $query -> execute() -> fetchAll();
$rows = array();
foreach ($objects as $key => $object) {
  $row = array();
  $row['fid'] = $object -> fid;
  $row['title'] = $object -> title;
  $row['body'] = $object -> body;
  $row['email'] = $object -> email;
  $row['ftype'] = $object -> ftype;
  $row['created'] = date("Y/m/d", $object -> created);
  $rows[] = $row;
}
 
$output .= theme('pager');
$output .= theme('table', array('rows' => $rows));
$output .= theme('pager');
return $output;
}

好了,所有前期功夫都准备好了,赶紧打开模块页,开启feedback 试一下效果。

下一篇用drupal 搭建一个传统留言版模块 2我们将会介绍,如何通过hook_theme 美化我们的留言列表。

留言板模块下载:猛击

评论

chromie的头像

URL地址的页面是本身就有的么

还有$items['admin/structure/feedback']这个路径是啥意思

来自  http://www.drupalla.com/node/434

普通分类: