如何在Drupal 7.2中实现表单内容审核发布逻辑?
在Drupal 7.2中实现表单审核逻辑
嘿,针对你需要给包含name、mail、comment字段的表单添加审核流程的需求,我给你两种实用方案——优先推荐用现成模块(少写代码更省心),如果是自定义表单的话再用代码实现:
方案一:用现成模块快速实现(推荐)
如果你的表单是基于Drupal内容类型创建的(比如新建一个“用户反馈”内容类型,添加name、mail、comment字段),用Workflow+Rules模块就能搞定:
1. 安装并配置Workflow模块
Workflow模块可以给内容添加状态流转,完美实现“待审核→已发布”的流程:
- 下载Drupal 7兼容的Workflow模块,上传到
sites/all/modules目录,在后台模块列表启用它。 - 进入
admin/config/workflow/workflows,点击「Add workflow」创建一个流程(比如叫“内容审核流”),添加三个状态:待审核(设为默认状态)、已发布、已拒绝。 - 给状态设置权限:只有「管理员」角色能把内容从“待审核”转到“已发布”或“已拒绝”,普通用户只能提交内容,不能修改状态。
- 把这个工作流关联到你的内容类型:进入内容类型编辑页(比如
admin/structure/types/manage/feedback)的「Workflow」标签,选择刚才创建的流程并保存。这样用户提交的内容默认处于“待审核”状态,不会直接在前端显示。
2. 配置内容访问权限
- 进入
admin/people/permissions,给普通用户/匿名用户开「创建[你的内容类型]内容」的权限,但不要给「编辑自己的内容」权限(避免用户修改待审核内容)。 - 在Workflow的权限区域,设置普通用户只能查看已发布状态的内容,管理员能查看所有状态的内容。
3. 邮件通知(可选)
如果需要提交后通知管理员,或者审核后通知用户,搭配Rules模块:
- 安装Rules模块,启用后创建两条规则:
- 触发条件:「当节点被创建且状态为待审核」,执行动作:发送邮件给管理员,包含内容的审核链接。
- 触发条件:「当节点状态变为已发布/已拒绝」,执行动作:发送邮件给提交用户(用表单里的mail字段值)。
方案二:自定义代码实现(针对自定义Form API表单)
如果你的表单是自己用Form API写的自定义表单,就需要写点代码来处理审核逻辑:
1. 保存表单数据并标记待审核
在表单的submit回调里,把数据存到自定义数据库表,标记为待审核状态(比如status=0),同时给管理员发通知邮件:
function mymodule_feedback_submit($form, &$form_state) { // 获取表单提交的数据 $submission = array( 'name' => $form_state['values']['name'], 'mail' => $form_state['values']['mail'], 'comment' => $form_state['values']['comment'], 'status' => 0, // 0=待审核,1=已发布 'created' => REQUEST_TIME, ); // 插入自定义数据表(记得先在hook_install()里创建这个表) db_insert('mymodule_feedback')->fields($submission)->execute(); // 给管理员发审核通知邮件 $admin_mail = variable_get('site_mail', 'admin@example.com'); $subject = '新的用户反馈需要审核'; $body = "用户 {$submission['name']} 提交了反馈:\n\n{$submission['comment']}\n\n点击审核:" . url('admin/content/feedback', array('absolute' => TRUE)); drupal_mail('mymodule', 'feedback_pending', $admin_mail, language_default(), array('body' => $body), $admin_mail); drupal_set_message('你的反馈已提交,等待管理员审核~'); }
2. 创建管理员审核页面
添加菜单路径,让管理员查看待审核内容并操作:
function mymodule_menu() { $items = array(); // 待审核列表页 $items['admin/content/feedback'] = array( 'title' => '待审核反馈', 'page callback' => 'mymodule_feedback_admin_list', 'access arguments' => array('administer site configuration'), // 仅管理员可访问 'type' => MENU_NORMAL_ITEM, ); // 审核通过回调 $items['admin/content/feedback/%/approve'] = array( 'title' => '审核通过', 'page callback' => 'mymodule_feedback_approve', 'page arguments' => array(2), 'access arguments' => array('administer site configuration'), 'type' => MENU_CALLBACK, ); // 拒绝回调 $items['admin/content/feedback/%/reject'] = array( 'title' => '拒绝', 'page callback' => 'mymodule_feedback_reject', 'page arguments' => array(2), 'access arguments' => array('administer site configuration'), 'type' => MENU_CALLBACK, ); return $items; } // 渲染待审核列表 function mymodule_feedback_admin_list() { $header = array('姓名', '邮箱', '反馈内容', '提交时间', '操作'); $rows = array(); $result = db_select('mymodule_feedback', 'f') ->fields('f') ->condition('status', 0) ->execute(); foreach ($result as $row) { $rows[] = array( $row->name, $row->mail, truncate_utf8($row->comment, 100), format_date($row->created), l('通过', "admin/content/feedback/{$row->id}/approve") . ' | ' . l('拒绝', "admin/content/feedback/{$row->id}/reject"), ); } return empty($rows) ? '<p>暂无待审核反馈</p>' : theme('table', array('header' => $header, 'rows' => $rows)); } // 审核通过处理 function mymodule_feedback_approve($id) { // 更新状态为已发布 db_update('mymodule_feedback') ->fields(array('status' => 1)) ->condition('id', $id) ->execute(); // 给用户发通过通知 $feedback = db_select('mymodule_feedback', 'f') ->fields('f') ->condition('id', $id) ->execute() ->fetchObject(); $subject = '你的反馈已通过审核'; $body = "你提交的反馈已发布,内容如下:\n\n{$feedback->comment}"; drupal_mail('mymodule', 'feedback_approved', $feedback->mail, language_default(), array('body' => $body), variable_get('site_mail')); drupal_set_message('反馈已通过审核'); drupal_goto('admin/content/feedback'); } // 拒绝处理 function mymodule_feedback_reject($id) { db_delete('mymodule_feedback')->condition('id', $id)->execute(); // 可选:给用户发拒绝通知邮件 drupal_set_message('反馈已被拒绝'); drupal_goto('admin/content/feedback'); }
3. 前端显示已审核内容
在前端页面查询状态为1的内容并渲染:
function mymodule_feedback_public_page() { $header = array('姓名', '反馈内容', '提交时间'); $rows = array(); $result = db_select('mymodule_feedback', 'f') ->fields('f') ->condition('status', 1) ->orderBy('created', 'DESC') ->execute(); foreach ($result as $row) { $rows[] = array( $row->name, $row->comment, format_date($row->created), ); } return empty($rows) ? '<p>暂无已发布的反馈</p>' : theme('table', array('header' => $header, 'rows' => $rows)); }
注意事项
- 记得给自定义模块创建
.info文件,确保Drupal能识别它:
name = 用户反馈审核模块 description = 处理用户反馈的提交与审核流程 core = 7.x package = 自定义模块
- Drupal 7.2版本比较老旧,确保使用的模块都兼容这个版本,避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者user3386779
相关产品推荐
相关产品推荐

