原文链接: 利用Libraries API向Drupal项目中添加JS库 英文版作者:Garrett Dawson
译者:携剑看山
作为一个前端开发者,我经常需要为了前端的一些需求向项目中加入JavaScript库。在Drupal中,有很多种方式来完成这一任务,最近我开始注意到一个模块:Libraries API,它为Drupal开发者提供了一个稳定的方法来添加各种库。
一个Library是一组代码,通常是CSS和JS,有时候也会是一组PHP,或者一些其他什么东西。一般来说,这些库并不是为Drupal设计的。
过去,我直接把JS库加入到我的主题之中,接下来使用drupal_add_js()
把JS加入到页面。这意味着这个库同主题被绑定在一起。如果我想要在模块中使用这个库,我必须要知道这个主题的名字——用drupal_get_path()
。这很明显是个混蛋办法,他基本上断绝了模块化和代码复用的可能性。
另一个添加JS库的方法就是使用模块进行加载。这种方法的不足在于,JS库常需要通过Drupal UI来配置,配置能力有时会影响库的能力,同步更新也不容易保证。在多数情况下,这种方式可以使用Libraries API来实现。
使用这个库是很容易的。当然,最好是阅读一下完整的文档,不过想随便试试,只要几行代码就能搞定。
快速入门
安装Libraries API
如果你在使用Drush,那么很简单了:
$ drush dl libraries
下一步,建立一个目录sites/all/libraries
。如果你没有使用Drush,那么在官方网站进行下载安装即可。
向sites/all/libraries中添加库
下载一个库,然后把他添加到sites/all/libraries目录中。例如,我在使用FlexSlider,用来在我的项目中实现幻灯片效果。要添加这个库,我下载了flexslider,然后把它加入我的drupal项目的sites/all/libraries/flexslider中。
创建一个小模块,让Libraries API了解这个库
在一个自定义模块中,使用hook_libraries_info
来启用这个库。一个库被注册之后,他就可以被其他模块或主题使用了。
/** * Implements hook_libraries_info(). */ function MYMODULE_libraries_info() { $libraries = array(); $libraries['flexslider'] = array( 'name' => 'FlexSlider', 'vendor url' => 'http://flexslider.woothemes.com/', 'download url' => 'https://github.com/woothemes/FlexSlider/zipball/master', 'version arguments' => array( 'file' => 'jquery.flexslider-min.js', // jQuery FlexSlider v2.1 'pattern' => '/jQuery FlexSlider v(\d+\.+\d+)/', 'lines' => 2, ), 'files' => array( 'js' => array( 'jquery.flexslider-min.js', ), ), ); return $libraries; }
这个过程有个心得就是,提供一个版本参数或者实现版本回调是很有必要的。hook_libraries_info()
的文档中提到,这两个都是可选的项目,不过至少要提供一个,否则该库无法被载入。如果对版本的事情不太在意,可以使用一个提神方法来实现version回调:
/** * Implements hook_libraries_info(). */ function MYMODULE_libraries_info() { $libraries = array(); $libraries['my_library'] = array( // Etc etc. 'version callback' => 'short_circuit_version', ); return $libraries; } /** * Short-circuit the version argument. */ function short_circuit_version() { return TRUE; }
在页面中调用新引入的库
在这个例子中,我想要在一个特定的View中载入FlexSlider。所以这里我们实现一个Views的Hook。注意这里如何Hook到指定的Views:
/** * Implements hook_preprocess_views_view(). */ function MYTHEME_preprocess_views_view(&$vars) { // Uncomment the lines below to see variables you can use to target a view. // This requires http://drupal.org/project/devel to be installed. // dpm($vars['view']->name, 'view name'); // Hook view id specific functions. // This is a super neato trick. if (isset($vars['view']->name)) { $function = 'preprocess_views_view__' . $vars['view']->name; if (function_exists($function)) { $function($vars); } } } /** * Implements preprocess_views_view__VIEW(). */ function preprocess_views_view__YOURHOOK(&$vars) { $display_id = $vars['display_id']; $classes = &$vars['classes_array']; $title_classes = &$vars['title_attributes_array']['class']; $content_classes = &$vars['content_attributes_array']['class']; // Uncomment the lines below to see variables you can use to target a view. // This requires http://drupal.org/project/devel to be installed. // dpm($vars['view']->name, 'view name'); switch ($display_id) { // Call flexslider scripts. case 'page': libraries_load('flexslider'); break; } }
使用
现在FlexSlider已经载入,就可以在这个View中使用了:
(function ($) { $(window).load(function() { $('.slideshow').flexslider({ animation: "slide", controlNav: false, namespace: 'slide-', selector: '.slide-list > .slide-list-item' }); }); // end window.load })(jQuery);
你可以看到,Libraries API提供了一种便捷的方式来进行JavaScript管理。
译者按:
这种方法还是蛮不方便的,更简单的方式就是,直接手写info文件,例如我们要载入一个jsonview的库
把json view的内容解压到all/libraries/jsonview目录中。
新建文件jsonview.libraries.info
name = Json View machine name = jsonview description = json view plugins for jQuery version = 1.2.0 files[js][] = jquery.jsonview.js files[css][] = jquery.jsonview.css
利用drush libraries-list命令,查看Libraries载入结果:
名字 状态 版本 Variants Dependencies jsonview OK 1.2.0 - -
另附tcpdf库的libraries.info内容:
name = TCPDF for PHP machine name = tcpdf description = tcpdf version = 6.0.093 files[php][] = tcpdf.php