You are here

11 为Rules自定义条件

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

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

    后来,我还想到了这样的问题,假如用户安装了breadcrumb2模块,他在安装这个模块以前添加的节点怎么办?一种办法就是使用VBO,批处理一下,每个节点重新保存一边,这样就会为其生成对应的面包屑对象;还有一个办法,就是当用户浏览这个节点的时候,如果此时面包屑对象没有创建的情况下,我们为其创建一个。这里的此时面包屑对象没有创建的情况下,就是Rules里面的一个需要自定义的条件。

我们来自定义这个条件,在breadcrumb2.rules.inc文件的breadcrumb2_rules_action_info函数上面,插入以下代码:

/**

 * Implements hook_rules_condition_info().

 */

function breadcrumb2_rules_condition_info() {

  return array(

    'breadcrumb2_breadcrumb_exist' => array(

      'label' => t('Breadcrumb object already exist.'),

      'parameter' => array(

        'path' => array('type' => 'text', 'label' => t('Path'), 'wrapped' => FALSE),

      ),

      'group' => t('Breadcrumb2'),

      'access callback' => 'breadcrumb2_rules_integration_access',

      'base' => 'breadcrumb2_rules_breadcrumb_exist',

    ),

  );

}

这里面,我们使用hook_rules_condition_info,自定义了一个rules条件,注意,这里面的数组结构,和动作里面的数组结构,是一致的,里面的键的含义,前面也都做了介绍。我们向这个条件传递了一个参数path,也就是当前路径。下面我们来看看这个条件的逻辑函数breadcrumb2_rules_breadcrumb_exist,在breadcrumb2_rules_append_breadcrumb_trail的上面,插入以下代码:

/**

 * Condition: Breadcrumb object already exist.

 */

function breadcrumb2_rules_breadcrumb_exist($path) {

  $breadcrumb = breadcrumb2_load_by_path($path);

  if (!empty($breadcrumb)) {

    return TRUE;

  }

  return FALSE;

}

在这个函数里面,我们根据传递过来的路径,尝试加载对应的面包屑,如果加载成功,则返回TRUE,否则返回FALSE

现在清空缓存。然后克隆一下规则“breadcrumb for node create”,将克隆后的规则命名为“breadcrumb for node view”,添加一个新的事件Content is viewed,删除原来的事件After saving new content。接着,我们点击添加条件

图片1.png 

选中我们刚自定义的条件,点击继续按钮,进入条件的配置页面:

图片2.png 

条件的配置表单,也是rules为我们生成的,我们为条件定义的参数path,就对应于这里的输入框。下面的复选框“Negate”,表示取反的意思。在输入框里面输入“node/[node:nid]”,然后选中下面的复选框。保存。

这样当用户浏览一个节点页面时,假如此时该路径下面的面包屑对象不存在,系统就会自动创建一个。我们将规则“breadcrumb for node view”导出来,放到breadcrumb2.rules_defaults.inc文件中:

function breadcrumb2_default_rules_configuration() {

  $items = array();

……

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

    "LABEL" : "breadcrumb for node view",

    "PLUGIN" : "reaction rule",

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

    "ON" : [ "node_view" ],

    "IF" : [

      { "NOT breadcrumb2_breadcrumb_exist" : { "path" : "node\/[node:nid]" } }

    ],

    "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;

}


Drupal版本: