作者:老葛,北京亚艾元软件有限责任公司,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中返回的是一个数组,一个这样的钩子函数中可以注册多个主题函数。
现在编辑bartik的template文件,我们在这个文件的最下面追加以下函数:
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。