做好准备转向 drupal 8

和很多人的感受一样,Drupal之于我们也是一个让人又爱又恨的存在。爱她,因为她在一个坚实的平台之上有着无限的可能;恨她,因为想要实现这些无限可能需要耗费的气力,完全不比不使用她来得更轻松。

好在Drupal 8又给了我们更多爱她的理由。

Screen Shot 2017-03-02 at 2.59.21 PM.png

好消息:一切只会更好!

一个让所有人都振奋的消息是:相比以往版本,Drupal 8在各个方面都将变得更好,包括:更加友好的前后台界面(针对用户和建站者);更加成熟合理的代码架构(针对模块开发者);更易上手的主题定制方法(针对主题和前端开发者)。在详细了解上述这些之前,我们先来走马观花地看几个大家在以往版本的Drupal中期待已久的特性,也许能让你精神为之一振。

贴心的转变

  • 可复用的Block:这是不得不首先提到的一个Drupal 8的重大革新。和同类产品的类似功能(如WordPress的Widget)相比,Drupal在区块/挂件这块的功能一直都显得较弱,但是Drupal 8在这方面有了明显的改进。作为一个新的内建功能,一个Block可以有无限多个拷贝,并且每个拷贝可以有自己特定的参数配置和可见性规则,是不是期待已久了呢?
  • Views成为核心模块:Drupal对核心模块的选取一直都持非常谨慎的态度,一个典型的例子是版本7中Content Contstruction Kit(CCK)的加入,而版本8的核心模块中又多了一位重量级成员:Views。不仅如此,Drupal 8的大部分管理界面也都依赖Views生成。换句话说,Views不再是“可以有“或者“有了更好”,而是“必须有”了。Drupal的这一举措可能证实了老生常谈的性能问题不再是Drupal的显著瓶颈(Views曾经一度因为额外的性能开销而被诟病)——毕竟,性能是一个完全可以单独去攻克的问题。
  • 多语言不再让人头疼:在Drupal 8中,管理多语言网站不再是一件令人头疼的事情了,除了内容翻译模块高度精简并且已经成为核心模块之外,界面语言包也是可以自动从drupal的翻译服务器上下载并持续更新的。(以往版本需要借助第三方模块和繁复的步骤实现)
  • 更加合理的文件结构:Drupal 8把开发者需要频繁访问的 sites/all/下面的所有文件都拿出来直接放到站点根目录下,而把不常需要访问的内核部分文件全部放到 core/ 下面,真可谓是“造福于民“。
  • 内置的HTML编辑器:Drupal 8终于不再把“所见即所得“视作敌人,除了把CKEditor加入内核以外,还对文本编辑的友好性方面做了诸多改进,可见drupal在拉拢建站者和一般用户方面也是表足了诚意的。
  • 响应式成为“标配”:和Drupal 8一起发布的三个自带主题:Seven、Bartik和Stark都是响应式的,响应式主题已经成为Drupal 8的标准配置,由此也使得社区中响应式主题的开发蔚然成风。除此之外,Drupal 8也不再把响应式一股脑交给主题去搞定,新的核心模块“断点(Breakpoints)“就是专门用来支持这一特性的。
  • 标准的配置迁移方法:在以往版本的Drupal中,配置的迁移一直是让人蛋疼的一件事情,因为各个模块的配置要么根本无法迁移,要么有各自不同的方法,相当混乱。比如,你在开发版的网站中创建了一个包含几十个字段的内容类型或者一个极端复杂的Views,想要把它导出到正式网站,在之前是没有统一的方法的,而现在这些操作都可以用一个叫做“配置管理器(Configruration Manager)“的新的功能模块来完成。你可以选择部分或是一次性全部执行配置的迁移,相当灵活。

Drupal 8:一样,又不一样

如果你是Drupal的老用户,第一次看到Drupal 8时可能并不一定有特别多的感触。因为乍看下来,Drupal 8除了在界面上有些许改变之外,似乎有点换汤不换药。管理功能的划分仍旧逃不脱内容、结构、外观、模块、配置……等等这些。

但是如果你继续看下去,就会发现还是有很多不一样的。界面上,Drupal吸取了很多WordPress的优点,使其更加符合一般用户的习惯;文件和媒体的管理成为内容管理的一部分;Drupal 7中的鸡肋模块Dashboard不见了,而Views却是无处不在了。当然更不要说,Drupal 8不同于以往任何版本的Drupal,不是“Coding from scractch”,而是建立在开源框架Symfony之上的。这意味着Drupal 8是一个正宗的Symfony应用,其开发方式和任何其他Symfony项目都是相通的。

管理界面

总体上来说,Drupal 8在界面上更加讨好建站者和一般用户。在借鉴了同类产品的诸多优点之后,Drupal 8的管理界面变得亲切了许多。内建的响应式布局使其即使在手机上操作也很方便,而管理菜单可以方便地调整到屏幕的顶部或是左边,内容编辑的两栏式布局又让宽屏设备的空间得到充分的利用。

Drupal 8这次非常真诚地拥抱“所见即所得”,不仅把CKEditor纳入内核当中,还模仿同类产品推出就地编辑(Inline Editing)功能。Drupal把它叫作“快速编辑(Quick Editing)”,让你在查看内容的同时就能编辑内容。下图演示了一个“快速编辑”的画面。

Screen Shot 2017-03-02 at 2.53.04 PM.png

对于开发者来说,大部分的原有功能都还在它们应该在的地方,只是某些名称或位置有细微调整;一些繁琐的设置页面被合并,使得界面更加精简。

操作方式

视图无处不在

视图已经成为Drupal 8中不可或缺的一部分,大多数管理界面都用视图生成。所以当你需要定制一个管理界面的外观(比如要在内容管理界面上显示一列缩略图)时,可以先去视图编辑页面里面看看能否搞定。

实体和字段的使用更加广泛

Drupal 8紧接着上一版本,把实体和字段的使用更加深入一层,不光是节点,分类、评论、用户、甚至区块都已经是实体,可以拥有自己的字段。对了,还有内建的联系表单也是其中之一,这意味着之前的Webform之类的模块需要重新思考一下自己的功能定位了。

扩展功能不再有“禁用”状态

Drupal 8的另一个显著改变是,扩展的功能(包括主题和模块)不再有“禁用(disabled)”这个状态。所以对于主题和模块,要么安装,要么卸载,而不允许它们在保留已有配置的状态下不发挥作用。对于这一改变,Drupal确实给出了充分的理由,我想我们就照做吧。有关这个话题的详细讨论可以去这里查看:https://www.drupal.org/node/1199946

为 Drupal 8 开发

代码结构:一个典型的Symfony应用

如前所述,Drupal 8在貌似雷同的外表之下隐藏着重大变革,其中最突出的一个体现就是,Drupal 8的整个底层都是架设在Symfony之上的,也就是说,Drupal 8是一个名副其实的Symfony应用。

开发Symfony应用可以说是一件令人愉悦的工作。严格的MVC架构让表现和业务完全分离开来、强大的路由体系和访问控制让程序员可以把精力专注在功能的开发上、数据抽象层类库Doctrine让数据的查、删、增、改操作省力又省心,同时,Symfony的高性能也是其极力鼓吹的卖点之一。为此,一批优秀的开源项目都选择了Symfony,其中就包括我在不久之前介绍的Lavarel,以及大名鼎鼎论坛系统phpBB

关于Symfony的论述,限于篇幅就到此为止。你可以在Symfony的官方网站或是网上很多地方找到更多更专业的资料。另外,我也曾经断断续续写过一些Symfony的入门文章,仅供参考。

Hello, YAML and bye-bye, hook_menu()

在Drupal 8中你将不会再看到以.info后缀结尾的配置文件,所有的配置文件都遵循Symfony开发规范,采用YAML格式。 原来的.info文件被加上了.yml后缀,并采用全新的YAML语法重新书写。同时,因为Symfony框架自带强大的路由功能,原来几乎无处不在的hook_menu()函数也将永远地消失在Drupal 8当中,取而代之的是相应的routing.yml和links.menu.yml文件。

关于YAML语法的更多信息可参考:http://yaml.org;Symfony路由功能方面的文档可参考:http://symfony.com/doc/current/routing.html

面向对象编程更多地体现在代码当中

在Drupal 7以及更早的版本中,虽然面向对象思想一直都存在,但在代码上却少有体现,所有的代码都还是以函数形式组织的。在Drupal 8中,开发者会频繁地和面向对象语法打交道,包括命名空间(namespace)、类的继承以及接口的实现等等。

模块开发

Drupal 8的模块开发步骤相比之前的版本有了革命性的变化,基本上类似于Symfony的bundle开发。

同时Drupal 8也对模块开发者提出了全新的要求,下面是成为一个合格的Drupal 8模块开发者需要具备的先决条件,你可以看看是否全部满足:

https://www.drupal.org/docs/8/creating-custom-modules/getting-started-background-prerequisites-drupal-8

当然,如果你只是想小试一下身手,至少需要知道以下几件事情:

  1. 你的代码不是直接执行的

Symfony严格的MVC架构使得通过URL直接执行一个php文件几乎是不可能的,程序员的代码都被放置到专门的src文件夹中,由类自动加载(Class Autoloading)、缓存预热(Cache Warmup)等等一系列复杂的机制而最终得到执行。所以,完成你的模块声明(编写.info.yml)之后,要做的第一件事就是创建一个src文件夹,用来放置你的所有PHP源程序。

  1. YAML扮演着重要角色

Drupal 8中YAML文件几乎无处不在,其作用至关重要。info.yml负责定义基本信息,routing.yml文件负责定义路由和访问控制,links.menu.yml文件负责定义菜单链接,permissions.yml负责定义权限……等等,所以,要开发Drupal 8模块,首先要熟悉YAML。

  1. .module文件可有可无

另一个现象是,原来至关重要的.module文件在Drupal 8中是可有可无的,它的重要性已经完全被YAML所取代。除非你要实现一些钩子,否则你可以完全不需要.module文件。

下面是作为模块开发小试身手的一个代码示例。我们假定要开发的模块叫做my_module,所有的文件均放置在 modules/my_module/ 目录下,因此我们的文件结构如下所示:

Screen Shot 2017-03-03 at 12.22.46 AM.png

三个文件中的代码依次如下:

my_module.info.yml

name: My Module
type: module
description: My first drupal 8 module.
core: 8.x

my_module.routing.yml

my.module:
  path: '/my-module'
  defaults:
    _controller: '\Drupal\my_module\Controller\MyModuleController::content'
    _title: 'My Module'
  requirements:
    _permission: 'access content'

MyModuleController.php

namespace Drupal\my_module\Controller;

use Drupal\Core\Controller\ControllerBase;

class MyModuleController extends ControllerBase {

    public function content() {

        return array(
            '#type' => 'markup',
            '#markup' => '我的第一个drupal 8模块.',
        );

    }

}

上传以上代码到服务器以后,再到 admin/modules 下,你会在页面上找到以下部分:

Screen Shot 2017-03-03 at 12.09.42 AM.png

勾选复选框,安装我们的模块。等待安装进度条走完,再请求 my-module 这个路径,你就会看到如下画面:

Screen-Shot-2017-03-03-at-12.20.39-AM.png

至此,我们已经成功创建了第一个Drupal 8模块!

关于Drupal 8的模块开发暂告一个段落,我将会在以后再陆续跟大家分享,本文的最后一部分是关于主题和前端开发。

主题和前端开发

首先,和模块开发一样,Drupal 8的主题也是由YAML驱动的。声明一个主题,同样首先需要编写一个.info.yml文件。有了前面的经验,我们已经可以很轻松地把以往版本中的.info文件“翻译”成相应的YAML版本了。一个典型的主题.info.yml文件的内容如下:

name: My Theme
type: theme
base theme: classy
description: 'My first drupal 8 theme.'
core: 8.x

为简明起见,我省去了一些暂时不需要关心的部分代码。

不过有几点值得一提。

首先,不同于以前,如果你不指定base theme这一项的话,Drupal 8会给你的主题一个默认的基主题Classy。如果你不想你的主题继承自任何基主题,你必须为base theme指定一个特别的值:false。

接下来,你会发现这个默认的基主题Classy虽然存在于代码中,却不显示在主题管理界面上,这是因为Classy主题是一个“隐藏”主题。这一点对于基主题的开发者非常有用。当你的主题只是用来继承和扩展,而不能直接使用时,把它设置为隐藏主题再合适不过了。为此,只需要在.info.yml中加入一行:hidden: true,即可。

最后,你找不到原来经常见到的template.php文件了,取而代之的是.theme文件。和template.php文件一样,.theme文件并不是必须的,这部分我将在以后再讨论。

接下来就是编写主题的模版文件了。

模版引擎twig

作为Symfony的姐妹产品,twig自然也成为Drupal 8模版引擎的首选。使用twig的一大好处是,主题开发者几乎不需要学习PHP就可以上手了。虽然我个人并不推荐这么做,但是对于主题开发者和前端开发者这两个岗位合二为一的情况来说(相当多的Drupal开发团队是这样),只需要较少的背景知识就可以上岗,确实不失为一件高效的事情。

关于twig的更多信息可参考:http://twig.sensiolabs.org/

前端

有了更强大的基主题,Drupal 8的前端开发变得相当轻松。响应式是标配,还有专门的断点(Breakpoint)模块来支持这一特性。如果你是拿来主义者,可以直接去Drupal的主题社区里面看看有哪些优秀的资源可以利用。

还有一个值得一提的地方是,Drupal 8新增了内建Email类型字段,前端终于可以从繁琐的Email格式验证中解脱出来了。

关于Drupal 8的主题和前端开发我也会在以后的文章中再专门论述。

最后的最后

所以,我们已经准备好了,你呢?