2.3 为图书添加对应的字段
现在让我们进入本章的正题,为图书添加对应的字段。一本图书有多少个字段?我听一个专业的朋友说过,按照国际标准,有上百个甚至上千个字段,我们不可能把这所有的字段都包含进来,那要包含哪些字段呢?我们以当当网的图书字段作为标准,如图2-8所示。另外再添加一些在实际当中能够用到的字段。
这里面的字段有书名、图片、销售价、定价、顾客评分、作者、出版社、出版时间、版次、页数、字数、印刷时间、开本、纸张、印次、ISBN、包装、编辑推荐、内容简介、作者简介、目录等。
2.3.1 把“标题”重命名为“书名”
我们首先来看书名,我们可以将其处理成为节点自带的标题,在Drupal 7中,标题是节点的属性,而不是字段,而在Drupal 8中,标题将会处理成为字段。为什么没有在Drupal 7里面处理成为字段呢?原来是计划好了的,但是后来时间紧迫,就把这个功能去掉了。不过有个第三方模块title,专门用来解决Drupal 7下面的这个问题。
我们先看一下现在的图书所包含的字段,如图2-9所示。
现在title的标签还是“名称”,我们需要将其改为“书名”,操作如下:
1)访问book内容类型的编辑页面admin/structure/types/manage/book。
2)找到“提交表单设置”里面的“标题字段标签”。
3)将其从“名称”修改为“书名”,保存即可。
这里需要注意的是,在book内容类型的编辑页面里多了一个标签“Ubercart产品设置”,里面包含一些设置。不过这些我们暂时用不到,细心的读者可以看一下。
2.3.2 把正文标签改为“内容简介”
正文的标签为“描述”,我们想用这个字段作为“内容简介”。我们可以删除这个字段,然后再添加一个“内容简介”字段,这也是可以的。不过既然系统已经自带了一个可用的字段,我们最好让其物尽其用。操作如下:
1)单击body字段的编辑链接,进入admin/structure/types/manage/book/fields/body。
2)找到“标签”,将里面的“描述”修改为“内容简介”,保存即可。
2.3.3 设置图书封面字段
uc_product_image字段的名字为“图像”,我们将其修改为“图片”。操作如下:
1)单击字段的编辑链接,进入页面admin/structure/types/manage/book/fields/uc_product_image。
2)找到“标签”,将里面的“图像”修改为“图片”,保存即可。
2.3.4 添加作者字段
1.字段设置
我们先来添加一个简单点的字段,以作者为例,在管理字段页面,找到“添加新字段”对应的输入表单,输入以下内容,如图2-10所示。
然后单击“保存”按钮,此时会出现字段设置的表单,如图2-11所示。
我们使用默认的即可,然后单击“保存字段设置”。需要说明一下的是,这里的设置是字段的全局设置,我们在接下来的字段实例设置中可以覆写这里的设置,所以这一步是可有可无的,在Drupal 8里面,这一步已经取消了。
2.字段实例设置
现在我们进入到字段实例的设置页面,如图2-12所示。
字段的设置项很多,通常都是采用默认的,需要我们设置的通常是“必填字段”、“值的数量”、“默认值”等,不同的字段类型有不同的配置选项。“标签”就是这个字段的用户可读名字。如果选中了“必填字段”, 也就是说,在用户输入时,必须输入一个作者,否则表单就无法提交。“帮助文本”是该字段下面的说明性质的文字。
对于我们选择的文本字段,它特有的设置选项是“文本栏尺寸”和“文本处理”方式,如图2-13所示。
“文本栏尺寸”就是在输入表单里面,该字段控件表单元素对应的宽度;而“文本处理”则是用来选择是否允许用户选择“输入格式”,通常文本字段使用纯文本,也就是不允许用户选择输入格式;文本域字段使用“过滤的文本”,就是允许用户选择输入格式。
接下来是“默认值”设置,如图2-14所示。这里留空就可以了,不同的字段类型,默认值的设置表单略有不同。默认值就是用户没有输入时,为其自动设置的默认值,有时候我们添加了一个字段,但是这个字段的所有值都是相同的,让用户重复输入没有必要,此时我们可以使用默认值,并将该字段使用CSS隐藏起来。这是“默认值”的用法之一。
最后是该字段实例的设置,这里的设置和刚才字段设置表单的设置内容是重复的,而且这里的设置项更多一点,如图2-15所示。
除了我们在前面看到的“最大长度”以外,这里还多了一个“值的数量”,它表示该字段最多可以输入多少个值,我们可以使用一个输入框,里面可以输入多个作者,也可以使用多个输入框,每个输入框中输入一个作者。
3.具体设置
我们的设置如表2-2所示。
现在我们保存这些设置,然后访问图书的创建表单页面node/add/book,找到我们新增字段“作者”对应的表单元素,如图2-16所示。
4.不同的字段设置会生成不同的表单
我们换一组不同的设置,如表2-3所示。
保存这些设置,然后访问图书的创建表单页面,找到 “作者”对应的表单元素,如图2-17所示。
对比一下与刚才之间的区别,这样我们会更好地理解字段设置中各项的含义。如果我们将“值的数量”设置为“不限”,此时在该表单元素的下面,就会多出来一个“继续添加”按钮,单击这个按钮,就会为这个字段增加新的输入框,如图2-18所示。
此时字段的输入框前面还有一个拖拽按钮,可以使用它来调整字段内部输入框之间的先后顺序。
我们的第一个字段就这样添加完毕了,我们对添加字段有了初步的认识。
5.字段类型
我们再来回顾一下,对在添加过程中一步跳过的地方进行补充说明。
我们来看一下字段类型,当前包含以下字段类型,如图2-19所示。
其中,Field collection和Fivestar Rating是第三方模块提供的,其余的则是Drupal核心自带的。字段类型其实就对应着数据库表中字段的类型,但是这种对应不是很严格,我们可以这样理解。这里面的“列表”对应于下拉选择框、单选按钮、复选框,后面的“整数”、“文本”、“浮点数”表示的是实际所用的存储类型;“图像”是用来上传图片的,“文件”是用来上传文件的,图片本身也是一种文件类型,Drupal 7内置支持了这种基于字段的文件管理;“术语来源”则是一个引用字段,引用的是分类术语;“文本”就是用来输入任意的短文本的,对应于文本元素;而“长文本”和“长文本和摘要”则用来输入比较长的文本,后者多了一个“摘要”,比如核心自带的body字段,用的就是“长文本和摘要”字段类型。
6.控件
一个字段类型,可以包含一个或者多个控件,比如“文本”,它的控件就是“文本字段”,而“术语来源”,则包含了4个控件:“Hierarchical Select”、 “选择列表”、“复选框/单选按钮”、“自动完成术语挂件(标签)”,如图2-20所示。
下面是Drupal核心字段类型(含第三方模块)和控件的对应关系,如表2-4所示。
Drupal 7里面,出现了“字段控”,就是很多开发者把很多东西都处理成了字段的形式,大家都觉得这种方式比较方便,比如最新的五星投票模块,它就把五星投票处理成了字段。我在Think in Drupal里面专门有一章讲解了如何定义自己的字段类型,有兴趣的读者可以参考一下。
以前我在开发Java项目的时候,都需要自己设计数据库表结构,数据库表结构的设计关系到一个人开发技能的高低,而在Drupal里面,我们通常是不需要设计数据库表结构,我们要做的是创建新的内容类型,然后为其添加相关的字段,实体与实体之间,还可以通过字段建立关联关系。
除了这里所列的这些字段类型以外,很多第三方模块提供了新的字段类型,比如Date、Link、Email、Phone模块,分别提供了日期、URL链接、电子邮件、电话等字段。Drupal 7里面字段模块很多,这里就不一一列举了。
2.3.5 添加ISBN、包装、纸张、开本等字段
很多时候,我们为了省事,经常把很多字段都简单地设置为“文本”,如果需要输入的内容比较长,则使用“长文本”,这是最常用的两个字段。比如很多可以处理成为整数的字段,也被处理成了文本,效果基本差不多。
我们按照前面的步骤,依次添加4个字段:ISBN、包装、纸张、开本,都按照文本字段进行处理。其实开本、包装也可以处理成为分类术语,不过很少有按照开本进行过滤筛选图书的。设置如表2-5 ~表2-8所示。
除了“标签”和“机读名字”以外,其他设置完全相同。
2.3.6 添加版次、印次、页数、字数等字段
像版次、印次、页数、字数这几个字段,我们也可以处理成为文本,但是这里我们使用整数字段,这样更专业一点。其实在当当网上,这4个字段就是文本。
我们以字数为例,来学习一下整数字段的添加过程。在字段的管理界面中找到“添加新字段”对应的输入框,输入以下内容,如图2-21所示。
单击“保存”按钮,进入字段设置表单页面,此时没有任何需要设置的,如图2-22所示。
我们直接单击“保存字段设置”,进入字段实例的设置页面。整数字段的设置和文本的略有不同,这主要体现在中间部分,整数类型包含“最小值”、“最大值”、“前缀”、“后缀”的设置,如图2-23所示。
一本图书的字数肯定不能为负数,所以这里的最小值设为0,最大值则可以留空。前缀和后缀是向该数字的前面和后面所追加的文本。通常图书都采用千字作为单位,所以我们这里可以把后缀设置为“千字”。
下面是我们的具体设置,如表2-9所示。
我们按照同样的方式,添加字段版次、印次、页数,对应设置如表2-10 ~表2-12所示。
2.3.7 添加出版时间、印刷时间字段
现在添加出版时间和印刷时间字段,我们仍然可以采用文本字段来存储日期,不过这里可以更专业一点,我们采用Date模块提供的日期字段的方式。
1)到模块列表页面启用模块Date、Date API。
2)此时,在字段类型里面多出3个新的字段类型:Date、Date(ISO format)、Date(Unix timestamp),如图2-24所示。
3)选择使用Date(Unix timestamp)。在“添加新字段”的输入框中,输入以下内容,如图2-25所示。
4)单击“保存字段设置”按钮,进入字段设置的页面,如图2-26所示。
我们需要收集的信息只包含年、月、日即可。如果选中了时、分、秒,则需要设置时区,这里是不需要的。同时我们也不需要结束日期。
5)单击“保存”按钮,进入字段实例的设置页面,在字段实例的设置表单中,找到More settings and values,打开这个字段集,找到Date Entry,找到Starting year和Ending year,如图2-27所示。
6)默认的+3年-3年这样的时间范围是不够用的,我们需要做以下调整,如图2-28所示。
7)保存。
然后用同样的方式,添加“印刷时间”字段,字段的机读名字为field_printing_date,其余设置与“出版时间”完全相同,这里就不重复了。
Date模块还提供了Popup输入控件,就是通过jQuery弹出框,让用户选择日期,用起来更方便一些。我们启用这一方式。
1)启用模块Date Popup。
2)编辑字段field_printing_date。
3)在编辑页面上面,有一个“控件类型”的标签,单击这个标签。
4)在控件类型里面,选择Pop-up calendar,如图2-29所示。
5)单击“继续”按钮,保存设置。
进入图书节点的添加页面,找到“印刷时间”,现在它的输入方式变成了这个样子,如图2-30所示。
而“出版时间”的输入方式则是下拉选择框的形式,如图2-31所示。
我个人觉得,下拉选择框的输入方式已经够用了,少装一个模块,就少一点负担。不装Date模块,同样能够解决问题。日期模块,再加上日历模块,可以解决现实中的活动管理问题,用起来非常方便。我们这里,仅仅用到了日期模块的一小部分功能,当然也是最基础的功能。
2.3.8 添加作者简介、编辑推荐、目录、书摘等字段
接下来,添加作者简介、编辑推荐、目录、书摘等字段,添加后的效果如图2-32所示。
它们的设置完全相同,对于字段实例设置中的“文本处理”,我们选择了“过滤的文本(用户选择的文字格式)”,因为这些内容是大段的文本,所以我们需要能够所见即所得地编辑它们。其余的设置,则完全采用默认设置。
2.3.9 添加出版社字段
现在让我们来看看“出版社”这个字段如何添加。我们经常遇到按照出版社过滤图书的需求,如果处理成为文本的话,性能会比较差,我们在这里需要把它处理成为分类。网上书店图书本身的分类,也需要处理成为分类。另外我们还打算支持中图法分类,这是中国图书业内的国家标准。
Drupal的分类其实是相当方便的。有人说分类已死,因为很多分类都可以处理成为字段里面的Options的形式,这种说法很片面。Drupal的分类用的就是自然分类法,在Drupal里面,一个分类方法就对应于一个词汇表,一次词汇表下面可以包含多个分类术语,这些分类术语之间可以存在上下级关系。我们可以添加多个词汇表,为同一事物添加多个分类方法,比如图书,可以按照出版社分类,也可以按照内部的分类法分类,还可以按照中图法分类。
在很多其他的电子商务系统或者CMS系统中,它们的分类只有一个,用起来很不灵活。
1.创建“出版社”词汇表
导航到“首页 ? 管理 ? 结构 ? 分类”页面,当前路径为admin/structure/taxonomy,如图2-33所示。
Drupal的标准安装,自带了Tags这个词汇表,而我们新装的Userpoints模块,又新增了一个Userpoints词汇表。我们现在需要创建一个自己的词汇表“出版社”。
1)单击“添加词汇表”链接,进入词汇表的创建页面,如图2-34所示。
2)输入图2-34所示的内容,单击“保存”即可。下面就是我们新建的词汇表“出版社”,如图2-35所示。
2.为“出版社”词汇表添加分类术语
我们单击“列出术语”链接,进入“出版社”的术语列表页面,如图2-36所示。
目前还没有任何可用的术语,让我们添加一个出版社,单击“添加术语”链接,在名称字段里面输入“人民文学出版社”,如图2-37所示。
其他的采用默认的配置即可,单击“保存”按钮。
在术语的编辑/添加表单页面,还存在以下设置选项:描述、关系、URL路径设置。描述就类似于节点的正文,但是它本身不是字段;关系用来设置术语的重量和父术语,重量决定着术语的相对位置,而父术语则用来设置术语之间的层级关系,如图2-38所示。
URL路径设置如图2-39所示。这是用来设置术语的路径别名的,术语的默认路径为taxonomy/term/[tid],我们在这里可以将其设置为publisher/[tid],我们在后面的部分将会讲解这一点。当前pathauto将其自动设置为了“出版社/人民文学出版社”,这样的语义更强一些,但是对于我们这些中文用户来说,URL看起来就是乱码,因此也就没有什么用了。
另外,需要说明一下的是,由于我们这里启用了Hierarchical Select模块,所以当前的父术语的添加在编辑术语时存在一些小问题。为此,我经常使用taxonomy manager模块来管理分类术语,这样更加方便一点。
3.分类术语也是实体
另外,需要注意的是,在词汇表的管理界面,我们在上面看到有这样的标签“管理字段”、“管理显示”,如图2-40所示。
这是因为每个词汇表就对应于一个Bundle。什么是Bundle,一个内容类型就是一个Bundle。添加一个词汇表,就类似于添加一个内容类型。 由于一个词汇表对应于一个Bundle,那么就可以为它添加字段,而新增的字段将会显示在该词汇表所属分类术语的编辑表单中。
我们现在创建好了“出版社”词汇表,现在让我们为“图书”添加出版社字段。
1)输入以下内容,如图2-41所示,单击“保存”按钮。
2)在字段设置表单中,对于词汇表,我们选择“出版社”,如图2-42所示。然后单击“保存字段设置”按钮。
3)在字段实例设置中,全部采用默认的设置。保存即可。
对于“术语来源”这样的字段类型,唯一需要设置的是“词汇表”。
2.3.10 添加中图法分类字段
接着,我们创建“中图法分类”词汇表,用户可读名称为“中图法分类”,机读名称为clc。
并添加以下术语:
1.使用taxonomy manager模块批量添加分类术语
这次添加的内容有点多,我们只选用了中图法的大类,这对我们来说足够了。我们当然可以采用刚才介绍的办法,一个一个地添加分类术语,但是这样比较麻烦。这里采用一种简单的办法,就是使用前面提到的taxonomy manager模块。
1)下载、安装并启用taxonomy manager模块。
2)进入该模块的管理界面,路径为admin/structure/taxonomy_manager/voc。
3)单击Add new vocabulary链接,输入以下内容,并保存,如图2-44所示。
4)重新回到taxonomy manager模块的管理界面,如图2-45所示。找到“中图法分类”,单击这个链接。
5)我们看到一个新的页面,如图2-46所示。一次可以添加多个术语。
6)我们的术语数量远超过了默认的3个,所以需要使用MASS TERM IMPORT(WITH TEXTAREA),单击这个链接,打开对应的文本域字段,把我们刚才需要添加的分类术语复制到里面,如图2-47所示。
7)单击下面的“添加”按钮,便完成了我们的工作,如图2-48所示。
除了上面提到的批量添加多个术语以外,taxonomy manager模块还提供很多其他的功能,比如一次删除多个、上下移动术语的位置、导出CSV以及分类术语的编辑功能。我比较喜欢用的就是这个一次添加多个分类术语功能,能够节省时间。
2.添加“中图法分类”字段
现在让我们为“图书”添加“中图法分类”字段,设置如表2-13所示。
其他采用默认设置。
2.3.11 添加图书分类字段
接着添加网上书店自己的分类,每个出版社、每个网上书店的经销商都有自己具体的分类方法,但是大家的分类结构都是一致的。我们采用如下二级结构分类。
1.创建“图书分类”词汇表
创建一个新的词汇表,名称为“图书分类”,机读名字为book_category。然后使用taxonomy manager模块添加上面所列的分类术语,如图2-49所示。
首先添加第一级分类,接着分别添加第二级分类,在添加第二级分类的过程中,需要选中对应的父术语,这样新增的这些分类术语就自动放在了对应父术语的下面,如图2-49所示。
2.添加“图书分类”字段
接着,为“图书”添加“图书分类”字段,设置如表2-14所示。
我们在这里第一次使用了级联选择模块提供的控件,采用默认设置即可。此时对应的表单元素的效果如图2-50所示。
这里只有两级分类,第一级选择了“小说”,第二级的选项就变成了“情感、 武侠、 科幻”。如果我们第一级选用“外语”,那么第二级的选项就变成了“英语工具书、 英语考试、 英语读物”,如图2-51所示。
3.级联选择模块
Hierarchical Select控件的设置选项并没有放在字段实例的设置表单页面,它是放在控件类型的选择页面(admin/structure/types/manage/book/fields/field_category/widget-type)。
它包含Save lineage(保存一列)、 Level choice(层级选项)、 Resizable(可调整大小)、 Level labels(层级标签)、Dropbox settings(下拉框设置)、Editability settings(可编辑性设置)。
下面我们分别说明一下。Save lineage如图2-52所示。它包含两个选项,一个是整列保存,另一个是只保存最深层次的术语,也就是级联选择的最后一个。
Level choice包含两个选项,一个是只能选择层级中最底层的术语,另一个则是允许选择任意层级上的术语,如图2-53所示。
可调整大小对应于字段中的这个部分,如图2-54所示。
如果我们按住它并往下拉的话,效果如图2-55所示。
而Level labels则是对应于每个层级的默认选项的。假如我们启用了层级标签,并输入以下内容,如图2-56所示。
2.3.12 使用field group将字段归类
2.3.13 用Field collection处理作者字段
到现在为止,其实我们的图书字段已经创建完毕了。我在Drupal 6下面搭建网上书店时,字段创建的工作到此基本告一段落。不过后来我对比当当网、京东网这样的大型电子商务网站,发现它们上面的作者字段分得更具体一点。我们知道一本书可能有多个作者,这本书可能是写出来的,也可能是编出来的,还可能是译出来的。也就是说,作者字段包含两部分信息,第一部分是人名,第二部分是著编译。一个字段,能包含两个输入框吗?如何解决这样的问题呢?
在Drupal 6下面,这个问题过了很久才得以解决。而在Drupal 7下面,Field collection模块便可以解决这样的问题。我们在这个网站上将会在多处用到Field collection模块,这个模块的作者是Fago,他也是Rules、Entity API模块的作者。
1)找到作者字段,如图2-67所示。单击它右边的“删除”链接。
我们看到这样的对话框,如图2-68所示。
我们现在还没有添加任何图书数据,所以这个字段目前还是空的。单击“删除”按钮。
2)我们添加一个新的字段,名称还是原来的作者,不同的是,字段类型我们采用了Field Collection,控件类型采用Embedded(嵌入),如图2-69所示。
3)单击“保存”按钮,字段配置、字段实例配置全部采用默认的即可。把这个字段再次拖拽到“图书基本信息”里面。如果现在访问添加图书的表单页面,好像没有看到这个字段的输入框啊?是的,现在还是看不到的。我们只能看到一个空的字段集,如图2-70所示。
4)访问Field Collection的管理界面,当前路径为admin/structure/field-collections,找到刚刚创建的字段field_author,如图2-71所示。
5)field_author在图书里面是一个字段,但是它本身又是一个Bundle,或者说是一个Field Collection类型的实体。所以我们可以为它添加字段,单击上图中的“管理字段”链接,进入字段管理页面。
6)添加字段“作者名字”,字段类型为“文本”,具体设置如表2-15所示。
7)添加字段“著编译”,字段类型为“列表(文本)”,如图2-72所示。