第一篇入门篇 入门篇主要是学习Drupal平台开发环境的搭建,平台系统的安装,后台管理员的基本功能操作使用,及对一些基本概念的了解。对于初学者来说,Drupal的管理界面过于复杂,因为Drupal把更多的配置权力交给了系统开发用户,所以,初次接触Drupal会觉得复杂。但是,一旦熟悉了Drupal的界面环境,就会游刃有余。 对于一个刚接触Web开发的业余爱好者,建议先了解HTML和CSS,虽然用Drupal开发一个Web应用系统基本可以不用写代码,但是在一些配置细节上,会出现HTML和CSS的概念。 安装好的Drupal代码,基本包含一些主要模块。基础篇主要学习内核已有的这些功能模块。同时,本书也会推荐学习一些相关第三方模块,来实现更复杂的功能。 本书把Drupal系统的结构分成以下几个部分来学习: 有模块管理,内容管理,内容类型,内容分类,多媒体内容,内容显示,菜单管理,用户、角色与权限,主题管理,首页设计,社交分享,中文翻译与多语种网站,还有一些实用的开发模块介绍,以及针对移动应用的设计,最后介绍如何让系统运行在真实的服务器上。 书山有路勤为径,学海无涯苦作舟 第1章Drupal介绍 1.1开源内容管理系统 大多数的Web应用都是以内容管理为主,例如,公司、政府、学校、社交媒体、电子商务、在线慕课学习,等等。因为内容管理系统的相似性,开发一个Web系统都没有必要从底层开始写代码。首先,可以考虑使用框架,例如,Java Web的流行框架Struts 2+Spring+Hibernate,或者PHP的框架Lavarel、Symfony 2及中国的ThinkPHP。但是,这些框架仅仅是一个中间件、一个开发包接口,它可以让Web系统开发人员从更高一层来写代码,虽然提高了代码开发效率,但是代码的重用性还是有问题。所以,为了提高代码的重用性,软件行业出现了一种开源内容管理系统(Content Management Systems,CMS)开发平台。之所以称为平台,是因为一个初级的系统原型已经搭建完成,形成一个脚手架工作平台,开发者可以在系统上用模块组合方式添加功能,实现系统需求。开发过程中,基本功能的添加都不需要写一行代码,大大提高了代码的重用性,通过安装第三方的插件或模块就可以实现更多功能。大多数CMS之所以搭建一个开源的平台,是希望使用这个平台的软件开发者可以通过开源的生态环境贡献代码模块,减少代码重复开发。 目前,开源内容管理系统多如牛毛,例如,基于Java语言开发的CMS有Magnolia CMS、OpenCMS、Hippo CMS、Pulse和MeshCMS等,基于PHP语言的最流行CMS有WordPress、Drupal和Joomla,本书选择Drupal开发平台作为学习和研究的内容。 1.2Drupal的特点 Drupal是一个开源的基于PHP的内容管理系统,成立于2000年。在国外,使用Drupal的网站有: University of Colorado, State of Colorado, The Economist, Dallas Cowboys, Nasa.gov。 Drupal具有以下特色。 (1) 可以定制的内容类型(Content Type)和视图(Views),就相当于,用户可以自由创建一个实体(Entity),添加属性字段,映射到数据库的表,视图(Views)可以让用户自由地查询数据库的表,重新整合,显示数据。 (2) 可以灵活定制用户角色和授予资源访问权限。 (3) 完善的多语种支持,可以从社区下载翻译包,或由用户端直接翻译词条。 (4) 多站点(Multisites)支持,多个域名或子域名使用一套核心代码,每个域名配置不同数据库,减少代码的重复,简化维护工作。 (5) 强大的分类(Taxonomy)系统,针对每个内容类型的分类体系,分类既可以作为标签(Tag),也可以作为菜单。 (6) 开放的模块开发接口,用户可以开发自己需要的模块,模块又分为主题模块和功能模块,除了一部分主题模块需要付费外,基本都是开源免费的。 (7) Drupal主要是针对专业开发人员,入门容易,深入难,这主要是因为其设计思想和管理界面较为复杂,学习和管理的难度大。 (8) Drupal的安全性做得最好,达到了企业级的安全防护。 1.3Drupal的版本 Drupal创建的可用版本是从2000年发行的4.0版开始,到2020年6月的9.0版本。最流行的版本是6版和7版,而6版已经停止更新和支持,所以目前建议使用7版和8版。Drupal 8.0alpha2版本发布于2013年6月,到2019年9月已经有很多第三方模块更新并支持Drupal 8版本。但是,最成熟和支持模块最多的版本是Drupal 7。本书主要使用Drupal 8和Drupal 7来构建应用系统。 1.4Drupal 7、8、9版本的区别 Drupal 8的内核是重新开发的,底层使用了PHP的Symfony 2框架和twig模板文件语言,具有更高的代码可维护性,完全面向对象的开发方式,内核支持移动响应式,安全性更高。由于早期的PHP(PHP 5.5以前的版本)没有使用面向对象编程思想,所以,Drupal 7采用面向过程的编程,Drupal 7的核心使用底层的PHP原生系统,所以没有依赖第三方的类库。 虽然Drupal 7 和 8 几乎采用了完全不同的编程结构,但是使用Drupal平台开发系统的使用者几乎感受不到底层的变化,平台的安装流程还是一样的,代码的文件目录结构和文件命名基本保持一致,基本的架构思想也没有变化,节点(Node)、内容类型(Content Type)、区块(Block)和视图(Views)这些概念还都是一样的,后台管理的界面也没有过大的变化,所以,两个版本的学习是互通的。 对于职业开发人员,特别是模块的开发,Drupal 8开发的学习难度会有所提升,需要熟悉Symfony 2框架和twig模板文件语言,及第三方的类库依赖,所以,Drupal 8开始通过PHP社区的Composer包管理工具和Drupal自己的CLI管理工具管理模块的开发。当然,Drupal 7时代流行的Drush命令式管理工具依然是主要的管理维护工具。 Drupal 7和8版本的变化,是一个内核的分水岭,其模块是彼此不兼容; 而Drupal 8和9版本接口基本一致,文件目录的结构也基本一致,并且其模块是相互兼容的,所以用Drupal 8开发的系统很容易迁移到Drupal 9。 1.5Drupal核心概念思想 1.5.1模块 Drupal只提供核心代码,并包含一些核心模块,大部分功能需要安装第三方模块实现。如果做一个简单的个人或公司网站、一个博客或论坛等经典网站,核心代码就可以完成,不需要再安装第三方模块。模块可以分为主题和功能模块,管理员后台专门有菜单入口管理主题和功能模块。 1.5.2节点 Drupal把所有独立的内容都作为节点,任何的内容类型创建的内容都是节点,节点相当于数据库表中的行,是一个具体的数据实例对象,具体表现为一个内容页面。 1.5.3内容类型 Drupal可以灵活设计用户自定义的内容类型,内容类型相当于做一个数据库表的设计,用来存储内容。 1.5.4字段 在定义内容类型时,字段是最小的数据单元,对应于数据库表的字段,系统提供了一些默认的常用字段,字段也可以由第三方模块创建,然后,在定义内容类型时使用这个定义好的字段。这些已经定义好的字段是开放的接口,可以让其他模块查询和使用这些字段。例如,视图(Views)模块,可以自由地选择需要显示的内容字段。 1.5.5区块 Drupal把一些事先做好的功能定义为一个块组件,例如,菜单、在线用户统计等,然后把这些块组件放置到一个由主题定义好的页面布局区域中。 1.5.6分类 Taxonomy是一个独立的分类系统,可以给整个系统的内容定义分类,定义好的分类表可以作为一个字段,被内容类型引用。这样,在创建新内容时,可以给内容贴上分类标签。 1.5.7实体 实体是一个对象的实例,可以分为用户、评论、文件、消息、节点、分类术语等。 1.5.8视图 视图可以让用户自由地定义需要显示的内容,例如,我们想只显示所有文章的标题和发布时间,通过视图模块就可以实现,甚至还可以实现数据库的多表查询,显示查询结果。 第2章Drupal开发环境搭建与安装 2.1Drupal的开发环境 Drupal系统是基于PHP的Web应用,所以,需要有一个Web服务器+数据库+PHP的开发环境。许多Web服务器是开源免费的,用得最多的是Apache Web 服务器,可以安装在Windows和Linux操作系统中。除了Web服务器,一般网站还要有数据库,例如用得最多的MySQL数据库。此外,服务器端还需要脚本运行环境,例如Web Java(JSP)或PHP,所以要安装这些脚本的运行环境。产品级的服务器需要做很多设置,这是服务器管理员的事情,作为Web应用的开发人员,也要了解基本的Web服务器的搭建,以便完成系统开发与测试需要。开发阶段,在一台机器上,可以既是服务器也是客户端,所以,开发阶段的服务器搭建,越简单越好。这里有很多一次性安装而无须设置复杂的Web服务器集成软件,而且很多是免费的。对于使用PHP开发的初学者,选择使用Windows操作系统作为开发平台较为合适,专业级开发者可以选择Linux平台。对于Window平台,我们把开发服务器简称为WAMP(Window+Apache+MySQL+PHP),Linux版称为LAMP(Linux+Apache+MySQL+PHP)。本章主要介绍Window平台开发,为了简化安装,通常选用多合一的集成服务器,常用的集成服务器有 WAMPServer, XAMPP, Uniform Server。 在国内,这些服务器软件的官网比较难登录,可以到开源软件库(https://sourceforge.net/),通过搜索以上集成服务器名称下载。本书推荐安装Uniform Server(简称UniServerZ),是一个便携的可以复制到U盘,在Windows操作系统下运行的精简版Web的服务器。 2.2UniServerZ安装 UniServerZ是一个轻量级的Web集成服务器,2019年9月最新版(13.4.1)的安装包大小只有47.5MB。虽然是轻量级,但是包含最新版的Apache、MySQL或MariaDB(MySQL的克隆版),及phpMyAdmin数据库图形化管理工具,并有一个功能齐全的菜单界面,可以轻松地对Apache、MySQL和PHP服务器进行配置。而且是绿色软件,解压即用,可以复制到U盘,携带方便。 从Uniform Server官网或开源软件库(https://sourceforge.net/projects/miniserver/)下载,下载的文件是13_4_1_ZeroXIII.exe,直接运行,会解压到一个uniserverz目录,打开目录,运行UniController.exe,开始会检测80、3306和443端口的占用情况,如果被占用,会弹出窗口,报告哪个进程(提供PID进程号)被占用,然后到Windows的任务管理器结束这个进程。第一次启动会弹出修改MySQL的root用户密码窗口,修改root密码后,进入控制界面,界面上可看到Start Apache和Start MySQL按钮的状态框是红色的,单击启动Apache和MySQL服务,如果成功,将显示绿色,如图21所示。 图21UniServerZ控制管理界面菜单 Apache启动后会自动打开默认浏览器,显示服务器首页,如图22所示,表示Web服务器工作正常。 图22Apache Web服务器启动成功的首页 如果运行出现错误,可能是微软的C++运行环境库版本没有安装正确,可以到微软官网(https://support.microsoft.com/enus/help/2977003/thelatestsupportedvisualcdownloads)下载安装 Visual C++ Redistributable for Visual Studio 2019,选择下载vc_redist.x86.exe,然后安装。 UniServerZ还包括一个图形化的MySQL数据库管理工具phpMyAdmin和MySQL命令行终端(Console)。所有的Web项目代码放在www目录下。 2.3Drupal 8安装 2.3.1下载Drupal 在官网下载Drupal(https://www.drupal.org/project/drupal)。目前,Drupal官网仅支持Drupal 7、8、9版本的下载,如图23所示。由于是Windows的开发环境,我们选择Drupal 8的drupal8.7.7.zip压缩版,Linux开发环境建议下载drupal8.7.7.tar.gz。 图23Drupal下载界面 将drupal8.7.7.zip复制到UniServerZ服务器的Web根目录www下,解压到目录drupal8.7.7,改目录名字为drupal8,这是我们的项目目录。 进入drupal8/sites/default 目录,将 default.settings.php 复制为 settings.php; 新建目录 files(Linux 下请设置好 files 目录权限,允许所有用户进行写入操作)。 2.3.2数据库配置 从UniServerZ菜单栏打开数据库控制台(MySQL Console),或者打开Windows命令窗口,输入: Mysql -u root -p 输入超级管理员root密码,登录到MySQL控制台。如图24所示是通过UniServerZ的MySQL Console登录的控制台窗口,在标题栏中可以看到root账号的密码是“root”。 图24MySQL控制台窗口 创建数据库名为drupal8,用户账号为drupaluser,密码为123456,并授予所有权限给drupaluser用户。执行命令如下: Create database drupal8; Use drupal8; create user drupaluser@localhost identified by '123456'; Grant all privileges on drupal8.* to drupaluser@localhost; Flush privileges; 2.3.3中文化设置 Drupal默认语言是英文,但是在Drupal安装过程中可以选择语言,并可以自动下载语言包,由于Windows平台问题,无法在线安装语言包,所以需要手动下载安装简体中文包。 到官网下载简体中文包drupal8.7.7.zhhans.po,有两个下载网址,一个是FTP方式的(https://ftp.origin.drupal.org/files/translations/8.x/drupal/),在列表中选择drupal8.7.x.zhhans.po下载; 一个是HTTP方式的(https://localize.drupal.org/download),打开菜单Download,选择中文简体版本drupal8.7.7.zhhans.po下载。 将下载的中文包文件复制到项目目录/sites/default/files/translations下面。如果安装的是Drupal 7版本,中文包的安装目录在/profiles/standard/translations/下面。 2.3.4安装Drupal 8 打开浏览器,访问http://localhost/drupal8,进入系统安装界面,如图25所示,选择“简体中文”。 图25安装并选择“简体中文” 单击Save and continue按钮进入下一步安装界面,系统出现在线安装简体中文语言包的错误信息,如图26所示。 图26在线安装中文包的错误信息 因为事先下载了简体中文语言包,所以在安装页面的最下面,单击try again继续安装,这时可以看到中文界面。对于初学者,选择“标准”安装,标准安装的系统会安装内核自带的基本模块,例如,会有基本页面和文章的内容类型。如果选择“最小”,系统会默认最小配置。还有一个Demo选项,将直接安装一个Umami Food Magazine网站,可以从这个网站学习更多的功能,接着单击“保存并继续”按钮,如图27所示。 图27选择“标准”安装 进入检查安装需求界面,如果出现错误(Error),就属于严重问题,需要根据提示进行纠正才能进到下一步安装。这里出现了警告(Warning),可以忽略,单击“仍然继续”进入下一步安装,如图28所示。但是,这里的两个警告中,PHP OPCODE需要启用来提高系统性能。这是在PHP 5.5版以后,PHP增加了解释语言编译成为字节码功能,来提高PHP的运行速度,所以开启这个功能是有好处的。 图28安装中出现的警告 在服务器端找到php.ini配置文件,修改下面两项参数来启用OPCODE功能。 [opcache] zend_extension=php_opcache.dll opcache.enable=1 接着,输入前面配置好的数据库信息,主要是数据库名称、数据库账号和密码,如图29所示。可以忽略高级选项的设置。 图29输入数据库信息 到这一步,会进入比较长时间的安装过程,主要是安装一些默认的模块,以及翻译词条的添加,需要安装43个模块,如图210所示。 图210进入模块安装 最后一步是输入站点信息,如站点名称、站点的email地址、系统管理员账户和密码,及网站的时区等。最重要的是要记住管理员账户及密码,作为后台登录用,如图211所示。 图211完成站点信息设置 2.4Drupal 8后台管理 Drupal系统创建好后,会默认使用创建的管理员账号登录,这是一个具有所有权限的超级管理员,可以看到后台管理菜单界面,如图212所示。 图212后台管理界面 下面简单介绍管理菜单的主要功能和用途。 2.4.1内容 这里主要用来管理显示站点所有已发布和未发布的内容、评论和上传的文件,系统管理员可以搜索内容,对每个内容进行批量修改、删除和添加,设置发布和未发布状态。 2.4.2结构 站点的主要功能结构的定义可在这个菜单下完成,例如,菜单管理、内容类型管理、分类词条管理、区块布局和显示视图管理等。 2.4.3外观 站点的外观主题管理,可以在这里添加新主题,设置站点主题的配色、站点logo等外观信息。 2.4.4扩展(模块) Drupal 8中菜单翻译成为“扩展”(Extend),Drupal 7中的菜单是“模块”(Module),是Drupal最强大的功能,在这里,可以添加新模块、启用和关闭模块、卸载和删除模块。 2.4.5配置 配置主要用于系统级的设置,如地区和语言的设置、性能设置、图像样式和文件系统的设置等。还有一些复杂模块安装后,其设置也会在这里出现。 2.4.6人员 这里是用户管理的入口,可同时管理用户、角色和权限。系统管理员可以查看系统所有的用户列表,管理员可以在这里添加、修改和删除用户、角色和权限信息。 2.4.7报告 这里主要用来检查系统状态,例如,日志信息、状态报告、检查Drupal内核版本和模块版本可用更新等。 2.4.8帮助 这里是一个在线系统使用手册,主要介绍系统内核默认安装的模块的使用和管理。第三方模块安装后,如果模块包含帮助文档,也会出现在这里。 第3章模块 Drupal系统开放式的模块管理,让Drupal开发爱好者贡献了丰富的功能模块,所有模块可以通过Drupal官网(https://www.drupal.org/project/project_module)下载,到2019年9月已经有43882个共享模块。 3.1模块查找 在官网模块管理页面,可通过模块分类词条、Drupal的版本号或模块名称来查找需要的模块,如图31所示。 图31模块的查找 模块是Drupal系统实现某个功能的主要组成部分,但是在几万个模块中找到自己想要的模块是比较难的,所以一般先会在通用搜索引擎如Google、Bing或百度中查找所需要的功能,查看别人使用哪些Drupal模块来实现这个功能,而且还可以看看使用这些模块的建议和经验。 3.2模块存放的位置 Drupal的模块必须存放到modules目录下面。而Drupal 8的modules目录是位于项目根目录下,Drupal 7项目目录下的modules主要存放内核默认安装的模块,第三方贡献的模块放在sites/all/modules目录下。Drupal系统会在这两个地方查找调用模块。 3.3模块下载、安装、使用 模块是构建应用功能的最基本操作,首先找到适合的模块,并进入官网的模块管理页面,阅读模块的主要功能及其他依赖模块,如果模块适合,就可以下载安装使用。模块可以选择手工下载、在线安装或使用Drush或Composer命令行管理工具安装。 3.3.1手动安装 直接从官网的模块管理页面下载安装模块,模块采用两种方式压缩: zip和tar.gz。如图32所示是Panels模块的下载页面,在Windows开发环境下直接下载zip压缩包。 图32Panels模块的下载页面 模块版本和Drupal版本是有联系的,下载页面有8.×和7.×,分别表示兼容Drupal 8和7的版本,-4.6和-3.10分别是模块的版本号,要根据Drupal版本下载模块,两者不能混用。dev表示开发版本,为最新版,但是不建议使用。 模块下载解压后,直接复制到相应的modules目录,不要去随意修改模块的目录名称。 3.3.2系统管理页面下载 Drupal系统的模块管理菜单提供了模块安装界面,无须手工复制模块文件到Modules目录。打开系统菜单“管理”|“扩展”,有一个“安装新模块”按钮,可以进入模块安装界面,如图33所示。在Linux开发环境下,如果开发系统已经安装好FTP文件服务器,从官网复制模块下载的URL,可以选择“从URL安装”的在线安装方式,也可以通过前面下载到本地的模块文件,以“上传并安装模块或主题包”的方式,完成本地安装。 图33管理界面安装模块 3.3.3模块启用与依赖 模块安装好以后,需要勾选启用新安装好的模块,有的模块会有依赖,所以必须先安装依赖模块,再勾选依赖,才能启用新模块。如图34所示Profile2模块的“请求”表示需要依赖Entity API模块,“支持”表示Profile pages模块依赖Profile2模块。 图34模块的依赖关系 有些模块安装完成并启用后,还需要进一步配置,可以单击模块列表最右边的“配置”。有些模块的配置会自动安装到管理员的“配置”菜单中,需要到系统菜单“配置”那里找。 3.4模块的升级 类似于模块的安装,模块升级有三种方式: 手工升级在线升级,以及通过Composer和Drush管理工具升级。 3.4.1手工升级 手工升级模块是最简单的,首先检查有没有可升级的模块,在系统菜单下,进入模块,单击“更新”标签,会发现有哪些模块可以升级了,如图35所示。 图35检查模块的升级状态 然后到官网的模块页面下载最新版本(单击“发布说明”),在模块安装目录下,删除老版本模块,复制新版本模块。升级完成后,必须通过浏览器执行update.php来更新数据库。如果进行update.php发生错误,需要修改/sites/default/setting.php参数“$update_free_access = TRUE;”。 3.4.2在线升级 模块在线升级最好是在Linux的开发环境下进行。有两种方式实现模块在线更新: 修改相关目录的拥有者,或者搭建FTP服务器。前者比较简单易行。 1. 修改相关目录权限实现在线模块更新 由于Drupal系统需要在线下载模块文件到/modules目录下,所以必须修改所属目录的拥有者权限为Apache服务器用户组和用户名为wwwdata。Drupal 7系统中,修改Drupal项目下的/sites目录的拥有者,进入到当前Drupal项目根目录下,执行命令如下: sudo chown -R www-data:www-data./sites Drupal 8系统的项目目录结构有变化,需要分别将Drupal项目根目录下的/modules,/theme,/librarie和/sites的目录拥有者改为wwwdata。 2. 使用FTP服务器 需要事先在Linux机器中安装好FTP服务器。更新Drupal模块时,在模块管理页面,检查更新状态后,如果有更新,直接单击“下载这些更新”,进入下载状态,完成下载后,如果是在产品状态,必须勾选维护模式选项,单击“继续”按钮,如图36所示。 图36在线更新模块 接着,输入FTP用户账号和密码,如图37所示是Drupal 7的在线升级界面。 图37输入FTP账号和密码 这里需要注意的是,可以使用Linux登录的账号密码,但是这个账号也必须是Drupal项目目录的拥有者,可以通过“ls l”目录查看命令检查drupal目录的拥有者。如图38所不,Drupal 7目录的拥有者是drupal用户,归属于drupal组。 图38检查drupal目录的拥有者 3.4.3使用Drush和Composer工具升级 关于使用Drush和Composer工具来升级模块的方法,请关注工具篇的Composer和Drush工具章节。 3.5用Module Filter管理模块 Drupal系统自带的模块管理功能比较简单,如果安装了很多模块,查找管理模块会比较麻烦,Module Filter模块可以生成一个模块分类菜单,及提供模块搜索过滤功能,让管理者很快查找到需要的模块。 下载Module Filter模块,安装并启用后,如图39所示是新的模块管理界面。 图39Module Filter全新模块管理界面