老葛的Drupal培训班 Think in Drupal
blockaway.module中的代码非常简单并易于理解。它只负责包含blockaway.js文件。然而,如果模块更加复杂一点的话,那么将drupal_add_js()函数调用放在一个主题函数中,来取代放在hook_init()中,这对其他开发者来说会更加友好。这样,对于那些想使用你的模块,同时又想用一些方式来定制JavaScript代码的用户,他们无需修改你模块的源代码就可以完成定制工作(关于主题系统的更多详细,可参看第8章)。下面的代码是blockaway.module的修订版本,它使用hook_theme()声明了一个主题函数,并将drupal_add_js()调用移到了该主题函数中,而在hook_init()中调用这个主题函数。功能是一样的,但是现在聪明的开发者就可以对blockaway.js文件进行覆写了。
<?php
// $Id$
/**
* @file
* Use this module to learn about jQuery.
*/
/**
* Implementation of hook_init().
*/
function blockaway_init() {
theme('blockaway_javascript');
}
/**
* Implementation of hook_theme().
* Register our theme function.
*/
function blockaway_theme() {
return array(
'blockaway_javascript' => array(
'arguments' => array(),
),
);
}
/**
* Theme function that just makes sure our JavaScript file
* gets included.
*/
function theme_blockaway_javascript() {
drupal_add_js(drupal_get_path('module', 'blockaway') .'/blockaway.js');
}
让我们继续前进,来看看这种方法是否可以工作。我们将使用主题提供的JavaScript,来覆写模块提供的JavaScript。把sites/all/modules/custom/blockaway/blockaway.js拷贝到你的当前主题下----例如,themes/garland/blockaway.js。让我们稍微的修改一下JavaScript文件,这样我们就知道正在使用的是哪个JavaScript文件。将特效从slideDown("slow")改为fadeIn(5000);这将使用5秒钟的时间来渐进的显示区块。下面是新文件:
// $Id$
/**
* Hide blocks in sidebars, then make them visible at the click of a button.
*/
if (Drupal.jsEnabled) {
$(document).ready(function() {
// Get all div elements of class 'block' inside the left sidebar.
// Add to that all div elements of class 'block' inside the
// right sidebar.
var blocks = $('#sidebar-left div.block, #sidebar-right div.block');
// Hide them.
blocks.hide();
// Add a button that, when clicked, will make them reappear.
// Translate strings with Drupal.t(), just like t() in PHP code.
var text = Drupal.t('Show Blocks');
$('#sidebar-left').prepend('<div id="collapsibutton">' + text + '</div>');
$('#collapsibutton').css({
'width': '90px',
'border': 'solid',
'border-width': '1px',
'padding': '5px',
'background-color': '#fff'
});
// Add a handler that runs once when the button is clicked.
$('#collapsibutton').one('click', function() {
// Button clicked! Get rid of the button.
$('#collapsibutton').remove();
// Display all our hidden blocks using an effect.
blocks.fadeIn(5000);
});
});
}
我们最后要做的修改就是告诉Drupal加载这个新文件,从而取代sites/all/modules/custom/blockaway中的文件。我们通过覆写主题函数来实现这一点。向你主题的template.php文件中(如果你的主题还没有一个template.php文件,那么你需要创建一个),添加下面所给的函数:
<?php
// $Id$
/**
* Override theme_blockaway_javascript() with the
* following function.
*/
function phptemplate_blockaway_javascript() {
drupal_add_js(path_to_theme() . '/blockaway.js');
}
现在,当你使用浏览器来访问一个页面时,你应该能够看到“显示区块”按钮了,点击这个按钮,将会使用一个渐进的淡入效果来显示区块,而不是我们前面所用的幻灯效果。恭喜恭喜!你已经学会了如何在你的模块中使用jQuery,如何使用友好的方式编写jQuery以方便主题制作者和其他的开发者,同时,你还学会了如何覆写或增强其它模块中的JavaScript文件,这里假定这些模块中的JavaScript文件可被覆写。
在我们结束这个例子的学习以前,让我演示一下如何使用模板文件进行覆写。首先,删除你添加到template.php文件中的phptemplate_blockaway_javascript()函数。接着,在你的当前主题中,创建一个空文件blockawayjavascript.tpl.php。例如,如果你使用的是Garland主题,那么创建的就是themes/garland/blockaway-javascript.tpl.php。不要在这个文件中放置任何东西。现在导航到“管理➤站点构建➤模块”,访问这个页面的作用就是重新构建主题注册表。Drupal将找到该模板文件,并使用它来替代你模块中的主题函数。最终的结果就是永远也不会加载blockaway.js了;通过创建一个空的模板文件,你实质上就是注释掉了该主题函数(回想一下第8章所讲的,当构建主题注册表的时候,Drupal将首先查找一个模板文件,然后才是主题函数)。
现在,向你的blockaway-javascript.tpl.php文件中添加以下代码:
<?php drupal_add_js(path_to_theme() . '/blockaway.js'); ?>
当你重新加载页面时,你应该可以看到JavaScript文件现在加载进来了。如果你想将第3方模块中的JavaScript文件替换为你的增强版本,或者想阻止加载一些JavaScript文件时,这里所讲的这些技术还是很有用处的。
注意 你不能在page.tpl.php中调用drupal_add_js(),对于其它的一些主题函数,如果是在它的预处理阶段调用的话(比如区块),那么也不能使用drupal_add_js()。为什么呢?这是因为它们在页面构建流程中执行的顺序过于靠后。核心模板文件是如何添加JavaScript的,可参看modules/block/block-admin-display-form.tpl.php。