<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>libraries | 伪架构师</title>
    <link>/tags/libraries/</link>
      <atom:link href="/tags/libraries/index.xml" rel="self" type="application/rss+xml" />
    <description>libraries</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 05 Aug 2015 10:32:19 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>libraries</title>
      <link>/tags/libraries/</link>
    </image>
    
    <item>
      <title>利用 Libraries API 向 Drupal 项目中添加JS库</title>
      <link>/post/add-js-into-drupal-with-libraries-module/</link>
      <pubDate>Wed, 05 Aug 2015 10:32:19 +0800</pubDate>
      <guid>/post/add-js-into-drupal-with-libraries-module/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://atendesigngroup.com/blog/adding-js-libraries-drupal-project-libraries-api&#34; target=&#34;_blank&#34;&gt;Adding JS libraries to a Drupal project with Libraries API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作为一个前端开发者，我经常需要为了前端的一些需求向项目中加入 JavaScript 库。在 Drupal 中，有很多种方式来完成这一任务，最近我开始注意到一个模块：&lt;a href=&#34;https://drupal.org/project/libraries&#34; target=&#34;_blank&#34;&gt;Libraries API&lt;/a&gt;，它为 Drupal 开发者提供了一个稳定的方法来添加各种库。&lt;/p&gt;

&lt;p&gt;一个 Library 是一组代码，通常是 CSS 和 JS，有时候也会是一组 PHP，或者一些其他什么东西。一般来说，这些库并不是为 Drupal 设计的。&lt;/p&gt;

&lt;p&gt;过去，我直接把 JS 库加入到我的主题之中，接下来使用 &lt;code&gt;drupal_add_js()&lt;/code&gt; 把 JS 加入到页面。这意味着这个库同主题被绑定在一起。如果我想要在模块中使用这个库，我必须要知道这个主题的名字——用 &lt;code&gt;drupal_get_path()&lt;/code&gt;。这很明显是个混蛋办法，他基本上断绝了模块化和代码复用的可能性。&lt;/p&gt;

&lt;p&gt;另一个添加 JS 库的方法就是使用模块进行加载。这种方法的不足在于，JS 库常需要通过 Drupal UI 来配置，配置能力有时会影响库的能力，同步更新也不容易保证。在多数情况下，这种方式可以使用 Libraries API 来实现。&lt;/p&gt;

&lt;p&gt;使用这个库是很容易的。当然，最好是阅读一下&lt;a href=&#34;https://drupal.org/node/1342238&#34; target=&#34;_blank&#34;&gt;完整的文档&lt;/a&gt;，不过想随便试试，只要几行代码就能搞定。&lt;/p&gt;

&lt;h2 id=&#34;快速入门&#34;&gt;快速入门&lt;/h2&gt;

&lt;h3 id=&#34;安装-libraries-api&#34;&gt;安装 Libraries API&lt;/h3&gt;

&lt;p&gt;如果你在使用&lt;a href=&#34;https://drupal.org/project/drush&#34; target=&#34;_blank&#34;&gt;Drush&lt;/a&gt;，那么很简单了：&lt;/p&gt;

&lt;p&gt;$ drush dl libraries&lt;/p&gt;

&lt;p&gt;下一步，建立一个目录 &lt;code&gt;sites/all/libraries&lt;/code&gt;。如果你没有使用Drush，那么在&lt;a href=&#34;drupal.org/project/libraries&#34; target=&#34;_blank&#34;&gt;官方网站&lt;/a&gt;进行下载安装即可。&lt;/p&gt;

&lt;h3 id=&#34;向-sites-all-libraries-中添加库&#34;&gt;向&lt;code&gt;sites/all/libraries&lt;/code&gt;中添加库&lt;/h3&gt;

&lt;p&gt;下载一个库，然后把他添加到 &lt;code&gt;sites/all/libraries&lt;/code&gt; 目录中。例如，我在使用 &lt;a href=&#34;http://flexslider.woothemes.com/&#34; target=&#34;_blank&#34;&gt;FlexSlider&lt;/a&gt;，用来在我的项目中实现幻灯片效果。要添加这个库，我下载了 flexslider，然后把它加入我的drupal项目的 &lt;code&gt;sites/all/libraries/flexslider&lt;/code&gt; 中。&lt;/p&gt;

&lt;h3 id=&#34;创建一个小模块-让-libraries-api-了解这个库&#34;&gt;创建一个小模块，让 Libraries API 了解这个库&lt;/h3&gt;

&lt;p&gt;在一个自定义模块中，使用 &lt;a href=&#34;http://drupalcontrib.org/api/drupal/contributions!libraries!libraries.api.php/function/hook_libraries_info/7&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;hook_libraries_info&lt;/code&gt;&lt;/a&gt; 来启用这个库。一个库被注册之后，他就可以被其他模块或主题使用了。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-php&#34;&gt;/**
  * Implements hook_libraries_info().
  */
function MYMODULE_libraries_info() {
  $libraries = array();
  $libraries[&#39;flexslider&#39;] = array(
    &#39;name&#39; =&amp;gt; &#39;FlexSlider&#39;,
    &#39;vendor url&#39; =&amp;gt; &#39;http://flexslider.woothemes.com/&#39;,
    &#39;download url&#39; =&amp;gt; &#39;https://github.com/woothemes/FlexSlider/zipball/master&#39;,
    &#39;version arguments&#39; =&amp;gt; array(
      &#39;file&#39; =&amp;gt; &#39;jquery.flexslider-min.js&#39;,
      // jQuery FlexSlider v2.1
      &#39;pattern&#39; =&amp;gt; &#39;/jQuery FlexSlider v(\d+\.+\d+)/&#39;,
      &#39;lines&#39; =&amp;gt; 2,
    ),
    &#39;files&#39; =&amp;gt; array(
      &#39;js&#39; =&amp;gt; array(
        &#39;jquery.flexslider-min.js&#39;,
      ),
    ),
  );

  return $libraries;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这个过程有个心得就是，提供一个版本参数或者实现版本回调是很有必要的。&lt;code&gt;hook_libraries_info()&lt;/code&gt; 的文档中提到，这两个都是可选的项目，不过至少要提供一个，否则该库无法被载入。如果对版本的事情不太在意，可以使用一个替身方法来实现  version 回调：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-php&#34;&gt;/**
* Implements hook_libraries_info().
*/
function MYMODULE_libraries_info() {
  $libraries = array();
  $libraries[&#39;my_library&#39;] = array(
    // Etc etc.
    &#39;version callback&#39; =&amp;gt; &#39;short_circuit_version&#39;,
  );

  return $libraries;
}

/**
* Short-circuit the version argument.
*/
function short_circuit_version() {
  return TRUE;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;在页面中调用新引入的库&#34;&gt;在页面中调用新引入的库&lt;/h3&gt;

&lt;p&gt;在这个例子中，我想要在一个特定的 View 中载入 FlexSlider。所以这里我们实现一个 Views 的 Hook。注意这里如何把 Hook 到指定的 Views:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-php&#34;&gt;/**
  * Implements hook_preprocess_views_view().
  */
function MYTHEME_preprocess_views_view(&amp;amp;$vars) {

  // 去掉注释，查看可用的变量
  // This requires http://drupal.org/project/devel to be installed.
  // dpm($vars[&#39;view&#39;]-&amp;gt;name, &#39;view name&#39;);

  // 根据View ID调用指定方法
  if (isset($vars[&#39;view&#39;]-&amp;gt;name)) {
    $function = &#39;preprocess_views_view__&#39; . $vars[&#39;view&#39;]-&amp;gt;name;
    if (function_exists($function)) {
      $function($vars);
    }
  }
}

/**
  * Implements preprocess_views_view__VIEW().
  */
function preprocess_views_view__YOURHOOK(&amp;amp;$vars) {
  $display_id = $vars[&#39;display_id&#39;];
  $classes = &amp;amp;$vars[&#39;classes_array&#39;];
  $title_classes = &amp;amp;$vars[&#39;title_attributes_array&#39;][&#39;class&#39;];
  $content_classes = &amp;amp;$vars[&#39;content_attributes_array&#39;][&#39;class&#39;];

  // 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[&#39;view&#39;]-&amp;gt;name, &#39;view name&#39;);

  switch ($display_id) {

    // 载入FlexSlider库
    case &#39;page&#39;:
      libraries_load(&#39;flexslider&#39;);
      break;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;使用&#34;&gt;使用&lt;/h3&gt;

&lt;p&gt;现在 FlexSlider 已经载入，就可以在这个 View 中使用了：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;(function ($) {
  $(window).load(function() {

    $(&#39;.slideshow&#39;).flexslider({
      animation: &amp;quot;slide&amp;quot;,
      controlNav: false,
      namespace: &#39;slide-&#39;,
      selector: &#39;.slide-list &amp;gt; .slide-list-item&#39;
    });

  }); // end window.load
})(jQuery);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;你可以看到，Libraries API 提供了一种便捷的方式来进行 JavaScript 管理。&lt;/p&gt;

&lt;p&gt;译者按：&lt;/p&gt;

&lt;p&gt;这种方法还是蛮不方便的，更简单的方式就是，直接手写info文件，例如我们要载入一个 jsonview 的库&lt;/p&gt;

&lt;p&gt;把 json view 的内容解压到 &lt;code&gt;all/libraries/jsonview&lt;/code&gt; 目录中。&lt;/p&gt;

&lt;p&gt;新建文件 &lt;code&gt;jsonview.libraries.info&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;利用 drush libraries-list 命令，查看 Libraries 载入结果：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;名字         状态            版本       Variants  Dependencies
 jsonview   OK            1.2.0    -         -
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;另附 tcpdf 库的 &lt;code&gt;libraries.info&lt;/code&gt; 内容：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = TCPDF for PHP
machine name = tcpdf
description = tcpdf
version = 6.0.093
files[php][] = tcpdf.php
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
  </channel>
</rss>
