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

这里的技术是共享的

You are here

一个drupal网站的审核发布功能实现 有大用

一个drupal 7网站,前期工作基本结束,到文章审核发布的环节了。于是考查了几个drupal的类似功能的模块。

首先是workbench suite。这是一个系列,详细介绍在前面的文章里提到,不再赘述。简单来说,workbench提供了个人内容管理的工作区。workbench access提供了内容协同工作的功能,树形结构,每个节点位置的人员可以修改同一节点或子节点的内容。用在协同工作的环境里。workbench moderation提供了工作流的概念,提供一种机制让内容从创建开始,经过可定制的不同状态,由具有不同权限的人批准以后再发布。只是权限不够细致, 默认只提供对所有内容的权限,而不能细分。

其次是revisioning。相对workbench的大场面来说,revisioning的特点是务实。revisioning并不提供工作流 的概念,节点只有两种状态:等待发布、发布。revisioning提供了对node revision的管理,而且权限可以设置到每种node type。对于按node type划分栏目的站点来说,权限分配不是什么难事。

还有taxonomy access control模块。因为这个站点是按照taxonomy划分栏目的,所以想用TAC模块配合workbench moderation实现分栏目的发布控制,但是最终失败了。TAC模块里只有view,update,delete三种权限,而发布或撤消发布都在 update里,并不能单独被控制。而且TAC也不能解决对未发布站点的访问控制。

经过这次的事情,体会到drupal对于复杂网站的实现还是比较麻烦的。当然,如果勤于写代码,也是可以实现的。写代码的问题是,drupal已经是一个比较复杂的系统了,要熟悉它了解它,是需要花大量时间和经历的。而这种知识的积累,对于非专业drupal开发人员来说,一方面是积累比较慢,另一 方面是一段时间接触较多时有积累,而当另一段时间不再接触时,就会慢慢忘掉一些知识。这是一个很麻烦的事。对于象我这样的人来说,还是习惯基于框架开发。 因为经常使用,所以会比较不容易忘记。

drupal有它的长处,对于小型比较简单的网站,drupal完全可以胜任,而且可以大量节省开发时间。但是对于比较大的或比较复杂的网站,还是基于框架开发比较好。

这个站点的发布审核,最终选用了workbench + workbench moderation + 自己代码。

内容编辑人员开放的权限(在注册用户的基础上):查看自己未发布的内容、查看内容修订、恢复内容修订、删除内容修订,某个节点类型的权限(创建新内 容、编辑自己内容、删除自己内容)、查看管理员主题、使用管理工具条、Access My Workbench、View moderation history、View the moderation messages on a node、Use “My Drafts” workbench tab、Moderate all content from Draft to Needs Review、Moderate all content from Needs Review to Draft。

内容审核人员开放的权限(在内容编辑人员的基础上):某个节点类型(编辑任何内容、删除任何内容)、View all unpublished content、Unpublish the current live revision、Use “Needs Review” workbench tab、Moderate all content from Needs Review to Published。

这样的设置,还没有完全解决分栏目审核发布的问题。因为具有审核权限的人员将看到系统里所有等待发布的内容,并有权限发布它们。

于是在自己的模块里通过hook_node_access实现详细的权限控制。

  1. 通过hook_permission定义所需要的权限

  2. 在hook_node_access里,根据node type和taxonomy的值,决定访问权限。

这样做过以后,权限控制住了,但还有一个问题,在workbench moderation的needs review里,还是会显示所有的needs review的节点。使用hook_view_pre_render解决。

function ustcpress_views_pre_render(&$view) {
    if ($view->name ==  "workbench_moderation" && $view->current_display == "needs_review_page") {
        //处理 workbench_moderation的needs_reivew_page。
        //决定处于needs review状态的节点是否显示在这个页面上
        foreach ($view->result as $k=>$v) {
            $nid=$v->node_nid;
            $node = node_load($nid); //以node当前的状态决定是否显示
            if (!node_access('view', $node)) unset($view->result[$k]);
        }
    }
}

还有一个问题,在workbench moderation的needs review页面,如果要查看节点内容再审核,就会链接到节点页面。再返回needs review页面时,需要从管理菜单中点击进入。有点麻烦。打开needs review对应的view,把标题中的Link this field to the original piece of content取消,打开rewrite result,选中 ,link path中录入 node/[nid_1],target中录入_blank。 这样做过以后,直接访问admin/workbench/needs-review,已经可以达到目的,但是从管理菜单中打开My Workbench,再点击NEEDS REVIEW,还是不行。分析HTML发现,target=”_blank”被改成了target=”_parent”,应该是ajax修改的, 而且地址也变成了 workbench#overlay=admin/workbench/needs-review。在网上搜索,发现是modules/overlay /overlay-parent.js的问题。打开这个文件,570行:

$target.attr('target', '_parent');

改成

if (!$target.attr('target')) { $target.attr('target', '_parent'); } 问题解决。


一Drupal网站审核发布流程的实现(改进版)



来自  http://blog.sina.com.cn/s/blog_70121e200100yiir.html


普通分类: