6 改进我们的代码

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

   在我们的预处理函数中,在为morelink属性赋值时,我们直接使用了 l() 函数并附加了一些html标签,我们把html标签写死在了里面,如果别人使用我们的代码,他们想修改这一输出时,只有通过修改module文件中的对应代码才能实现。我们可以采用Drupal的主题函数的方式,来改进我们的代码:

 

/**

 * Implements hook_theme().

 *

 */

function block_morelink_theme(){

  return array(

    'block_morelink_link' => array(

       'variables' => array('url' => NULL,'title' => NULL,)

    ),

    

  );

}

 

/**

 * Returns HTML for a "more" link, like those used in blocks.

 *

 * @param $variables

 *   An associative array containing:

 *   - url: The url of the main page.

 *   - title: A descriptive verb for the link, like 'Read more'.

 */

function theme_block_morelink_link($variables) {

$output = "";

if(!empty($variables['url'])){

$morelink_label = t('More');

   $output .= '<span class="block-more-link">' . l($morelink_label, $variables['url'], array('attributes' => array('title' => $variables['title']))). '</span>';

}

return $output;

}

 

    同时修改预处理函数中的代码,将

$variables['block']->morelink = '<span class="block-more-link">' . l(t('More'), $morelink_url, array('attributes' => array('title' => $morelink_title))). '</span>';

    替换为:

$variables['block']->morelink =  theme('block_morelink_link', array('url' => $morelink_url, 'title' => $morelink_title))

 

    在这里面,我们将原来的逻辑放在了theme_block_morelink_link函数中了,注意对于这个主题函数,这里需要注意以下两点:首先、我们没有直接显性的调用theme_block_morelink_link,而是通过theme()函数调用,这样就利用了Drupal的主题覆写机制,其他Drupal开发者就可以在主题层覆写我们的主题函数了。其次,所有的主题函数,都需要在hook_theme中注册一下,只有这样才能被Drupal识别出来,hook_theme中返回的是一个数组,一个这样的钩子函数中可以注册多个主题函数。

 

    现在编辑bartiktemplate文件,我们在这个文件的最下面追加以下函数:

 

function bartik_block_morelink_link($variables) {

$output = "";

if(!empty($variables['url'])){

$morelink_label = t('More');

   $output .= '<div class="block-more-link">' . l($morelink_label, $variables['url'], array('attributes' => array('title' => $variables['title']))). '</div>';

}

return $output;

}

 

    这里我们没有直接修改module文件中的theme_block_morelink_link,就实现了对这个主题函数的覆写,将span标签替换为了div

 


Drupal版本: