使用 Resource Conflict 模块预订资源

本文将帮助你使用 Resource Conflict 模块设置一个预订内容类型,借助这一类型来实现对资源的预订。

内容类型设置

  1. 创建一个叫做 Resource 的内容类型。这一类型代表了任何可被预订的资源,例如一间房,一本书等。
  2. 再创建一个叫做 Reservation 的内容类型。
  3. 添加一个日期字段,字段需要定义截止日期为必填项。这个模块只能对这种日期字段工作。日期字段类型可以使用日期,ISO或者Unix类型。
  4. 添加一个 Entity Reference 或者 References 字段,让用户可以选择资源。
  5. 在内容类型建立后,编辑他,并浏览 Resource Confilict 的 Tab,选择刚建立的日期字段,启用冲突检测。

这个模块自带一个缺省的规则,这个规则会检查所有的激活冲突检测的 Node。在我们的例子中,我们希望把检测行为限制在 Reservation 类型的 Node 中,来防止重复预订。所以我们要创建一个新的规则。

创建规则

  1. 创建一个新的规则,被 A resource conflict node form is validated(一个资源冲突 Node Form 完成验证)触发。当一个具有资源冲突检测的内容类型中的一个Node在进行校验时,就会触发这个事件。在这里尚未完成冲突检测。
  2. 创建一个条件:Contains a resource conflict(包含一个资源冲突)。这个条件会根据日期字段进行冲突检查。
  3. 新建一个动作: Load a list of conflicting nodes(载入一个冲突 Node 列表)。被检测到冲突的 Node 会以列表的形式传递给规则,这样就可以通过循环来处理这些 Node。

现在我们需要定制规则的行为,限制结果集为已经被预定的资源。我们需要把触发规则的未保存Node和冲突列表中的成员进行比较。要达到这一目的,我们需要创建一个规则组件。

规则组件

  1. 点击右上角的组件 Tab,创建一个新组件。
  2. condition plugin,选择 Rule。这意味着我们需要创建一个小规则。这里的规则无需被事件触发。这里我们会手工调用它,并为其传递参数。
  3. 好像我们编写PHP函数一样,我们也需要为这一组件定义参数:
  4. 数据类型:node,标签:Unsaved Reservation,机读名称:unsaved_reservation
  5. 数据类型:node,标签:Conflicting Reservation,机读名称:conflicting_reservation
  6. 接下来我们为这个规则组件添加三个条件。其中两个用来把引用字段中的实体载入规则,第三个用于比较两个值是否相等:
  7. Entity has Field,选择 unsaved-reservation 进行进一步的选择。在列表中选择资源实体引用字段。
  8. Entity has Field,选择 conflicting-reservation 进行进一步的选择。在列表中选择资源实体引用字段。
  9. Data Comparison,选择 unsaved-reservation:field-resource 作为数据选择器。在下一步中,操作符选择 equals,在第二个比较项目中选择 conflicting-reservation:field-resource
  10. 现在加入一个动作 Set a form validation error(设置 Form 校验错误)。这个动作会在每个预订冲突时执行,并在 Node 提交过程中弹出信息,阻止 Form 提交。记得输入具体信息,例如“同现有预订冲突:conflicting-reservation:title”。

这样就创建好了规则组件,我们回到上一个规则的界面。

  1. 在动作中添加一个新的 loop,使用 conflict-list 作为数据选择器,规则会循环处理每个冲突的预订。
  2. 点击新加入的loop旁边的”Add Action”按钮。在列表中选择刚创建的规则组件。
  3. 为新建的组件选择两个参数。第一个 (unsaved-reservation),使用 node 作为数据选择器,这里选择的是触发了该事件的 Node。第二个参数传入list-item,这个参数是循环处理列表中的一项。(注意,这个循环是基于列表执行的。)

完成

完成上述步骤之后,可以尝试创建两个冲突的预订,看看会不会出错。

你也可以修改这些规则,例如对结果列表进行进一步过滤。

如果你以前从来没有使用过Rules,那么这部分看起来可能比较复杂。希望上面的描述足够清晰。如果上面的内容无法工作,可以在问题队列中加入一个支持请求

性能

我们看到,这个模块会把所有Node载入进行冲突检测,然后才是限制结果数量。然而如果你有几百几千个可能冲突的Node,那么就会发生性能问题。

可以通过修改模块查询冲突的方式来增强性能。这个查询的标记是 resource_conflict,所以可使用 hook_query_alter 来加入自己的条件和链接。

Rules Forms Support

如果启用了 Rules Forms Support,这个模块会把 Form 传递给任何触发了 A resource conflict was detected 事件的规则。这将会把 Node 提交 Form 暴露给规则,从而可以使用Rules Forms Support 提供的处理 Form 的各种手段。

例如,可以不再使用 Form 验证错误信息,而用该模块提供的类似动作来代替,这样你可以更好的处理资源冲突。

Avatar
崔秀龙

简单,是大师的责任;我们凡夫俗子,能做到清楚就很不容易了。

comments powered by Disqus
下一页
上一页

相关