使用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函数一样,我们也需要为这一组件定义参数:
    • 数据类型:node,标签:Unsaved Reservation,机读名称:unsaved_reservation
    • 数据类型:node,标签:Conflicting Reservation,机读名称:conflicting_reservation
  4. 接下来我们为这个规则组件添加三个条件。其中两个用来把引用字段中的实体载入规则,第三个用于比较两个值是否相等:
    • Entity has Field,选择unsaved-reservation进行进一步的选择。在列表中选择资源实体引用字段。
    • Entity has Field,选择conflicting-reservation进行进一步的选择。在列表中选择资源实体引用字段。
    • Data Comparison,选择unsaved-reservation:field-resource作为数据选择器。在下一步中,操作符选择equals,在第二个比较项目中选择conflicting-reservation:field-resource
  5. 现在加入一个动作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验证错误信息,而用该模块提供的类似动作来代替,这样你可以更好的处理资源冲突。