作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
如果你对Rules比较熟悉的话,现在我们就可以点击“Add loop”这个链接,添加一个循环,我们根据lightest_term,就可以自动的获取到它所有的父术语,Rules核心就自带了这个功能。
我们这里把“Current list item”改为“Parent term”, 把“list_item”改为“parent_term”。上面的“lightest-term:parents-all”是我自己选出来的,也是rules自己提供了的:
保存以后,我们可以把刚才追加面包屑链接的动作,拖到循环的里面,也可以将其删除,在循环里面,单独的再创建一个同样的动作。我们这里将它拖了过来:
现在编辑这个动作。这是修改后的样子:
保存。现在再创建一个测试的产品节点,分类术语还选择A11。生成的面包屑是这个样子的:
怎么说呢,就差那么一点点了,分类术语的顺序在这里弄反了。我们只需要将“lightest-term:parents-all”的顺序反过来,就可以了,不过遗憾的是,Rules核心并没有提供这样的功能。好吧,我们就自己创建一个了。我们现在添加一个新的动作:
/**
* Implements hook_rules_action_info().
*/
function breadcrumb2_rules_action_info() {
$items = array();
……
$items['breadcrumb2_taxonomy_get_parents_all'] = array(
'label' => t('Taxonomy get parents all'),
'group' => t('Breadcrumb2'),
'parameter' => array(
'taxonomy_term' => array(
'type' => 'taxonomy_term',
'label' => t('Taxonomy term'),
'wrapped' => TRUE,
'save' => FALSE,
),
),
'base' => 'breadcrumb2_rules_taxonomy_get_parents_all',
'access callback' => 'breadcrumb2_rules_integration_access',
'provides' => array(
'parent_terms' => array(
'type' => 'list<taxonomy_term>',
'label' => t('Parent terms'),
),
),
);
return $items;
}
中间的代码省略了,粗体为新增的。注意,这里面,我们返回的变量是一个数组,这里使用了list,类型设置为了'list<taxonomy_term>',我根据经验,猜测应该这样写,后来经过测试,写对了。
我们接着定义,动作的逻辑处理函数:
/**
* Action: Taxonomy get parents all.
*/
function breadcrumb2_rules_taxonomy_get_parents_all(EntityDrupalWrapper $taxonomy_term) {
$parent_terms = taxonomy_get_parents_all($taxonomy_term->tid->value());
$parent_terms = array_reverse($parent_terms);
$return = array();
foreach($parent_terms as $parent_term){
$return[$parent_term->tid] = taxonomy_term_load($parent_term->tid);
}
//$return = array();
return array('parent_terms' => $return);
}
我们使用taxonomy_get_parents_all获取术语的所有父术语,包括术语本身,然后使用array_reverse将整个数组反向排列。注意这里面,由于taxonomy_get_parents_all返回的分类术语,不是完整的分类术语对象,所以这里又使用了taxonomy_term_load重新加载了一遍分类术语。开始的时候,代码里面是没有这个循环的,后台在测试的过程中,发现分类术语对象本身有问题。就添加了这个循环,并使用taxonomy_term_load明确加载分类术语对象。如果你不选,可以把这个循环代码注释掉,测试一下。
现在,清除缓存,添加动作“Taxonomy get parents all”,这里采用默认配置就可以了,系统会自动的为我们选择“lightest-term”。保存后,将我们的动作,拖放到loop的上面:
接着点击“保存变更”按钮,现在我们就可以修改这个循环,将List的数据选择,从“lightest-term:parents-all”改为“parent-terms”了。修改后,保存这个循环。
现在再创建一个产品节点,继续选择A11,生成的面包屑为:
这就是我们想要的。