Nilfisk 集团总部位于丹麦,在 40 多个国家和地区设有销售公司。Nilfisk 结合强大的分销商网络,在全球 100 多个国家销售产品。力奇的生产设施位于亚洲、欧洲和美洲。
我们与2020年2月开始接手力奇清洁微信公众号,在此之前该公众号每月并没有规律的推送,各项公众号数据也非常的惨淡。
和很多人的感受一样,Drupal之于我们也是一个让人又爱又恨的存在。爱她,因为她在一个坚实的平台之上有着无限的可能;恨她,因为想要实现这些无限可能需要耗费的气力,完全不比不使用她来得更轻松。
好在Drupal 8又给了我们更多爱她的理由。
一个让所有人都振奋的消息是:相比以往版本,Drupal 8在各个方面都将变得更好,包括:更加友好的前后台界面(针对用户和建站者);更加成熟合理的代码架构(针对模块开发者);更易上手的主题定制方法(针对主题和前端开发者)。在详细了解上述这些之前,我们先来走马观花地看几个大家在以往版本的Drupal中期待已久的特性,也许能让你精神为之一振。
如果你是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)”,让你在查看内容的同时就能编辑内容。下图演示了一个“快速编辑”的画面。
对于开发者来说,大部分的原有功能都还在它们应该在的地方,只是某些名称或位置有细微调整;一些繁琐的设置页面被合并,使得界面更加精简。
视图已经成为Drupal 8中不可或缺的一部分,大多数管理界面都用视图生成。所以当你需要定制一个管理界面的外观(比如要在内容管理界面上显示一列缩略图)时,可以先去视图编辑页面里面看看能否搞定。
Drupal 8紧接着上一版本,把实体和字段的使用更加深入一层,不光是节点,分类、评论、用户、甚至区块都已经是实体,可以拥有自己的字段。对了,还有内建的联系表单也是其中之一,这意味着之前的Webform之类的模块需要重新思考一下自己的功能定位了。
Drupal 8的另一个显著改变是,扩展的功能(包括主题和模块)不再有“禁用(disabled)”这个状态。所以对于主题和模块,要么安装,要么卸载,而不允许它们在保留已有配置的状态下不发挥作用。对于这一改变,Drupal确实给出了充分的理由,我想我们就照做吧。有关这个话题的详细讨论可以去这里查看:https://www.drupal.org/node/1199946
如前所述,Drupal 8在貌似雷同的外表之下隐藏着重大变革,其中最突出的一个体现就是,Drupal 8的整个底层都是架设在Symfony之上的,也就是说,Drupal 8是一个名副其实的Symfony应用。
开发Symfony应用可以说是一件令人愉悦的工作。严格的MVC架构让表现和业务完全分离开来、强大的路由体系和访问控制让程序员可以把精力专注在功能的开发上、数据抽象层类库Doctrine让数据的查、删、增、改操作省力又省心,同时,Symfony的高性能也是其极力鼓吹的卖点之一。为此,一批优秀的开源项目都选择了Symfony,其中就包括我在不久之前介绍的Lavarel,以及大名鼎鼎论坛系统phpBB。
关于Symfony的论述,限于篇幅就到此为止。你可以在Symfony的官方网站或是网上很多地方找到更多更专业的资料。另外,我也曾经断断续续写过一些Symfony的入门文章,仅供参考。
在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模块开发者需要具备的先决条件,你可以看看是否全部满足:
当然,如果你只是想小试一下身手,至少需要知道以下几件事情:
Symfony严格的MVC架构使得通过URL直接执行一个php文件几乎是不可能的,程序员的代码都被放置到专门的src文件夹中,由类自动加载(Class Autoloading)、缓存预热(Cache Warmup)等等一系列复杂的机制而最终得到执行。所以,完成你的模块声明(编写.info.yml)之后,要做的第一件事就是创建一个src文件夹,用来放置你的所有PHP源程序。
Drupal 8中YAML文件几乎无处不在,其作用至关重要。info.yml负责定义基本信息,routing.yml文件负责定义路由和访问控制,links.menu.yml文件负责定义菜单链接,permissions.yml负责定义权限……等等,所以,要开发Drupal 8模块,首先要熟悉YAML。
另一个现象是,原来至关重要的.module文件在Drupal 8中是可有可无的,它的重要性已经完全被YAML所取代。除非你要实现一些钩子,否则你可以完全不需要.module文件。
下面是作为模块开发小试身手的一个代码示例。我们假定要开发的模块叫做my_module,所有的文件均放置在 modules/my_module/ 目录下,因此我们的文件结构如下所示:
三个文件中的代码依次如下:
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 下,你会在页面上找到以下部分:
勾选复选框,安装我们的模块。等待安装进度条走完,再请求 my-module 这个路径,你就会看到如下画面:
至此,我们已经成功创建了第一个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文件并不是必须的,这部分我将在以后再讨论。
接下来就是编写主题的模版文件了。
作为Symfony的姐妹产品,twig自然也成为Drupal 8模版引擎的首选。使用twig的一大好处是,主题开发者几乎不需要学习PHP就可以上手了。虽然我个人并不推荐这么做,但是对于主题开发者和前端开发者这两个岗位合二为一的情况来说(相当多的Drupal开发团队是这样),只需要较少的背景知识就可以上岗,确实不失为一件高效的事情。
关于twig的更多信息可参考:http://twig.sensiolabs.org/
有了更强大的基主题,Drupal 8的前端开发变得相当轻松。响应式是标配,还有专门的断点(Breakpoint)模块来支持这一特性。如果你是拿来主义者,可以直接去Drupal的主题社区里面看看有哪些优秀的资源可以利用。
还有一个值得一提的地方是,Drupal 8新增了内建Email类型字段,前端终于可以从繁琐的Email格式验证中解脱出来了。
关于Drupal 8的主题和前端开发我也会在以后的文章中再专门论述。
所以,我们已经准备好了,你呢?