【问题标题】:How to create a Drupal rule to check (on cron) a date field and if passed set field "status" to "ended"?如何创建 Drupal 规则来检查(在 cron 上)日期字段以及是否将设置字段“状态”传递给“结束”?
【发布时间】:2013-05-05 20:25:54
【问题描述】:
我正在尝试创建一个自定义规则(使用 Rules 模块),以便每次运行 cron 时,此规则都会检查我创建的自定义内容类型中的日期字段。如果该日期已过,那么我想将列表小部件从active 设置为ended。
这是我尝试创建此规则时的结果:
- 将
React on event 设置为Cron maintenance tasks are performed
-
Add Condition > 将 Select the condition to add 设置为 Data comparison > 继续
这是问题所在:Data selectors 只有site 并且无法访问字段数据。
有什么想法我在这里出错了吗?
【问题讨论】:
标签:
drupal-7
drupal-rules
【解决方案1】:
规则条件“执行 Cron 维护任务”的问题在于,此时无法访问节点对象,因此无法对节点进行任何检查/操作。作为解决方案,请使用 Event = Node: Content is 查看,而不是 Event = Cron 维护任务被执行。您可以将其对任何内容类型保持打开状态,以便当有人访问该网站并打开至少一个页面时,将触发一些操作。
【解决方案2】:
你需要先创建一个规则组件:
- 转到规则>组件(管理员/配置/工作流/规则/组件)
- 然后创建一个新组件并从选择列表中选择'Rule'
- 为此组件设置名称并在下表中选择:
- 数据类型:文本标记
- 标签:你想要的名字
- 机器名称:使用与标签相同的名称,但此处仅设置小写和下划线
- 用法:参数
- 在组件中添加条件“数据比较”并选择node:type
- 添加您想要的其他条件
- 设置您想要的操作并保存
- 现在转到 Rules (admin/config/workflow/rules) 并创建具有 cron 维护操作的规则(正如您已经完成的那样)
- 跳转条件部分和动作:
- 新操作:添加变量
- 值:文本
- 然后将这个变量的值写成你想要循环的内容类型的机器名(如果你愿意,你可以在下面的部分中更改这个变量的名称和机器名)
- 现在添加另一个操作'Fetch entity by property'
- 实体类型值:节点
- 属性值:类型
- 数据选择器:在第 8 点创建的变量
- 现在在参数列表中添加一个循环,使用'Fetch entity by property'提供的变量
- 在循环中添加一个动作(点击循环行右侧的链接)并选择第2点创建的组件并传递循环提供的变量
我声明:我不知道它是否有效,但至少它应该引导你走向正确的道路
对不起我的英语,我希望你明白一切:)
【解决方案3】:
是的,您应该能够使用Rules 模块来实现您正在寻找的东西,但我建议您也将它与Views Rules 模块结合使用。关于这个模块的一些细节(来自它的项目页面):
将视图直接作为规则操作和循环提供,以无缝使用视图结果数据。
前面的引用可能看起来有点神秘(它可能会让你想“那又如何,这对我有什么帮助?”)。因此,有关如何使用这些模块继续前进的更多详细信息:
- 创建一个视图(使用Views),以便您拥有 1 个视图结果(行),其中包含您要处理的所有节点(与您的自定义内容类型相关,如果可能的话,使用您的日期字段进行过滤)。而该视图具有后续步骤中所需的任何字段(列),例如节点 ID、日期字段以及可能的其他字段。稍后您将需要这些 View 字段作为您的规则处理的值,“将列表小部件从
active 设置为ended*”(如您的问题所示)。重要提示:使用“规则”的视图显示类型。
- 删除“添加条件”(在您启动的自定义规则中),而是使用 Views Rules 模块迭代这些视图中的每一个,从而生成规则操作,使用称为“规则循环”的规则技术”。
- 对于规则循环中的每个迭代步骤,执行规则操作以“做你的事”(= 将列表小部件从
active 设置为 ended)。那时,您将获得来自视图结果每一列的所有数据,即所谓的规则参数。因此,此时为您在该循环中处理的节点调整该列表小部件的值是小菜一碟。
- (可选)您可能还想添加任何额外的规则条件,这也取决于您自己的想象。通常,您不能或尚未将其表示为视图过滤器。但是,如果您可以在使用视图过滤器和额外的规则条件之间进行选择,我建议您使用视图过滤器,因为这将减少您在规则循环中的迭代次数(性能!)。
简单,不是吗?