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

这里的技术是共享的

You are here

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

一Drupal网站,审核发布流程的实现。一篇文章发布经历4个状态:draft, needs review, review pass, publish。

一般流程是:

  1. 录入人员先录入文章,此时处于draft状态
  2. 录入完成以后,提交审核,此时处于needs_review状态
  3. 审核通过以后,等待发布,此时处于review_pass状态
  4. 发布以后可见。

用到的模块:workbench + workbench moderation。

在不同的环节,需要不同的角色去完成相应的动作。除了录入人员以外,还需要有审核人员和发布人员。最基本的角色就是三个:录入、审核、发布。同时要求权限划分到栏目(用taxonomy来识别)。

状态以及状态转换用workbench moderation实现。workbench moderation允许一个节点同时有两个状态:一个发布状态和一个其他状态。drupal原始设计中,一个NODE只有一个状态,而且总是 “当前” 的状态(最新的状态)。workbench moderation允许在一个发布节点上,再创建一个draft revision,原来的发布节点内容不变。新的draft revision走流程到发布时替换旧的发布内容。

在drupal中完成这个工作还是比较麻烦的。

  1. 在workbench moderation中定义好几个状态,并设置好对应的node type。这一步是workbench moderation的工作
  2. 在自定义的模板中,通过hook_permissions,按照栏目定义权限。因为栏目是按taxonomy区分的,所以实际上就是按照对应的 taxonomy term的列表来定义权限。对每个t erm,总共5个权限:create modify review publish delete。
  3. 对一个节点的某个权限,实际上是指对这个节点的所有所属栏目都有对应的权限。
  4. 在hook_node_access中定义节点访问权限。hook_node_access中只有create,  update, delete, view这几种权限的控制,而且hook_node_access中的node是live revision。对于workbench moderation来说,当有publish的revision时,传入的是published revision,否则是当前的revision。
    • view控制对节点的查看权限。这里没有进一步控制。原因是,当一个节点有一个published revision和一个current revision时,函数没有办法区分当前是要获取那个revision的view权限,因而这里没有办法进行控制。对view的控制,后来通过对菜单项 node/%node的access callback函数的修改进行控制。后面介绍。
    • update:update不仅包含对节点的修改,包括对节点的状态改变,也需要update权限。因此具有modify, review, publish权限的人都应该具有节点的current revison的update权限。而unpublish一个节点时,则需要对published revision的update权限。所以这里只能实现粗略的update权限控制,只要对一个节点的published revision或current revision具有modify, review, publish权限,都给update权限。当前revision(因为编辑总是对当前revision操作)的作者在文章处于draft或 needs_review时也需要有update权限(needs_review状态改变成draft时需要update权限)。更详细的权限控制,在 hook_node_validate里,以及进行moderate操作时控制。
    • delete:delete权限没有update复杂。delete一个节点时,
      • 如果节点已经发布,则需要有对发布节点的publish以及对published revision 和 current revision 的 delete权限才可以操作;、
      • 删除未发布节点,需要有对应的delete权限才可以操作。
      • 如果未发布,当前状态是draft,创建者及当前revision作者都是本人,可删除
    • create:最简单的权限控制,检查是否有对应node type的任一栏目的create权限即可操作。create时还没有栏目信息,所以不能进一步的控制。在hook_node_validate里进一步控制。
  5. 在hook_node_validate里控制对节点的修改。当进行保存操作时,在这个钩子里,进一步检查权限。这里传入的是当前正在修改的revision,而不是live revision。这里的规则是:
    • 草稿自己可以修改。即当前revision的修改者是自己,同时状态是draft
    • 非草稿,具有节点的modify权限即可修改。
    • 如果是新建,则具有节点的create权限权限即可。
    • 注意:这里没有更进一步限制needs_review和review_pass的修改权限。这种中间状态到底需要不需要限制修改,实在不好判断。
  6. 对恢复修订的权限进行控制。workbench moderation接管了drupal的恢复修订动作,通过node_revision_revert_confirm 表单进行处理,所以在 workbench moderation node_revision_revert_confirm_validate 里进行控制。workbench moderation没有定义这个函数,所以在自己的module里实现。
    • revert revision,相当于创建了一个新的revision,所以可以按照修改节点的权限进行控制。
  7. 对unpublish的控制。workbench moderation的unpublish是通过workbench_moderation_node_unpublish_form表单进行的,所以在 workbench_moderation_node_unpublish_form_validate里可以控制。
    • 规则是,对published revision有发布权限,即可unpublish。
  8. 对moderate的控制。workbench moderation的moderate操作通过workbench_moderation_moderate_form表单进行,但是 workbench moderation已经实现了对应的validate函数。没办法,只要在相应的validate函数里加一行,指向我们自己的函数,在这里实现对 moderate动作的控制。这个表单里,提供了原状态和新状态,所以比较容易实现。不再细述。
  9. 下面的操作,需要通过hook_menu_alter修改某些菜单项的access callback,为了保证我们的修改不被其他模块改掉,在system表里,把自己模块的weight调大一些,以使他们后执行,保证hook_menu_alter的修改是有效的。
  10. workbench moderate定义了一些直接通过 菜单项动作进行moderate操作而没有经过moderate 表单,需要定义对应菜单项的access callback钩子进行控制权限。这些操作都是通过 node/%node/moderation/%/change-state/% 进行的,所以定义这个菜单项的access callback钩子即可,在hook_menu_alter里进行,不再细述。
  11. 查看节点的未发布revision时,需要通过对应菜单项的access callback钩子进行访问权限控制。一供两个菜单项:node/%node和node/%node/draft。node/%node是系统定义的,而node/%node/draft是workbench moderation定义的。在hook_menu_alter里定义。
  12. 定义一个view,列出等待发布的node。参照needs review的view即可。needs_review view,workbench moderation已经定义过了。
  13. 通过hook_views_pre_render,对呈现给用户的view的内容进一步过滤。workbench moderation定义的needs_view的view或我们自己定义的view,没有办法加进更复杂权限规则,所以那里列出的比用户能处理的内容多。在这个钩子里,把用户不能处理的内容清除,以提供一个更好的工作环境。
  14. node edit form的预先处理,不要等到validate时再告诉没有修改权限

关于权限设置:

  1. 录入权限。
    • 使用管理工具条
    • 查看管理主题
    • 查看内容修订
    • 恢复内容修订
    • Access My Workbench
    • View Moderation History
    • View the moderation messages on a node
    • Use “My Drafts” workbench tab
    • Moderate all content from 草稿 to 提交审核
    • Moderate all content from 提交审核 to 草稿
    • 相应栏目的create,modify
  2. 审核权限
    • 使用管理工具条
    • 查看管理主题
    • 查看内容修订
    • Access My Workbench
    • View Moderation History
    • View the moderation messages on a node
    • Use “Needs Review” workbench tab
    • Moderate all content from 提交审核 to 审核通过
    • Moderate all content from 审核通过 to 提交审核
    • 相应栏目的review权限
  3. 发布权限
    • 使用管理工具条
    • 查看管理主题
    • 查看内容修订
    • 删除内容修订
    • Access My Workbench
    • View Moderation History
    • View the moderation messages on a node
    • Unpublish the current live revision
    • Use “Needs Review” workbench tab
    • Moderate all content from 审核通过 to 发布
    • 相应栏目的publish权限
普通分类: