使用 Resource Conflict 模块预订资源
本文将帮助你使用 Resource Conflict 模块设置一个预订内容类型,借助这一类型来实现对资源的预订。
内容类型设置
- 创建一个叫做 Resource 的内容类型。这一类型代表了任何可被预订的资源,例如一间房,一本书等。
- 再创建一个叫做 Reservation 的内容类型。
- 添加一个日期字段,字段需要定义截止日期为必填项。这个模块只能对这种日期字段工作。日期字段类型可以使用日期,ISO或者Unix类型。
- 添加一个 Entity Reference 或者 References 字段,让用户可以选择资源。
- 在内容类型建立后,编辑他,并浏览 Resource Confilict 的 Tab,选择刚建立的日期字段,启用冲突检测。
这个模块自带一个缺省的规则,这个规则会检查所有的激活冲突检测的 Node。在我们的例子中,我们希望把检测行为限制在 Reservation 类型的 Node 中,来防止重复预订。所以我们要创建一个新的规则。
创建规则
- 创建一个新的规则,被
A resource conflict node form is validated
(一个资源冲突 Node Form 完成验证)触发。当一个具有资源冲突检测的内容类型中的一个Node在进行校验时,就会触发这个事件。在这里尚未完成冲突检测。 - 创建一个条件:
Contains a resource conflict
(包含一个资源冲突)。这个条件会根据日期字段进行冲突检查。 - 新建一个动作:
Load a list of conflicting nodes
(载入一个冲突 Node 列表)。被检测到冲突的 Node 会以列表的形式传递给规则,这样就可以通过循环来处理这些 Node。
现在我们需要定制规则的行为,限制结果集为已经被预定的资源。我们需要把触发规则的未保存Node和冲突列表中的成员进行比较。要达到这一目的,我们需要创建一个规则组件。
规则组件
- 点击右上角的组件 Tab,创建一个新组件。
condition plugin
,选择Rule
。这意味着我们需要创建一个小规则。这里的规则无需被事件触发。这里我们会手工调用它,并为其传递参数。- 好像我们编写PHP函数一样,我们也需要为这一组件定义参数:
- 数据类型:
node
,标签:Unsaved Reservation
,机读名称:unsaved_reservation
。 - 数据类型:
node
,标签:Conflicting Reservation
,机读名称:conflicting_reservation
。 - 接下来我们为这个规则组件添加三个条件。其中两个用来把引用字段中的实体载入规则,第三个用于比较两个值是否相等:
- Entity has Field,选择
unsaved-reservation
进行进一步的选择。在列表中选择资源实体引用字段。 - Entity has Field,选择
conflicting-reservation
进行进一步的选择。在列表中选择资源实体引用字段。 - Data Comparison,选择
unsaved-reservation:field-resource
作为数据选择器。在下一步中,操作符选择equals
,在第二个比较项目中选择conflicting-reservation:field-resource
。 - 现在加入一个动作
Set a form validation error
(设置 Form 校验错误)。这个动作会在每个预订冲突时执行,并在 Node 提交过程中弹出信息,阻止 Form 提交。记得输入具体信息,例如“同现有预订冲突:conflicting-reservation:title”。
这样就创建好了规则组件,我们回到上一个规则的界面。
- 在动作中添加一个新的 loop,使用
conflict-list
作为数据选择器,规则会循环处理每个冲突的预订。 - 点击新加入的loop旁边的”Add Action”按钮。在列表中选择刚创建的规则组件。
- 为新建的组件选择两个参数。第一个 (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 验证错误信息,而用该模块提供的类似动作来代替,这样你可以更好的处理资源冲突。