You are here

9 与Panels的兼容问题

admin 的头像
Submitted by admin on 星期五, 2015-09-18 01:53

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

在一个实际的项目中,面包屑是添加到Panels的窗格里面去的。如果节点页面不使用Panels的话,就正常,使用了Panels,把面包屑放到Panels的窗格里面输出的话,就不正常了。你可以通过这个步骤重现这个问题,在panels的内容页面,为某一个区域添加内容,在弹出的对话框里面,左边选择页面元素(page elements),此时右边就会有面包屑可以添加,添加后,就会出现我们这里所说的问题。

 

我是这样解决这个问题的,首先,找到这个面包屑元素在Panels里面是怎么定义的,先通过前台界面,鼠标移上去,看看左下路径的变化,从路径里面可找到 page_breadcrumb,根据这个使用NotePad++的查找功能,就能找到对应的代码。代码位于ctools\plugins\content_types\page下面的page_breadcrumb.inc文件中:

$plugin = array(

  'title' => t('Breadcrumb'),

  'single' => TRUE,

  'icon' => 'icon_page.png',

  'description' => t('Add the breadcrumb trail as content.'),

  'category' => t('Page elements'),

  'render last' => TRUE,

);

 

/**

 * Output function for the 'page_breadcrumb' content type.

 *

 * Outputs the breadcrumb for the current page.

 */

function ctools_page_breadcrumb_content_type_render($subtype, $conf, $panel_args) {

  $block = new stdClass();

  $block->content = theme('breadcrumb', array('breadcrumb' => drupal_get_breadcrumb()));

 

  return $block;

}

我们看到,Panels里面的面包屑,根本没有走页面,所以通过hook_page_alter是修改不了这里的面包屑的。可能这样解释更正确一点,就是Panels生成面包屑之前,还没有调用hook_page_alter呢,就是说Panels先生成的面包屑,后面才调用了我们的hook_page_alter

解决办法很简单,就是将breadcrumb2_page_alter里面的代码搬到面包屑的预处理函数breadcrumb2_preprocess_breadcrumb里面。这是添加后的代码:

 

function breadcrumb2_preprocess_breadcrumb(&$variables) {

  $current_path = current_path();

  $breadcrumb2 = breadcrumb2_load_by_path($current_path);

  if(!empty($breadcrumb2)){

    $breadcrumbs = array();

      // Only keep the first one. 

    if (!empty($variables['breadcrumb'][0])) {

      $breadcrumbs[] = $variables['breadcrumb'][0];

    }

    $wrapper = entity_metadata_wrapper('breadcrumb2', $breadcrumb2);

    $breadcrumb_links = $wrapper->link->value();

    foreach($breadcrumb_links as $breadcrumb_link){

      $breadcrumbs[]= l($breadcrumb_link['title'], $breadcrumb_link['url']);

    }

$variables['breadcrumb'] = $breadcrumbs;

  }

 

  if (user_access('administer breadcrumbs') && user_access('access contextual links')) {

 

粗体部分为新增的。现在我们就可以注释掉breadcrumb2_page_alter了。清楚缓存,一切正常工作。前面忘记介绍了一个问题,当系统已经设置了面包屑,并且面包屑里面有多个链接的时候,就与我们这个模块的面包屑设置冲突了,此时,我们只取系统设置的面包屑链接里面的第一个,也就是首页的链接,其它全部去掉。在beta3beta4里面,都有对应的代码。

还有一个问题,就是说把breadcrumb.tpl.php复制到当前主题目录下,在这里覆写,不起作用的问题,这也是一个大问题。此外,还有两个工作要做,一个就是为breadcrumb2_load_by_path加缓存,就是在同一个页面请求处理期间,如果加载了一次,那么下次使用这个函数时,就会直接返回前面的结果。另外一个工作就是,为面包屑模板加上模板建议,可以按照路径的具体程度进行覆写。还有就是把模板里面的:

<div class="breadcrumb-wrapper contextual-links-region">

把这里的的设置,放到预处理函数中进行。比如contextual-links-region,只有当输出上下文链接的时候,才输出这个类。

由于这些问题,和上下文链接,都快没有直接的关系了,所以就不放到本章介绍了。


Drupal版本: