You are here

10 将rules规则导出到代码里面

admin 的头像
Submitted by admin on 星期四, 2015-09-17 08:52

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

我们实现了在新建节点时,使用rules自动创建一个面包屑对象。现在我们将这个规则克隆一下,将克隆后的名字改为“breadcrumb for node update”,并保存。接着,添加一个新的事件“After updating existing content”(在更新已有内容之后),删除原来的事件After saving new content(新建内容之后)。这样当系统更新节点时,我们也会自动的更新对应的面包屑对象。

接着,新建一个规则“breadcrumb for term create”,事件为After saving a new term,配置好的动作为:

图片1.png 

然后以它为基础,克隆一份,将克隆后的命名为“breadcrumb for term update”,添加事件After updating an existing term,删除原来的事件。保存即可。

这样,当创建一个分类术语时,Rules会自动为它创建一个面包屑对象,最后生成的面包屑和系统自带的是略有区别的,在我们的面包屑对象里面,最前面是词汇表的链接,同时包含了当前分类术语。其它都和系统默认的一致。

现在导航到admin/config/workflow/rules页面,点击规则“breadcrumb for node create”右边的export链接,rules会为我们生成代码形式。

图片2.png 

我们要做的工作就是,新建一个文件breadcrumb2.rules_defaults.inc,在这里面输入以下代码:

<?php

/**

 * @file

 * breadcrumb2.rules_defaults.inc

 */

 

/**

 * Implementation of hook_default_rules_configuration().

 */

function breadcrumb2_default_rules_configuration() {

  $items = array();

  $items['rules_breadcrumb_for_node_create'] = entity_import('rules_config', ' ');

  return $items;

}

在这里,$items的键使用的是规则的机读名字'rules_breadcrumb_for_node_create',我们使用了函数entity_import负责导入,第一个参数为实体类型,这里为'rules_config',第二个参数,就是导出的代码;这个函数的姐妹函数应为entity_export,负责导出的,都是Entity API模块提供的。将我们导出的代码复制粘贴到下面这句代码的最后的两个单引号之间:

$items['rules_breadcrumb_for_node_create'] = entity_import('rules_config', '复制粘贴到这里');

最终效果:

function breadcrumb2_default_rules_configuration() {

  $items = array();

  $items['rules_breadcrumb_for_node_create'] = entity_import('rules_config', '{ "rules_breadcrumb_for_node_create" : {

    "LABEL" : "breadcrumb for node create",

    "PLUGIN" : "reaction rule",

    "REQUIRES" : [ "rules", "breadcrumb2" ],

    "ON" : [ "node_insert" ],

    "DO" : [

      { "entity_create" : {

          "USING" : { "type" : "breadcrumb2" },

          "PROVIDE" : { "entity_created" : { "breadcrumb" : "Breadcrumb" } }

        }

      },

      { "data_set" : { "data" : [ "breadcrumb:path" ], "value" : "node\/[node:nid]" } },

      { "breadcrumb2_append_breadcrumb_trail" : {

          "breadcrumb" : [ "breadcrumb" ],

          "title" : "[node:type-name]s",

          "url" : "[node:type]s"

        }

      },

      { "breadcrumb2_fetch_lightest_term_from_node" : {

          "USING" : { "node" : [ "node" ] },

          "PROVIDE" : { "lightest_term" : { "lightest_term" : "First term" } }

        }

      },

      { "breadcrumb2_taxonomy_get_parents_all" : {

          "USING" : { "taxonomy_term" : [ "lightest-term" ] },

          "PROVIDE" : { "parent_terms" : { "parent_terms" : "Parent terms" } }

        }

      },

      { "LOOP" : {

          "USING" : { "list" : [ "parent-terms" ] },

          "ITEM" : { "parent_term" : "Parent term" },

          "DO" : [

            { "breadcrumb2_append_breadcrumb_trail" : {

                "breadcrumb" : [ "breadcrumb" ],

                "title" : "[parent-term:name]",

                "url" : "[node:type]s\/category\/[parent-term:tid]"

              }

            }

          ]

        }

      }

    ]

  }

}');

  return $items;

}

接着,我们把其余的规则,也导出来,放到代码里面:

function breadcrumb2_default_rules_configuration() {

  $items = array();

……

  $items['rules_breadcrumb_for_node_update'] = entity_import('rules_config', '{ "rules_breadcrumb_for_node_update" : {

    "LABEL" : "breadcrumb for node update",

    "PLUGIN" : "reaction rule",

    "REQUIRES" : [ "rules", "breadcrumb2" ],

    "ON" : [ "node_update" ],

    "DO" : [

      { "entity_create" : {

          "USING" : { "type" : "breadcrumb2" },

          "PROVIDE" : { "entity_created" : { "breadcrumb" : "Breadcrumb" } }

        }

      },

      { "data_set" : { "data" : [ "breadcrumb:path" ], "value" : "node\/[node:nid]" } },

      { "breadcrumb2_append_breadcrumb_trail" : {

          "breadcrumb" : [ "breadcrumb" ],

          "title" : "[node:type-name]s",

          "url" : "[node:type]s"

        }

      },

      { "breadcrumb2_fetch_lightest_term_from_node" : {

          "USING" : { "node" : [ "node" ] },

          "PROVIDE" : { "lightest_term" : { "lightest_term" : "First term" } }

        }

      },

      { "breadcrumb2_taxonomy_get_parents_all" : {

          "USING" : { "taxonomy_term" : [ "lightest-term" ] },

          "PROVIDE" : { "parent_terms" : { "parent_terms" : "Parent terms" } }

        }

      },

      { "LOOP" : {

          "USING" : { "list" : [ "parent-terms" ] },

          "ITEM" : { "parent_term" : "Parent term" },

          "DO" : [

            { "breadcrumb2_append_breadcrumb_trail" : {

                "breadcrumb" : [ "breadcrumb" ],

                "title" : "[parent-term:name]",

                "url" : "[node:type]s\/category\/[parent-term:tid]"

              }

            }

          ]

        }

      }

    ]

  }

}');

 

  $items['rules_breadcrumb_for_term_create'] = entity_import('rules_config', '{ "rules_breadcrumb_for_term_create" : {

    "LABEL" : "breadcrumb for term create",

    "PLUGIN" : "reaction rule",

    "REQUIRES" : [ "rules", "breadcrumb2", "taxonomy" ],

    "ON" : [ "taxonomy_term_insert" ],

    "DO" : [

      { "entity_create" : {

          "USING" : { "type" : "breadcrumb2" },

          "PROVIDE" : { "entity_created" : { "breadcrumb" : "Breadcrumb" } }

        }

      },

      { "data_set" : { "data" : [ "breadcrumb:path" ], "value" : "taxonomy\/term\/[term:tid]" } },

      { "breadcrumb2_append_breadcrumb_trail" : {

          "breadcrumb" : [ "breadcrumb" ],

          "title" : "[term:vocabulary:name]",

          "url" : "[term:vocabulary:machine-name]"

        }

      },

      { "breadcrumb2_taxonomy_get_parents_all" : {

          "USING" : { "taxonomy_term" : [ "term" ] },

          "PROVIDE" : { "parent_terms" : { "parent_terms" : "Parent terms" } }

        }

      },

      { "LOOP" : {

          "USING" : { "list" : [ "parent-terms" ] },

          "ITEM" : { "parent_term" : "Parent term" },

          "DO" : [

            { "breadcrumb2_append_breadcrumb_trail" : {

                "breadcrumb" : [ "breadcrumb" ],

                "title" : "[parent-term:name]",

                "url" : "taxonomy\/term\/[parent-term:tid]"

              }

            }

          ]

        }

      }

    ]

  }

}');

 

  $items['rules_breadcrumb_for_term_update'] = entity_import('rules_config', '{ "rules_breadcrumb_for_term_update" : {

    "LABEL" : "breadcrumb for term update",

    "PLUGIN" : "reaction rule",

    "REQUIRES" : [ "rules", "breadcrumb2", "taxonomy" ],

    "ON" : [ "taxonomy_term_update" ],

    "DO" : [

      { "entity_create" : {

          "USING" : { "type" : "breadcrumb2" },

          "PROVIDE" : { "entity_created" : { "breadcrumb" : "Breadcrumb" } }

        }

      },

      { "data_set" : { "data" : [ "breadcrumb:path" ], "value" : "taxonomy\/term\/[term:tid]" } },

      { "breadcrumb2_append_breadcrumb_trail" : {

          "breadcrumb" : [ "breadcrumb" ],

          "title" : "[term:vocabulary:name]",

          "url" : "[term:vocabulary:machine-name]"

        }

      },

      { "breadcrumb2_taxonomy_get_parents_all" : {

          "USING" : { "taxonomy_term" : [ "term" ] },

          "PROVIDE" : { "parent_terms" : { "parent_terms" : "Parent terms" } }

        }

      },

      { "LOOP" : {

          "USING" : { "list" : [ "parent-terms" ] },

          "ITEM" : { "parent_term" : "Parent term" },

          "DO" : [

            { "breadcrumb2_append_breadcrumb_trail" : {

                "breadcrumb" : [ "breadcrumb" ],

                "title" : "[parent-term:name]",

                "url" : "taxonomy\/term\/[parent-term:tid]"

              }

            }

          ]

        }

      }

    ]

  }

}');

  return $items;

}

这里导出的代码,是rules自己特有的规则语言,建议大家熟悉一下,将规则导出成代码的形式并不复杂。通常我们自定义rules规则的时候,也都是先通过配置界面,配置好了以后,将规则导出。导出的代码应该放到breadcrumb2.rules_defaults.inc文件中,通过钩子函数breadcrumb2_default_rules_configuration完成。

清除缓存,回到rules的管理界面,现在规则的状态已经变成了“Overridden”,而且我们现在已经无法删除规则,只能“revert”(恢复回去)。


Drupal版本: