You are here

9 实现以分类层级结构为基础的面包屑

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

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

如果你对Rules比较熟悉的话,现在我们就可以点击“Add loop”这个链接,添加一个循环,我们根据lightest_term,就可以自动的获取到它所有的父术语,Rules核心就自带了这个功能。

   图片1.png

我们这里把“Current list item”改为“Parent term”, 把“list_item”改为“parent_term”。上面的“lightest-term:parents-all”是我自己选出来的,也是rules自己提供了的:

图片2.png 

保存以后,我们可以把刚才追加面包屑链接的动作,拖到循环的里面,也可以将其删除,在循环里面,单独的再创建一个同样的动作。我们这里将它拖了过来:

图片3.png 

现在编辑这个动作。这是修改后的样子:

图片4.png 

保存。现在再创建一个测试的产品节点,分类术语还选择A11。生成的面包屑是这个样子的:

图片5.png 

怎么说呢,就差那么一点点了,分类术语的顺序在这里弄反了。我们只需要将“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的上面:

图片6.png 

接着点击保存变更按钮,现在我们就可以修改这个循环,将List的数据选择,从“lightest-term:parents-all”改为“parent-terms”了。修改后,保存这个循环。

现在再创建一个产品节点,继续选择A11,生成的面包屑为:

图片7.png 

这就是我们想要的。


Drupal版本: