“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
前言:
Drupal视图功能强大,用途广泛,论重要性可以算是CMS必备组件,本系列本是定位于开发的,但目前(包括官网在内)使用教程缺乏,如能精通使用会大大提升对系统的掌控力,深入了解她的各种功能和用法,就较容易明白其实现原理,因此本篇将在使用层面详述视图,也为后面的开发原理篇做好准备。
注:因为中文版翻译中个别词语翻译不当,如“exposed”被直译成了“暴露的”,更恰当的翻译应为“公开的”,“For”被直译成了“为”,恰当的翻译应该是“应用于”,不恰当的翻译会阻碍使用者的理解,如果你使用了官网默认翻译包,那么在界面中不恰当的中文翻译部分,如按钮名,会和本文不一致,因此本文将采用中英文对照进行讲解,你可在翻译管理界面自行更正,默认翻译管理界面地址为:
/admin/config/regional/translate
优雅、恰当的翻译包需要中国社区成员一致努力,感谢为此做出贡献的人们,也呼吁更多同伴参与。
视图概述:
视图(views)是通用的查询和显示引擎,为什么说是通用呢?除系统数据(实体、日志等)外,视图还能应用于自定义的数据库表,甚至是程序中的数据(计算出来的数据),更夸张的是其能从外部数据库取数据,这相当于可以应用到任意系统的任意数据库(比如连接WordPress系统的数据库并显示其数据);其能够依据各种条件组合去查询数据,可对查询出的数据进行各种处理,之后以多种显示类型(概念见下文)进行输出,核心是数据的获取、处理、显示。
各模块能通过钩子参与视图过程,管理员能精确控制其显示细节,完整的视图功能由views模块和views_ui模块提供,前者实现核心功能,后者仅提供操作视图的用户接口,当视图配置完毕后,视图UI模块可以关闭,这不会影响视图的运行。
视图应用示例:
系统中以下这些常用、重要的页面均是由视图产生:
内容页:/admin/content(系统和视图模块同时定义了该路由,视图模块优先)
人员页:/admin/people(用户和视图模块同时定义了该路由,视图模块优先)
文件管理页:/admin/content/files
日志信息页:/admin/reports/dblog(dblog和视图模块同时定义了该路由,视图模块优先)
首页:/node
由此可见视图模块的重要性
视图数据来源:
Drupal系统中的数据大部分是以实体方式提供,视图可以依据实体类型、bundle类型进行选择,并可依据关联性进行跨实体选择,当然也可以将非实体数据提供给视图,如自定义的数据库表、某个数据碎片,或者是其他数据库中的内容,自定义数据的提供将在开发篇讲解;视图系统在获取数据时,可以对其进行过滤、排序、赋默认值等。
视图数据处理:
视图得到数据后,针对单项数据(某个字段),可依据视图需要去处理值,如值替换、裁剪、剥离html标签、换行处理等等,强大的是能够运用twig语法,针对一条数据(称为行row,下文也叫数据单元)可以控制显示样式,正对整个视图可以控制布局样式。
视图数据显示输出:
新建一个视图后会得到一个视图ID,每个视图可以有不同类型的输出方式去显示,这称为有不同的“显示类型display types”,显示类型强调的是将视图输出到哪儿去,即怎么提供给系统其他部分使用,而不是强调输出的数据格式,但不同显示类型也可以采用不同数据格式,如系统默认的Page显示类型输出格式为HTML,Feed显示类型输出格式为XML,开发者可以自行实现如JSON格式的输出,因此不要将显示类型理解为数据格式类型。在同一个视图下可以添加多种显示类型,每添加一个即建立了一个“显示实例”,拥有实例ID(在底层也称为显示id,采用变量:$display_id),同一种显示类型下可以添加多个显示实例,新建视图后系统立即提供了一个“默认显示实例”,她不属于任何显示类型,也可以理解成属于默认显示类型(但同一个视图中默认显示类型下仅可有一个显示实例),默认显示实例用于储存各显示实例的共享信息,共享信息里面的配置运用到本视图所有显示实例,由此在配置时我们就可以指定某配置是应用于当前实例还是所有实例。
视图显示类型:
如前所述,视图的显示类型代表着视图的输出方式,即在哪儿渲染视图(或者说是视图如何提供给系统的其他部分),在底层各种显示类型以插件方式提供,由“视图显示插件管理器”管理,服务id如下:
plugin.manager.views.display
系统默认提供了如下显示类型:
Page(页面):
输出为一个完整页面,用URL访问,视图输出内容作为这个页面的主页面内容
Block(块):
将视图内容输出成为一个块,在区块布局中可以将其放置到所需页面位置,块和页面是最常使用的类型
Attachment(附件):
用于将输出内容附加到本视图下其他显示实例进行显示,这在需要进行补充显示时很有用,注:不能附加到其他视图的显示实例,也不能附加到附件类型的显示实例
Feed(订阅源):
feed是将用户主动订阅的若干消息源组合在一起形成内容聚合器,帮助用户持续地获取最新的订阅源内容,最常见的是RSS,这被翻译成了“种子”,是不恰当的,本文翻译为“订阅源”,用URL访问
Embed(嵌入):
用于通过php代码嵌入显示视图,比如我们在输出节点内容、或控制器直接返回渲染数组时,想在内容中嵌入一个自定义的视图内容片段,该如何做呢?此时就可以自定义该类型的视图,然后将视图的渲染数组嵌入到返回的渲染数组中,视图输出的渲染数组可以通过视图模块提供的以下函数获取:
views_embed_view($name, $display_id = 'default')
通过该类型几乎可以将视图用到任意地方
Entity_reference(实体引用):
当字段类型是实体引用时,用于提供输出以在自动完成中的显示,默认实现不能使用分页器、过滤排序表单
创建视图:
视图管理路径为:管理>结构>视图,即以下管理页:
/admin/structure/views
如果找不到该菜单请检查视图UI模块是否启用,在该页列出了系统中已建立的所有视图,可以管理她们,点击顶部的“添加视图”按钮即进入创建视图流程,在创建页面默认有以下4大区:
View basic information(视图基本信息):
输入视图名称(视图label),及机读名称(视图id),可选的输入一个描述供管理界面使用
View settings(视图设置):
选择视图数据来源,即实体类型、bundle及排序设置,这里以实体类型为单位进行选择,跨实体类型需要在建立后通过关联来实现,如有自定义视图数据也将出现在这里(如何自定义详见开发篇)。
Page settings(页面设置):
用于快捷建立一个页面显示类型的实例,新建一个视图时,可以顺带一起建立page或block显示类型的实例,也可暂时不建立,此时建立和等到随后在配置界面中通过“显示>添加”建立效果完全一样
Block settings(块设置):
含义同页面设置一样
在底层,创建的每个视图由一个实体类型为“view”的配置实体负责储存,每个视图下可创建多个显示实例,每个显示实例对应一个显示类型,每个显示类型下可建立多个显示实例,显示实例有唯一的机器名(显示id)和显示实例标题(显示label),对应着一个设置界面。
每个视图下的默认显示实例的机器名为“default”(显示标题为Master),默认实例由系统随视图一起自动创建,显示类型为default,用于储存共享数据,其他实例仅储存覆写数据,查看底层数据结构可在控制器中执行以下代码(或者使用“yunke_help”模块选择查看):
$view = \Drupal::entityTypeManager()->getStorage("view")->load($viewID);
print_r($view->toArray());
在创建视图后,页面会跳转到该视图的配置界面,即如下地址:
/admin/structure/views/view/viewID
该页面由Displays(显示)和Preview(预览)组成,预览部分用于实时输出当前显示实例的内容;显示部分用于视图配置,其标题栏中将列出本视图下每个显示实例的实例标题,该标题是可自定义的,显示实例的机器名(显示id)初始由系统自动生成(显示类型加序号的方式,如page_1,序号是从1开始的整数,也可自定义),如果建立视图时没有建立任何实例,此时会显示默认显示实例,显示标题为Master,点击标题栏中的“添加”按钮会弹出显示类型,进一步点击某显示类型会建立一个该显示类型下的显示实例;在标题栏的右侧有一个下拉按钮,有如下菜单项:
Edit view name/description(编辑视图的名称和描述):
这是对整个视图的编辑,而不是对某显示实例,点击弹出对话框,其中可添加视图标签(Administrative tags),标签用于生成主题钩子,这样就可以按标签控制主题输出,多个标签可用英文逗号或空格分隔
Analyze view(分析视图):
有时用户的配置可能导致严重的性能问题,比如数据量很大,却没有使用分页器,点击该菜单后,以对话框方式显示视图分析结果;那么系统是如何得到分析结果的呢?在底层派发了视图分析钩子“views_analyze”,需要参与分析的模块实现该钩子即可,实现中可以是任意方面的分析,只要想给用户提示信息就可实现,如果没有模块实现该钩子,或者所有钩子实现均没有返回消息,那么该菜单弹框将没有有效消息,默认安装下仅视图UI模块实现了分析钩子,当我们配置好视图后推荐点击查看
Duplicate view(复制视图):
以当前视图为基础,新建一个视图,注意你所用的中文版这里可能被翻译成了“重复的视图”,请在翻译管理界面更改
Reorder displays(对显示重新排序):
对该视图下的显示实例进行排序(拖拽四角箭头图标或输入权重值),注意默认显示实例不参与排序,其总是排在第一位
删除视图(Delete view)
删除本视图,该操作会一并删除本视图下的所有显示实例
注:在显示大版块中,除标题栏外,其他部分均是对当前显示实例的配置,下文将依次介绍各配置小版块
配置版块:次标题栏:
在标题栏下方的一整行是次标题栏,其中Display name(显示名称)可配置本显示实例的显示标题和描述,注意该标题仅用于管理目的(在管理界面的标题栏中显示),并不在视图输出显示中使用;
次标题栏右侧有一个下拉按钮,集合了对本显示实例的操作,如复制、删除、禁用、启用、复制为其他显示类型等等;不同显示类型的操作可能不同,如page显示类型有快捷访问,而block显示类型则没有
配置版块:Title(标题):
用于配置本显示实例的标题,该标题用在显示输出中;在配置对话框最顶部会出现“For(为)”下拉列表选项,这用于控制设置的作用范围(在其他配置项中将多次用到该选项),该选项极为重要,但在配置时很容易遗忘,此时可能无意间修改了其他显示实例,因此需要倍加谨慎;展开下拉有如下选项:
All displays(所有显示):
将配置作用于本视图下所有的显示实例,有该选项就可以让我们一次设置所有的显示实例,而不需要一个一个去设置,在底层,其实配置信息是被储存到了默认配置中,也就是默认显示实例中,注意如果其他显示实例存在覆写的情况下,本项将显示为:All displays (except overridden)(所有显示(除了被覆盖的)),意为仅用于默认设置,如果其他显示实例有覆写,那么不会用到默认值
This page (override)(这个page(覆盖)):
指示接下来的配置仅作用于本显示实例,在底层配置信息不存储在默认显示实例中,视图中其他显示实例不受影响
Revert to default(恢复至默认):
将配置恢复到默认值,也就是从本显示实例中删除配置数据,采用默认显示实例中的配置(注:在底层其实并非真的删除,而是有一个旗标指示从默认实例获取配置);本选项仅在当前配置不是默认值时才出现
题外话:
许多Drupal初学者遇到本节中的“For(为)”下拉列表选项会倍感迷惑,这与翻译有关,这里“For”如果能翻译为“应用到”会更清晰,如果读者明白“显示实例”是什么,那么就明白的更彻底了。Drupal中类似问题还有很多,它们无形中增加了学习难度,这就体现出了中文资料的必要性和价值,笔者也由此为能和其他作者一起书写Drupal中文资料而倍感欣慰。
配置版块:Format(格式):
在视图配置页面中,所有出现分隔符“|”的地方,有个规律:在其前面均是一个选项配置链接,在其后是对当前选项的详细设置链接,点击这些链接后以弹出对话框的方式进行选择或设置;在选项配置对话框中也都设置了当前选项的设置链接,这里的“当前”是指之前已经储存的选项,而不是表单中的当前选项(即该链接在保存或应用前不会随着表单选择项变化而变化),在刚打开选项对话框时,默认选中的选项即是已储存的当前选项,通常选择某个选项并点击应用后,会紧接着打开其对应的设置对话框。关于这一共性下文不再赘述,以下采用括号“(中文)英文”方式表示某一个或某一组具体的配置项。
数据单元概念:
这里需要先解释一下“数据单元”是什么意思:在前端网页布局设计时通常采用网格、列表或混合方式,数据单元是布局中显示的基本数据块,比如列表布局时每一行数据就是一个数据单元,以网格布局时,每一个格子中的数据就是一个数据单元,通常每个数据单元会包含多项数据,比如一篇显示新闻列表的页面,每个数据单元可能包含新闻标题、发生时间,在菜谱列表页每个数据单元可以包含缩略图、菜名、作者、上传时间等,通常数据单元里面的每项数据是相互关联的,她们一起构成一个整体数据,页面以该整体数据做为基本单元进行布局,每一个整体数据就是一个数据单元。
在一些设计和开发资料中也将“数据单元”称为“行row”,但本文依然使用更加抽象和准确的“数据单元”一词,读者须注意有时她们是相同意思,数据单元概念下文会多次用到。
在格式这一节,有两大配置项:
一、格式Format:
用于设置在当前显示实例下,各数据单元以什么布局样式进行输出,比如网格、列表等等,在底层,布局样式以插件方式提供,由以下插件管理器管理:
plugin.manager.views.style
二、显示Show
用于设置在布局样式中,每个数据单元如何显示,比如当做整体内容或仅字段组合等等,在底层,数据单元的显示方式同样以插件方式提供,由以下插件管理器管理:
plugin.manager.views.row
接下来我们先看看布局样式的选择与配置。
布局设置:
不同显示类型可供选择的布局样式不同,页面page、块block、附件attachment、嵌入embed显示类型有相同的布局样式可供选择,如下:
Grid(格子):
以嵌套的DIV元素构成一个网格去布局输出,这也是使用最多的布局方式,在响应式设计中必不可少,详见前端设计中的栅格系统,对应的设置有:
(分组字段)Grouping field Nr.1:
该设置仅在可使用字段时(数据单元采用字段组合方式,或开启了强制使用时段)才有效,可以选择一个字段用作分组字段,比如选中作者,那么可以将同一个作者发布的内容放到一起显示,如果启用了分页器,那么分组是在每一页中进行,换句话说即是先依据分页器查询出数据后,再进行分组,内容中分组字段的值相同的作为一个组,每个组被一个组元素包装,组元素通常采用div或table,在组元素内用分组字段作为标题(默认放置在h3元素中),分组是可以多级的,使用一个字段进行分组后,可以使用另一个字段在同一组中进一步分组,这就是该项“Nr.1”中数字的含义,1表示第一级分组
(使用渲染输出对行分组)Use rendered output to group rows:
仅在开启字段分组时才有效,选中时表示指定分组依据是渲染后的值(可能是覆写过的,见下文),而不是原始值(数据查询结果)
(从渲染输出中移除标签)Remove tags from rendered output:
仅在开启字段分组时才有效,在分组标题中,剥离分组字段渲染输出中的html标签
(是否强制使用字段)Force using fields:
如果行和样式插件都不支持字段,那么就无法使用字段分组,也不显示字段配置,选中该项后可以强制支持,这样就可以使用字段分组功能了
(列数)Number of columns:
网格布局中每一行有多少列,行数由内容多少决定
(是否自动计算列宽)Automatic width:
如果css或js中有设置,那么这里要改取消选择
(内容对其方式)Alignment:
可选水平对齐或垂直对齐
(CSS类添加)组配置:
可以指定是否添加默认的列或行CSS类,也可以额外添加自定义的列或行CSS类,这样便于前端显示控制,多个用空格分隔,可以在CSS类中使用tokens,tokens指占位符,用来引用其他的值,比如引用字段值,在输出时会被真实值替换,可用的tokens可以在字段一节的重写结果(Rewrite results)配置项的替换模式(Replacement patterns)一节查看,见下文
HTML List(HTML列表):
以HTML元素无序列表li或有序列表ol去布局显示内容,对应的设置有:
(分组字段)Grouping field Nr.1:
(使用渲染输出对行分组)Use rendered output to group rows:
(从渲染输出中移除标签)Remove tags from rendered output:
同前,见前文
(行类)Row class:
同前,每一行要应用的自定义CSS类,多个用空格分隔,可以在CSS类中使用tokens
(添加视图行类)Add views row classes:
是否添加默认的视图行css类,
(是否强制使用字段)Force using fields
同前,见前文
(列表类型)List type
设置使用无序列表li还是有序列表ol
(包装类)Wrapper class
包装列表元素的包装元素上使用的自定义CSS类,包装元素默认为div,默认包装类item-list
(列表类)List class:
列表元素上使用的自定义CSS类,注意列表元素是ul,而不是li或ol
Table(表格):
以表格(table元素)方式进行排版布局,这种方式下各数据单元仅以字段组合方式显示,即在底层不支持行插件,如需以整体内容方式(比如实体摘要或完整模式)输出可采用网格布局,对应的设置有:
(表格综合设置)
在对话框最顶端的表格综合设置中,可以将多个字段放置在一个表格列中显示,此时可以设置分隔符Separator以分隔字段,可以指定内容在表格中的对齐方式,列是否可排序和默认排序方式,排序仅在有自定义label时才有效,用户在表头点击label进行排序,设置表格默认排序列,是否隐藏空列,和响应式程度。注:表格排序是对全部数据进行排序,而不是分页器的当前分页,换句话说是先排序查询再进行分页
(字段分组)、(行类)、(添加视图行类)、(是否强制使用字段):
同前,见前文
(如果使用了点击排序,那么覆写普通排序)Override normal sorting if click sorting is used:
仅在选中该项时,点击排序才会有效,如未选中那么将使用默认的排序设置,无法使用点击排序;如果将排序设置公开给用户时,那么不论该项如何设置,点击排序都不生效,公开的排序设置优先级最高
(启用Drupal风格的“固定”表头(Javascript))Enable Drupal style "sticky" table headers (Javascript):
类似excel中的冻结表头,在表格很长时很有用,当启用时,下拉鼠标或滑动查看到下方的表格时,表头不会向上隐藏,而是固定在页面顶部
(表格的标题)Caption for the table、
(摘要标题)Summary title、
(表格的描述)Table description:
自定义表格标题、摘要标题、描述,在用户访问时有这些提示可增加页面的易用性
注意:这三个设置在启用了字段分组时,每一个分组均会出现一次,这可能导致不愉快的重复,此时可以使用页眉代替,见下文
(显示表格中的空文本)Show the empty text in the table:
在没有内容时,是否依然显示表格
Unformatted list(没有格式化的列表):
不添加任何默认样式,直接输出内容列表,默认以div元素包装每一行,对应的设置有:
(字段分组)、(行类)、(添加视图行类)、(是否强制使用字段):
同前,见前文
以上是我们最常用的布局设置,在不同显示类型下,可用的布局设置可能不同(在底层是因为支持的样式插件不同),如:
订阅源feed显示类型有以下显示格式:
(OPML订阅源)OPML Feed
(RSS订阅源)RSS Feed
实体引用显示类型仅有一个默认显示格式:
(实体引用列表)Entity Reference list
数据单元显示设置:
在不同显示类型及布局样式下,可供数据单元使用的显示方式可能不同,在底层即支持的行插件不同,页面page、块block、附件attachment、嵌入embed显示类型有相同的数据单元显示方式供选择,如下:
Content(内容):
将数据单元视为一篇完整的内容,以不同的内容显示方式进行显示,对应的设置有:
(视图模式)View mode:
建立本视图时,选择的实体类型拥有的视图模式,比如节点实体默认提供7个视图模式,如下:
Default 、Full content、Print、RSS、搜索索引、搜索结果高亮输入、摘要
可在以下管理页管理:
/admin/structure/display-modes/view
这些选项包含了自定义的视图模式,同时即使这些显示模式没有在某bundle上具体配置,也是可用的,此时会回退到默认模式,关于视图模式请参考本系列《实体表单显示》等章节
注意:如果视图所用的视图模式被删除,那么视图会被自动删除,换句话说如果某实体类型定义了某视图模式,在某视图中又用到了该视图模式,那么在实体视图模式管理中删除该模式后,依赖她的视图会被删除。
Fields(字段):
将数据单元视为一些字段的组合,对应的设置有:
(提供默认的字段封装元素)Provide default field wrapper elements:
是否为字段提供一个包装元素,选中后,内联字段默认以span元素包装,非内联字段默认以div元素包装,采用何种元素包装取决于模板,注意label也会被包装,在字段配置版块中,字段可以自定义她的包装元素,
(内联字段)Inline fields:
仅在“提供默认字段包装元素”被选中后有效,用于指定哪些字段采用内联方式显示,这将决定包装元素采用内联元素还是块级元素,内联元素也叫做行内元素,如果字段本身输出是块元素的话,该选项将被忽略
(分隔符)Separator:
仅在“提供默认字段包装元素”被选中后有效,用于在内联元素间放置一个分隔符,从而让输出更清晰好看,该项配置可使用html标签,分隔符仅在内联字段间出现,内联字段和块级字段间不会出现
(隐藏空白字段)Hide empty fields:
如果字段值为空,那么将不显示其label、标签等;该项需要和字段配置版块中的字段“无任何结果时的行为No results behavior”配合使用
注:在模板调试开启时,该项不起作用,因为模板的调试输出被当做了字段内容
Search results(搜索结果):
将数据单元视为搜索结果进行显示,,对应的设置有:
(显示分数)Display score:
是否显示分数,参见本系列搜索相关主题
配置版块:Fields(字段):
如果在格式配置版块选择的布局样式或数据单元显示设置不支持字段,且没有强制使用字段,那么字段配置版块将不可用,比如在数据单元显示设置中使用内容或搜索结果显示时就无需配置字段
在讲解该版块前,首先需要明白这里的“字段”概念不同于实体字段,也不同于数据库字段,从程序层面讲,这里的字段是一个插件,负责查询和显示数据,可以对接到实体字段或数据库字段,在查询上可以决定数据的来源,在显示上可以提供功能性支持,因此在渲染结果中字段除简单的数据输出外,还可以是操作按钮、某项分析数据,甚至是一个表单批量应用选择控件(如默认的内容管理页面中数据行前面的批量操作复选框),总之这里的“字段”是指数据单元中的某一项数据或控件,在底层每一个字段都对应一个字段插件对象,字段由以下插件管理器管理:
plugin.manager.views.field
在该配置块右上方有一个下拉按钮,有如下选项:
(新增)Add:
点击后弹出添加字段对话框,可以添加各种类型的字段,添加时可以指定是为本视图所有显示实例添加还是仅本实例,可快捷搜索,也可按字段类别过滤,一次可以添加多个字段,点击应用后会依次弹出各字段的配置对话框;你会发现可供选择的字段非常多,系统将实体字段属性都分解了,也提供了多值字段的下标,甚至有些并不是数据库中真实存在的字段,这在底层是由“视图数据”决定的,在“视图数据”配置中仅指定了字段插件的字段才会被显示在添加表单,详见开发篇。
(调整)Rearrange:
点击该按钮后,可以选择字段的显示顺序(拖动十字箭头图标或直接输入排序值方式排序),也可直接快速删除字段,添加的字段会按这里的顺序显示在字段配置版块,点击字段条目可进行字段配置。
不同的字段有不同的配置(配置表单由字段插件提供),但有一些配置项(字段插件基类提供)是通用相同的:
(生成标签)Create a label:
选中后会显示一个标签输入框,可以为字段的显示自定义一个label,同时可选的指定是否在标签后面加一个冒号,是否真实加冒号依赖于显示布局设置,如表格即便选中也不会添加
(排除显示)Exclude from display:
选中该项后,本字段数据会被加载,但不会显示,通常是为了用做字段分组或提供占位符使用
(点击排序使用的列)Column used for click sorting:
该配置项仅在字段是多属性字段时才有效,指定在点击排序时,默认以字段的哪一个属性进行排序
Multiple field settings(多字段设置):
这里我们先说明:多值和多属性字段是两个不同的概念,多值指同一个字段可以输入多个值,在实体字段设置中“允许的数量”一项被设置为不限或多个,而多属性是指同一个字段拥有多个列的数据,比如最常用的body就是多属性字段,其拥有格式、摘要、正文三个属性,多值是在字段被使用时决定的,多属性是字段本身的特性,多属性字段在使用时,在字段设置中允许的数量为多个时那么她也是多值字段。
这一节的设置仅在字段是多值字段时才有效,用来控制多值字段的显示方式,有如下选项:
(在同一行里显示多个值)Display all values in the same row:
在没有选中时,会依据多值字段的值个数将一个数据单元分成多个数据单元进行显示,每个数据单元仅显示一条值;在原数据单元仅包含一个多值字段时,在分出的这些数据单元中,除多值字段外其他字段数据是完全相同的,如果原数据单元包含多个多值字段,且每个多值字段均以这种方式显示的话,会导致拆分成很多个数据单元,比如有两个多值字段,一个有3条值,另一个有4条值,那么会拆分成3*4=12个数据单元进行显示。
通常我们会在同一个数据单元中显示多值字段的所有值(这里用行row来指代数据单元),因此这里需要选中,选中后会展开以下的配置项。
(显示类型)Display type:
多值字段的显示方式,默认有:无序列表、有序列表、以分隔符连接显示,当使用分隔符方式显示时可以进一步指定采用什么字符做分隔符
显示限制:
这里可以设置显示多少条值,从第几个值开始显示,从开始算起还是末尾算起,或仅显示第一条和最后一条值
Style settings(样式设定):
这一节提供字段的样式控制:
(定制字段的 HTML)Customize field HTML:
自定义字段的包装元素,同时可以为包装元素指定CSS类进行显示控制,CSS类可使用token
(定制字段标签的 HTML)Customize label HTML:
自定义字段label的包装元素,同上
(自定义字段和label的HTML)Customize field and label wrapper HTML:
为字段和label一起应用包装元素,同上
(添加默认类)Add default classes:
是否为字段、label、字段内容添加默认的CSS视图类
(使用字段的模板)Use field template:
是否使用字段模板,默认的字段模板如下:
core/themes/classy/templates/field/field.html.twig
core/themes/stable/templates/views/views-view-field.html.twig
不使用时,将仅仅使用字段的值,使用时,默认的模板会输出字段原始的label等
Rewrite results(重写结果):
这一节可以让我们改变字段的原始输出:
(用自定义文本覆写此字段的输出)Override the output of this field with custom text:
选中该项后,可以用自定义的文本代替原字段值,在自定义文本中可用token引用到原来的值或其他字段的值,可用的token请见本节的“替换匹配模式Replacement patterns”区提示,强大之处是自定义文本可以是twig模板片段,在底层使用“inline_template”元素类型进行渲染,这为我们带来了巨大的灵活性,可以使用twig语法做逻辑判断,但需要注意的是占位符变量在底层表示为以下类对象:
\Drupal\Core\Render\Markup
由于是对象形式,在有些情况下可能需要进行转换,比如有两个字段:单价和库存,我们需要计算总价怎么做呢?你可能会想到这样:
{{ field_num * field_price }}
但这是不行的,因为其是对象形式不可以直接运用算术运算符,需要先进行如下转化:
{{ field_num.__toString() * field_price.__toString() }}
也可以使用系统提供的函数:
{{ render_var(field_num) * render_var(field_price) }}
系统在模板中提供的函数均可使用(因在底层和模板执行均是使用twig服务)
(将此字段作为自定义链接输出)Output this field as a custom link:
此项可让我们有能力依据字段值构造页面链接,可指向站外,默认以字段值做链接文本(除非开启自定义文本覆写),选中后会打开众多子设置以指定链接的各方面
(替换匹配模式)Replacement patterns:
在前两项配置被选中后,可以看到替换匹配模式(也就是token占位符)区域,在其中列出了可用的占位符,这些占位符可用于css类、覆写文本等地方引用字段原始值,注意在当前字段中无法引用到排在其后的字段的值,可以通过调整字段顺序解决,如果不便于调整顺序可以再添加一次要引用的字段,然后将新加的调整到本字段前,并设置排除显示;如果是多属性字段,占位符可以引用到具体某个属性,如果是多值字段,则占位符无法引用到具体某个下标,解决方案见下文的多值和多属性字段处理一节
(裁剪字段到最大字符数)Trim this field to a maximum number of characters:
用于限制字段值中字符的长度,多值字段是在每个值上进行裁剪,裁剪的是原始值而不是经过格式化器处理的值,如果有值覆写,那么裁剪的是覆写后的值,该项选中后有如下子配置:
(保留的最大字符数)Maximum number of characters:
以字符为单位,而不是以字节为单位,不必担心多字节字符的裁剪问题
(仅在单词边缘裁剪)Trim only on a word boundary:
保留完整的单词,不会出现单词被劈断的情况,但开启该项后,如果保留字符数低于第一个单词的字符数,那么将完全没有显示,换句话说保留字符数优先,保证绝不超过
(添加省略号)Add "…" at the end of trimmed text:
是否在截断的文本后面添加省略号
(如果输出被截断则添加更多链接)Add a read-more link if output is trimmed
选中后可以进一步制定链接文本后URL,可使用token
(字段能包含HTML标签)Field can contain HTML:
选中后在截断时会运用标签矫正器,避免标签不正确关闭
(剥离HTML标签)Strip HTML tags:
启用后将剥离字段内容中的HTML标签,选中后可以进一步指导哪些标签不被剥离
(移除空格)Remove whitespace:
选中后会将输出中开始和末尾的空格删除,中间部分的空格不会
(把换行符转换成HTML的 <br> 标签)Convert newlines to HTML <br> tags:
这在字段中保存的是纯文本时很有用
多值和多属性字段处理:
多值字段的配置中有“Multiple field settings”设置(见前文),可以控制显示字段哪些值条目,以及以什么方式进行显示;多属性字段可选择字段可用的格式化器,如果仅须显示某个属性,那么可以开启覆写并用占位符指定需要的属性;在既是多值也是多属性的情况下,要显示某下标的某属性值,那么需要“Multiple field settings”和覆写设置配合使用
No results behavior(无任何结果时的行为):
这一节可以让我们指定字段无值(空值)时的行为,配置有:
(无结果文本)No results text:
设置一个文本,在无值时用来做显示,可以使用token,和html标签
(把0当作没有)Count the number 0 as empty
将数字0当做空值看待
(若为空则隐藏)Hide if empty:
无值时不显示,注意:字段的label和重写结果可能还是会被显示,须配合布局设置中的为空则隐藏一起使用
(如果内容为空则隐藏覆写)Hide rewriting if empty:
如果为空则重写结果也会被隐藏
常用的一些字段:
以“类别:字段”方式列出:
Global: Custom text
可以实现一个显示自定义文本的字段,文本中可以使用token,在输出中插入额外信息很有用
Global: View result counter
可以在结果的每个条目中添加一个数字,该数字表示该条目位于总数据量中的第几个,其会考虑分页器,包括分页器偏移设置
Content statistics: Total views
在启用核心自带的内容分析模块后才可用,输出内容访问量
Content statistics: Views today
在启用核心自带的内容分析模块后才可用,输出内容当日访问量
Content statistics: Most recent view
在启用核心自带的内容分析模块后才可用,输出内容最后一次查看的时间
视图系统使用篇上集完...
反馈互动