Rules模块也是Drupal社区中使用频率较高的贡献模块之一.安装后提供一些默认的功能,足以满足很多强大的自动化处理.但是某些时候,我们在一些特定的场景想使用rules模块提供的API实现自己特定业务逻辑的规则.
这几天的项目,正好有这个需求.我就尝试写了一个自定义的rules实现了把新闻一键推送到微信接口的功能.此篇需要有一些PHP编程基础.
实现此功能需要以下依赖模块.
1.flag
2.views
3.rules
具体实现的内容是单击某个新闻中的flag标记,触发自定义的rules执行推送到微信接口的逻辑.以下是具体步骤.
[创建新闻内容类型]
如何创建内容类型就不多说了,基本上通过cck的界面就可以实现.以下是效果图.
[设置flag模块]
目的是在新闻node下创建一个按钮然后用它来触发推送的action.
打开网址admin/structure/flags后,添加一个flag.如图所示.
单击添加标识.
标题:便于后台的管理.这里写<推送新闻至微信> ,机读名称随意.
标示链接文字:这里的文字会显示在新闻node页面,此处写<推送到微信>.
标示链接说明:此处可选.(其作用是鼠标放到上述标示链接文字时跳出的文字提示).此处写<推送该新闻到微信>.
已标示信息:当单击标示链接文字后,处理触发action过程中显示的提示文字.<已推送至微信>
取消提示链接文字:当上述过程结束后,此处标识更改显示的文字.<已推送至微信>
标示访问权限:候选可以点击此标示的用户组.
不允许取消标示的文本: 这里同取消提示链接文字.
由于我们只针对新闻内容类型,因此捆绑中选择该内容类型.保存后,我们就完成了对flag模块的必要设置.
下图就是实现flag设置后的效果.注意图中多了一个<推送到微信>的链接.
[设置新闻管理视图]
为了方便统一管理新闻的推送,我们是视图模块创建一个新闻列表,并在每个新闻行加上执行推送的链接.
以下是创建视图列表时的要点.
在高级区域的关联中,我们要选择->标示:节点 标记 ,这个是因为我们在之前创建标示设置的时候,选择的类型是节点.
如图所示,标识符可以取名为<微信推送>,这是为了方便管理.其他部分默认即可.
关联区域设置完,就可以添加新闻内容的字段,并可以添加标示的链接,如图所示.
以下是输出的结果,你可以看到在推送栏下多了之前我们创建过的推送到微信链接(推送后会变为已推送至微新),此处的变化结果是之前创建标示时的变化.到此位置前期的准备工作.
---------------------------------------------------------------------------------------------------------
[创建自定义的rules]
现在我们需要在新闻列表页,当点击推送到微信,触发我们需要的业务逻辑.也就是把对应的新闻内容推送到我们的微信接口.
这需要我们利用rules提供的api自己编写一段代码.rules的实现需要.event,condition,action.
由于flag模块已经默认已经提供了event(可以在定义rules界面选择),我们只需要单独定义一个action即可.
这个action就是定义具体推送到微信接口的业务逻辑.
按照drupal编码的规则,我们需要创建一个custom模块,我们暂且就取名为custom. 分别创建custom.info custom.module . Custom.module可以是一个空文件.
根据rules的api要求.我们需要另外创建一个<模块名.rules.inc>的文件,我们的模块名为custom,因此该文件名为custom.rules.inc.
我们现在利用hook_rules_action_info()实现自定义的action!
custom_rules_action_info() 的具体写法.
首先它返回多维数组,第一层的key就是该action的回调函数(默认情况下),上图为custom_action_push_weixin_news,这个就是最终要实现推送业务逻辑的回调函数名称.
第二层的数组中,如上图所示,第一个key,label是在rules管理界面中显示的管理标题名, group就是这个管理标题显示在哪个层级下面,如图所示为<智慧禅城>.
第三个key,parameter为传递给前面回调函数的参数.由于我们需要把新闻node发送到微信,所以需要知道哪个node. parameter也是多维数组,这里需要注意的key就是传递给回调函数的变量名(需要遵守PHP变量命名规范).它的值也是数组,请type为rules所定义的数据类型,具体参看https://www.drupal.org/node/298633 链接中的Type Name. label是此参数的标签(根据自己的需要命名,save的定义可选.
下面我们要定义custom_action_push_weixin_news回调函数的具体执行逻辑了.
我们暂时在下方写个空逻辑的回调函数.
function custom_action_push_weixin_news($node) {}
注意此函数的参数名称,需要和custom_rules_action_info() 中定义的parameter多维数组中的key一致.
我们现在打开rules模块的管理界面,创建一个rules.
注意图中的触发事件选项列表,图中的标示组中存在2个选项,这个是flag模块自动提供的event(触发事件),这里选择<XXXXXX的节点已被标识>.名称和标签项,根据自己的需要可任意填写.
下一步进入了我们刚选好的rules触发事件的设置页面.
Event我们刚才已经设置后,即当点击推送至微信的标示事件发生时触发某个action.
条件区域,此情况下可省略,因为我们我们的触发事件标识的点击只能发生在新闻内容类型下,第一步设置中已经决定了条件(不需要在判断其他提交).
如图开始添加action.
这个时候我们会看到action的选择列表中是不是多出了我们自定义的action名称->智慧禅城组->推送微信新闻.这个就是custom_rules_action_info() 中定义的group和label.
在数据选择器中选择要处理的对象,我们的回调函数定义的参数是node,此处选择为flagged-node,保存.
至此我们的配置已经完成.不过由于我们执行推送微信的回调函数目前还是空的还没有完全执行业务逻辑.
后面需要有PHP基础的人员,编码function custom_action_push_weixin_news($node) 函数的逻辑,
后期的业务逻辑基本没有和drupal有太大的关系,大部分是定义和微信接口的交互的逻辑,
唯一有关系的就是通过参数node(此node为对象)生成需要推送的数据.例如新闻的名称为$node->title,可使用dpm($node)查看需要生成的字段名.
对rules 给了一个贯穿性的讲解
正对rules的概念模糊不清的时候,一个串联 把rules知识体系给讲透了,不错。
给力啊 真赞!