作者:老葛,北京亚艾元软件有限责任公司,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”。接着,我们点击添加条件
选中我们刚自定义的条件,点击继续按钮,进入条件的配置页面:
条件的配置表单,也是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;
}