You are here

3实现预处理函数

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

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

我们前面的工作都是在模板里面直接进行的,我们把它转移到预处理函数里面。主题函数的预处理函数是有限制的,而我们这里的breadcrumb是一个模板文件了,所以可以为它在模块里面实现预处理函数。我们的实现如下。

/**

 * Implements MODULE_preprocess_HOOK().

 */

function breadcrumb2_preprocess_breadcrumb(&$variables) {

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

    $current_path = current_path();

    $breadcrumb = breadcrumb2_load_by_path($current_path);

    if (!empty($breadcrumb)) {

      $contextual_links_element   =    array(

        '#contextual_links' => array(

          'breadcrumb2' => array('breadcrumb', array($breadcrumb->bid)),

        )

      ); 

}

else{

      $contextual_links_element   =    array(

        '#contextual_links' => array(

          'breadcrumb2' => array('breadcrumb', array('0')),

        )

      ); 

}

 

    $contextual_links = array(

      '#type' => 'contextual_links',

      '#contextual_links' => $contextual_links_element['#contextual_links'],

      '#element' => $contextual_links_element,

    );

    $variables['contextual_links'] = drupal_render($contextual_links);

  }

}

这是我最初的实现,这里对模板里面的代码,做了相应的调整。在预处理函数里面,我们添加了一个新的变量,这样在模板文件里面就可以直接输出这个变量的。逻辑代码通常放到预处理函数、处理函数里面,这样可以让模板文件更干净一些。如果是实际当中的项目,就另当别论了。我们这里最终要贡献到drupal.org的,所以应该把逻辑代码独立出来。

现在,我们需要把模板里面的输出,也做相应的调整,实际上这里,只需要把前面的:

<?php print drupal_render($contextual_link); ?>

修改为:

<?php print $contextual_links; ?>

即可,或者直接注释掉原来的,添加上这里的最新代码也可以。另外,模板里面的代码可以删除、或者注释掉了。我们这里是注释掉了。

预处理函数,也是钩子函数,所以实现了这个函数以后,特别是第一次实现一个钩子函数,我们都需要清除一下缓存。Drupal7能够缓存哪些模块实现了某个钩子。这与Drupal6相比,就是一个小小的进步。而我们需要做的就是,当新建一个钩子函数的时候,需要清除缓存,否则就会不工作。我们此时会看到这样的错误消息:

Notice: Undefined variable: contextual_links in include() (line 35 of D:\xampp\htdocs\breadcrumb2\sites\all\modules\breadcrumb2\breadcrumb.tpl.php).

查找钩子函数的实现,是一个耗费资源的操作,将其缓存起来,可以提升性能。有兴趣的读者,可以顺着module_invoke_all这个函数,逐层分析,肯定会找到对应的缓存代码的。我们这里清除缓存,这个错误消息就消失了。对于有面包屑对象的,上下文链接是这样的:

图片1.png 

如果这个页面没有对应的面包屑实体对象,则显示不出来这个上下文链接。


Drupal版本: