首先,我们在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 美化我们的留言列表。
留言板模块下载:猛击
评论
我有问题
URL地址的页面是本身就有的么
还有$items['admin/structure/feedback']这个路径是啥意思
注释里都写了额...设定管理反馈页面的地址为http:/
注释里都写了额...设定管理反馈页面的地址为http://www.drupalla.com/admin/structure/feedback.