Drupal专业开发指南 第17章 可覆写的JavaScript

老葛的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。
 

Drupal版本: