142. 视图views的使用(下)
接中篇,下集将介绍视图设置的高级配置版块
配置版块:Contextual filters(上下文过滤器):
前文已经介绍过普通过滤器(或叫常规过滤器),她的过滤器值和操作符来自配置视图时管理员的设置,或者来自公开给用户的过滤表单由用户提供;上下文过滤器和普通过滤器类似,都是用于对数据单元进行过滤,所不同的是过滤器值来自视图显示时的环境,即“上下文”,比如正在查看的节点、用户登录状态等,最常见的是来自URL路径部分(普通过滤器的值来自参数部分),“过滤器值来自环境”看似和普通过滤器区别不大,实则在底层实现中有巨大的不同,上下文过滤器能将视图的应用范围提高一个量级,这里举两个例子来说明其用途的必要性:
1、构建一个视图,仅显示当前登录用户发布的文章,即提供一个页面供用户查看自己所发布的文章,该需求中过滤数据的关键是用户,而用户来自登录信息
2、在查看一篇文章时,在旁边显示一个块,块中列出这篇文章的作者发布的其他文章,该需求中过滤数据的关键也是用户,但用户来自正在被查看的文章的作者
以上两个例子典型的说明了上下文过滤器的用途,值均来自视图在显示时才出现的环境,普通过滤器是难以做到的,在本节末尾我们将会实现该示例,但在此前先看一看各选项的含义。
上下文过滤器由视图参数插件提供,插件管理器如下:
plugin.manager.views.argument
某个字段是否可用作上下文过滤,当可用时又使用何种参数插件,这在“视图数据”中指定(详见开发篇),在上下文过滤器配置版块点击右上方的添加时,仅能被用作上下文过滤器的字段被列出,添加一个字段后,将弹出一个对话框来显示配置表单,该表单由视图参数插件提供,不同的插件所提供的表单不同,通常各种参数插件都继承自同一基类,基类中提供了如下通用配置选项:
在 URL 上找不到过滤器值的时候When the filter value is NOT in the URL:
最常见的做法是把上下文过滤器值放在URL路径段中传递(不是查询参数),在路径设置中过滤器值的这一段用“%”占位,但块显示类型没有URL,有时传递过滤器值也不通过URL,因此这一部分指定了过滤器值不在URL中的行为,有如下配置项:
(为指定字段显示所有结果)Display all results for the specified field
在URL中找不到过滤器值时忽略该上下文过滤器,显示全部信息
(提供一个默认值)Provide default value
提供一个默认值,将进一步展开默认值来源选项:
Content ID from URL
从url中查找内容id做过滤器值
Fixed
提供一个静态的固定值,将进一步展开固定值输入框
Query parameter
查询参数,将进一步展开参数名输入框,和回退值输入框(当参数名不存在时使用)
Raw value from URL
URL中的原始值,将进一步展开选项以指定采用路径中的哪一段,和是否使用别名代替内部路径
Taxonomy term ID from URL
从URL中查找分类术语id
查找当前登录的用户id,这是实现前文示例1的关键
User ID from route context
从路由上下文中查找用户id,将进一步展开“也查找节点的作者”,这是实现前文示例2的关键
以上这些默认值来源选项由“参数默认值”插件提供,插件管理器如下:
plugin.manager.views.argument_default
每一种来源对应一种插件,假设我们想从会话数据中获得默认值,或其他复杂的渠道来源,那么就需要实现该插件了,实现后将会出现在这里
(显示 "未找到页面")Show "Page not found"
如题,相当于404页面
(显示摘要)Display a summary
显示一个摘要,相当于目录,即把所有过滤结果不为空的过滤器值都以链接的形式列出,用户点击某过滤器值链接时会以此过滤器值打开本视图,过滤结果为空的过滤器值不会被列出;该方式可以让用户知道有哪些过滤器值和该值下有多少数据,点击链接可查看详细,用作统计很有用;核心自带的“存档archive”视图就采用了该方式去显示每月发布量。选中后将展开以下选项:
(排序方式)Sort order
指定过滤器值列表以升或降序显示
注意:当选择“显示摘要”后,排序配置版块中的排序项不应该公开给用户,否则将影响显示摘要
(排序依据)Sort by
指定以过滤器值本身进行排序,还是以其过滤出的结果数量进行排序
(格式)Format
值链接列表显示方式,默认有列表(html元素li)、无格式显示(默认以DIV显示,在指定为行内时用SPAN,见下)
(基路径)Base path
在显示类型为页面类型时,过滤器值的URL链接自然和页面的路径一直,然而块显示类型没有路径,那么值链接应该指向哪里呢?这就是该项的用途,此时应该填入块显示实例对应的页面显示实例的路径,不带前后斜杠,该项在显示类型为页面时无需指定
(随链接显示记录数)Display record count with link
在显示的过滤器值链接后,追加显示该过滤值将过滤出的记录总数
(覆写显示条目数)Override number of items to display
用于控制显示的过滤器值链接的数量,在可能的过滤器值数量极大时很有用
(以内联方式显示条目)Display items inline
仅在显示格式为无格式显示时才有效,在无格式显示时,默认以div元素包装过滤器值链接,启用该项后将使用SPAN元素包装,以便进行行内显示,而不是块级显示
(分隔符)Separator
仅在显示格式为无格式显示时才有效,在以内联方式显示时用什么分隔符去分隔过滤器值链接
(显示为“未找到结果”)Display contents of "No results found"
如题
(显示 "没有访问权限")Display "Access Denied"
如题
(另外)Exceptions
设置一个另外值,当找到的过滤值为该值时,将忽略本上下文过滤器,默认为“all”
(构造视图URL时跳过默认参数)Skip default argument for view URL
当构造视图URL时,是否跳过默认参数。
(当过滤器值在URL中存在,或有默认值提供时)When the filter value IS in the URL or a default is provided:
(覆盖标题)Override title
覆写页面标题,可以使用Twig语法或token占位符,可用的占位符在替换模式(Replacement patterns)中列出
(指定验证条件)Specify validation criteria
用于验证url中或默认提供的过滤器值是否合法,选中该项后会展开以下配置项:
(验证器)Validator:
这里可以选择要使用的验证器,这些验证器由“视图参数验证”插件提供,管理器如下:
plugin.manager.views.argument_validator
如果默认提供的验证器不能满足需求,就需要自定义该类型的插件了(详见开发篇),不同验证器会进一步展开不同配置选项,通用的选项有(由插件基类提供):
验证访问视图的用户是否有权对本上下文过滤器作用的字段进行查看、编辑、或删除的权限
(多参数限制)Multiple arguments
允许的过滤器值个数,单个还是多个,多个用逗号或加号连接,分别表示“and”和“or”
(基于角色的用户限制)Restrict user based on role
验证访问视图的用户角色,只有被指定的角色才可访问
(验证失败时采取的动作)Action to take if filter value does not validate
可选:
忽略:Display all results for the specified field
显示页面未找到:Show "Page not found"
显示摘要:Display a summary
显示无结果:Display contents of "No results found"
显示访问拒绝:Display "Access Denied"
(更多)More
提供上下文过滤器的额外配置,有如下项:
(允许多个值)Allow multiple values
是否允许多值,如果允许,那么可用逗号(表示且)或加号(表示或)连接多个值,如1+2+3或 1,2,3
(排除)Exclude
要理解该项需要先明白:上下文过滤器和普通过滤器的区别除值的来源不同外,还有上下文过滤器不能指定操作符,仅有两个操作:“等于”或“不等于”,默认采用等于,该项选中后意为取反,即“不等于”
示例:
这里我们做两个示例,实现本配置版块前面提到的列子:
提供一个页面供用户查看自己所发布的文章:
要求只能看自己的,不能看他人的,匿名用户不能访问。建立一个页面类型的显示实例,这里略过常规的字段、过滤等选项设置,仅说明如何配置上下文过滤器:
第一步:
添加“作者”(Authored by),随后弹出配置对话框
第二步:
在“When the filter value is NOT in the URL”中选中“Provide default value”,指定默认值为:
“User ID from logged in user”
说明:这一步保证上下文值来自登录信息
第三步:
选中“Specify validation criteria”,指定验证器为:“User ID”,选中“Validate user has access to the User”,在“Access operation to check”中选择“Edit”,在“Multiple arguments”中保持默认值“Single ID”不变
说明:这一步保证查看视图的用户只能看自己,不能查看他人的文章,等价于:过滤器值对应的用户账户需要能被视图查看用户编辑才行,也就是自己或有管理用户权限的管理员
第四步:
选中“Restrict user based on role”,选中“已登录用户”
说明:这一步保证视图仅供注册用户查看,不允许匿名用户
第五步:
在“Action to take if filter value does not validate”中选择“Display "Access Denied"”
说明:这一步保证匿名用户或注册用户查看他人信息时,显示访问拒绝
最后点击应用保存即可
在查看一篇文章时,在旁边显示一个块,块中列出这篇文章的作者发布的其他文章
先建立一个块显示实例,仅显示标题,且仅允许发布状态,按发布时间排序,然后按一下步骤:
第一步:
添加“作者”(Authored by),随后弹出配置对话框
第二步:
在“When the filter value is NOT in the URL”中选中“Provide default value”,指定默认值为:
“User ID from route context”
并选中新弹出的“Also look for a node and use the node author”
说明:这一步保证上下文值来自正在被查看文章的作者
第三步:
选中“Specify validation criteria”,指定验证器为:“User ID”,不要选中“Validate user has access to the User”,在“Multiple arguments”中保持默认值“Single ID”不变,选中“Restrict user based on role”,选中“已登录用户”
说明:这一步保证文章作者是匿名用户时,验证不能通过
第四步:
在“Action to take if filter value does not validate”中选择“Hide view”
说明:这一步保证文章作者是匿名用户时,不显示块
第五步:
添加上下文字段“Content: ID”,弹出对话框,在“When the filter value is NOT in the URL”中选中“Provide default value”,指定默认值为“Content ID from URL”,在“More”中选中“Exclude”
说明:这一步是为了避免正在被查看的文章也出现在块中
第六步:
在“No results behavior”中添加全局分类下的“Text area”,输入“该用户没有其他文章了”,应用
在分页器中打开更多链接,采用自定义链接,指向一个查看作者全部文章的视图页面,链接中可通过“{{ arguments.uid }}”传递参数
说明:这一步保证用户仅发布一篇文章时,显示一个友好的提示,在有很多文章时提供更多链接
第七步:
点击应用并保存视图,并在区块配置中添加刚建立的块,在块配置中覆写标题为“该用户还发布了:”,可见性条件中选择“页面”,输入链接模式“/node/*”,保存区块即可
这样在查看文章时就会显示当前文章作者发布的其他内容了,匿名用户则不会显示
关于上下文过滤器的额外说明:
如果上下文过滤器的值是通过在URL路径中传递的,那么同样的过滤功能通过普通过滤器也能实现,只不过变为用户在过滤表单中输入然后通过URL查询参数传递了,但上下文过滤器提供了更多控制,有更好的用户体验,在路径中可选的用百分号做占位符,不论是否在路径中添加占位符,在底层生成的视图路由会有路径占位变量
上下文过滤器官网资料:
https://www.drupal.org/node/1578558
配置版块:Relationships(关联):
关联和数据库查询中的join语句是类似概念,该配置版块是配置更高一级的应用层面的关联,即用于将两个内容类型或实体类型的数据通过实体引用字段进行连接,为了更直观的理解,举个例子:
这里假设我们创建了两个节点内容类型:
产品:用于储存产品相关信息,如价格、描述等
品牌:用于储存产品所属品牌的信息,如品牌创始人、品牌建立时间、描述等
产品通过“品牌字段”引用到其归属的品牌,该字段属于实体引用字段,字段机器名为field_brand
现在要求视图输出产品信息的同时输出品牌建立时间,因为后者不在产品内容类型中,因此属于跨内容类型输出,此时需要先在关联配置版块点击“新增”关联字段,选择“Content referenced from field_brand”并应用,这样就将品牌字段设置成了连接产品和品牌两个内容类型的关联字段了,然后在字段配置版块添加品牌建立时间,并在随后弹出的字段配置中会出现“关联”设置选项,选择刚刚添加的“品牌”即可,这样就能按要求输出了
在关联配置版块添加关联字段后,有以下通用配置:
(需要这个关联)Require this relationship:
该项被选中后,只有包含该关联的信息才会被输出(在底层该项影响join的类型,当启用时为INNER JOIN,不启用时为LEFT JOIN);以前文产品和品牌为例,如果某产品条目的品牌字段为空,即没有指定品牌,那么在该项启用时,此产品条目不会被输出,如果没有启用该项,那么会输出但被关联内容将是空值
(管理标题)Administrative title:
输入一个管理标题,用于在引用到该关联的地方显示,当关联有相同默认值时用来做区分
(关联)Relationship:
该项也可以叫关联依赖的关联,或多级关联,仅在有可依赖的关联时该项才出现;关联是可以多级的,换句话说就是可以通过多个关联字段“串起”多个内容类型或实体类型,为了说明该项的用途,这里还是以上面的产品和品牌为例,现在要求输出产品信息的同时一并输出以下两项信息:
1、产品条目作者的用户名
2、产品所属品牌条目作者的邮件地址
分析:
输出产品作者的用户名比较简单,通过作者字段关联即可,但输出品牌条目作者的邮件就不那么直接了,需要先以产品做起点,通过品牌字段做关联找到对应的品牌条目,然后再以品牌条目的作者字段去关联用户实体,从而找到作者邮件地址。
实施:
为了输出产品条目的作者用户名,我们添加作者字段做关联(作者字段是一个实体引用字段,储存的是用户实体的UID),在随后的关联字段配置对话框的“Relationship”项选择“不使用关联”,在“Administrative title”中输入“产品作者”,然后在字段配置版块,添加用户实体分类下的用户名字段,在随后的字段配置对话框中关联项选择“产品作者”,点击应用即可输出产品条目作者的用户名了
注:输出产品条目的作者用户名其实通常并不需要去设置关联,直接添加作者字段即可,该字段虽然储存的是UID,但其格式化器设置中提供了输出用户名的选项,因此可以直接输出,但需要注意这种输出方式和通过关联输出的底层原理是不一样的,该方式是在格式化器中通过UID去查询用户名,而不是在视图层面去关联查询
我继续实现输出产品所属品牌条目作者的邮件地址,这里需要继续在关联配置版块添加作者字段做关联,这次和前次添加作者做关联所不同的是在随后的配置对话框中,“Relationship”项必须要选择前文添加的“品牌字段”,这表明该作者关联字段是建立在品牌关联字段之上的,也就是被关联内容的进一步关联,此时作者字段处于关联链中的第二级,接着在“Administrative title”中输入“品牌作者”,然后在字段配置版块中,添加用户实体分类下的用户邮件字段,在随后的字段配置对话框中关联配置项选择“品牌作者”,这样就达到目的了。
在关联配置版块点击“调整”Rearrange可以调整各关联字段的排序,这里需要注意,被依赖的关联需要排在依赖它的关联前面,换句话说,应按关联链排序,链中前面的关联应该在后面的关联前面
在关联的底层实现中,数据查询是从基本表(视图初始选择的实体类型)开始,因此SQL采用“LEFT JOIN”关联查询,因此如果被关联的数据中有多条匹配,那么数据会出现多条,换句话说,假设前文的一个产品属于多个品牌,那么在输出时,产品信息将输出多次
配置版块:Exposed form(公开表单):
该配置版块用于控制公开给用户的过滤器、排序表单中的文字、行为、显示位置等
(在块中显示公开表单)Exposed form in block
布尔选项,该项仅在页面、feed显示类型下有效,如果选择启用,那么过滤排序表单将不会和视图一起显示,而是放在块中显示,这允许你控制过滤排序表单在页面中的位置,但你需要自行在区块控制中添加块,区块分类为“Views”,区块名格式如下:
“Exposed form: 视图机器名-显示实例机器名”
添加块后须指定仅本视图才显示;注意如果已经设置为以块方式显示,而后又取消,那么需要自行在区块控制中删除添加的块,否则页面将显示块损坏
(公开表单的样式)Exposed form style
有两个可选项:
(基本)Basic
在初始状态下用户不用设置过滤排序项,将直接按默认配置过滤并显示,有如下配置项:
Submit button text
提交按钮所用文字,默认为“应用”
Include reset button (resets all applied exposed filters)
是否包含重置按钮
Reset button label
重置按钮所用文字
Exposed sorts label
排序字段的label
Allow people to choose the sort order
是否允许用户选择排序顺序
Label for ascending sort
升序label
Label for descending sort
降序label
(必须输入)Input required
在基本风格下,页面初始状态将会按过滤器或排序中的设置直接显示数据,但“必须输入”风格与此不同,初始并不显示任何内容,而是显示一个提示,只有用户设置了过滤或排序后点击应用才会开始显示,也就是显示前,用户必须先输入过滤或排序控制项,本项名字也由此而来,其包含了基本类型所有的配置项,另外还有:
(要求提示文本)Text on demand
用于设置一段文本在初始状态下去提示引导用户
配置版块:Other(其他)
用于控制一些杂项:
(机器名)Machine Name
设置本显示实例的机器名,即显示id
(管理注释)Administrative comment
为本显示实例设置一个注释,以便其他管理员或自己在长时间后知道这个显示实例的用途和注意事项
(使用AJAX)Use AJAX
布尔选项,启用后将在翻页、排序、过滤等地方采用AJAX来呈现内容,而不是刷新页面
(在摘要中隐藏附件)Hide attachments in summary
布尔选项,在有附件(附件类型的显示实例)附加到本显示实例的情况下,本显示实例有上下文过滤器,且其无值的默认行为是显示摘要时,指示是否显示附件
(上下文链接)Contextual links
布尔选项,是否显示上下文链接,在显示时可在视图输出页面点击上下文链接直达视图配置页面,详见本系列上下文链接主题
(使用聚合查询)Use aggregation
布尔选项,是否启用聚合查询,启用后在字段、过滤、排序版块中每个字段后面将出现“聚合设置”(Aggregation settings),聚合查询用于对数据单元中某个字段应用聚合操作,如求和、求平均值、求最大值等。
默认提供以下聚合类型:
Group results together:
让该字段参与聚合分组,聚合只作用于组内条目;如果字段的聚合类型设置为该值,那么该字段值相同的所有条目被划分为一个分组,其他字段选择的聚合函数仅作用于该分组内的所有条目。选中该项后可进一步选择以该字段的哪一个属性(Group column,分组用的列)作为分组依据,并能可选的附加一些通用列作为分组依据(如bundle、语言等)。
bug提示:选择该项后对话框本应进一步展开这些进一步设置项,但并没有,需要点击确定后重新打开对话框才会显示,当切换到其他选项时,本选项展开的设置也不隐藏,原因在于对话框没有进行表单状态处理
Count
求记录总数,不管本字段值是否相同
Count DISTINCT
求记录总数,但值相同的只算一条
Sum
求和,即分组中全部条目的本字段值之和
Average
求平均值
Minimum
求最小值
Maximum
求最大值
Standard deviation
求总体标准差,即SQL语句中的STDDEV_POP聚合函数,“总体标准差”概念详见数理统计
聚合示例:
为说明聚合的用途,这里展示一个示例:
先建立一个“产品”内容类型,有三个字段:型号(字符型)、库存(整数型)、价格(浮点型),建立后填充5条样本数据,其中三条是一个作者,另外两条是另一个作者
现在要求用视图输出样本数据的条目总数、按型号的平均价格、库存总数,实现如下:
第一步:
建立一个页面类型视图,表格布局,配置好访问地址,分页器设置为输出全部数据,暂时不开启“使用聚合”
第二步:
在字段配置版块添加对应的型号、价格、库存字段,label分别设置为:总条数、均价、总库存;在过滤配置版块添加状态为已发布,内容类型为产品,排序版块留空
第三步:
在“高级Advanced”>“其他Other”中,开启“使用聚合Use aggregation”,此时在字段、过滤版块中,前一步添加的字段后面均会出现“聚合设置Aggregation settings”
第四步:
点击“型号”字段的聚合设置,聚合类型选择“Count”,点击应用,注意这里如果选择“Count DISTINCT”将表示型号总数,而不是样本数据的条目总数。
点击“价格”字段的聚合设置,聚合类型选择“Average”,点击应用
点击“库存”字段的聚合设置,聚合类型选择“Sum”,点击应用
最后保存视图,访问该视图页,我们将看到计算出的样本数据的条目总数、按型号的平均价格、库存总数。
在此基础上我们继续要求:按发布作者进行统计,该怎么办呢?实现如下:
第五步:
在字段配置版块添加内容作者字段“Authored by”,在随后弹出的聚合设置中,聚合类型选择“Group results together”,组列选择“Target_id”,点击应用,随后弹出字段配置对话框,保持默认即可,保存视图,再次查看视图页面,此时已经按作者进行了分组统计
如果你是完全按照上面的步骤做的,那么可以看到两行数据,每行显示一个作者的发布统计,此时进一步要求,按作者发布条目的中数量进行排序,怎么实现呢?吐如下:
第六步:
在排序配置版块,添加“型号”字段,聚合类型选择“Count”,点击应用,在随后的排序配置对话框中选择“降序Sort descending”,应用,保存视图即可。
总结:
聚合查询有时很有用,比如我们显示文章时,可按照其评论数量来排序,类似需求很普遍,总得来说有统计要求时,往往需要聚合查询,这里有一些注意事项:
1、在默认的UI使用中只能针对单个字段使用,不能跨字段,如上列中求所有库存的产品总价(库存乘以单价,再求和),这样的复杂功能涉及到复杂查询(子查询),可用程序在底层去修改查询对象实现
2、一些字段可能变的不可用
(查询设置)Query settings
有如下配置项:
(禁止SQL重写)Disable SQL rewriting
启用后,将忽略所有的查询标签,其他模块无法通过相关钩子进行查询修改,如hook_query_alter
(排除重复)Distinct
这将在sql中使用“Distinct”关键词,使得完全相同的数据仅被显示一次,启用后查询比较耗费资源,慎用
(使用从服务器)Use Secondary Server
启用后,如果数据库有从服务器,且是有效的,那么将优先使用从服务器,如果无效那么将回退到主服务器,该项在数据库有主从架构时非常有用,极大提高系统整体性能
(查询注释)Query Comment
可以添加一个查询语句的注释,会被传递到数据库服务器,这在调式和日志时很有用
(查询标签)Query Tags
自定义查询标签,其他模块可以通过标签钩子修改查询,如需设置多个可用英文逗号分隔,除自定义的查询标签外,系统还会自动添加两个默认标签:'views'、'views_' . $viewID,在修改钩子中可以通过元数据的“view”键获取视图可执行对象(通过该对象可以获得视图的全部信息)
(缓存)Caching
用于控制缓存策略,可选项有:
(无)None
不要缓存,不利于性能
(基于标签)Tag based
用缓存标签去失效缓存,这也是使用最多的,最合理的选项
(基于时间)Time-based
基于时间去控制缓存,有如下配置项:
Query results(查询结果)
查询结果可以被缓存的时间,超期必须重建
Rendered output(被渲染的输出)
被渲染输出的html等内容可以被缓存的时间
(CSS类名)CSS class
设置CSS类名,将用在显示实例输出的包装元素上,该元素包裹着整个视图输出,可用这里设置的css类名进行前端控制,当有多个时用空格分开,除这里设置的外系统也会添加一些默认类名,如“view”、 “view-视图ID”
视图模块设置:
基本设置:
针对视图模块的基本设置页路径如下:
/admin/structure/views/settings
这些配置数据保存在“views.settings”配置对象中,各选项含义:
Always show the master (default) display(总是显示主(默认)显示)
每一个视图都有一个默认显示示例,用来储存所有显示示例的默认设置,该项控制在视图编辑页是否将其显示出来,默认不显示
Always show advanced display settings(总是显示高级显示设置)
在视图编辑页是否展开高级设置项,默认不展开
Allow embedded displays(允许嵌入显示)
是否允许嵌入显示,在代码层面可以通过views_embed_view()使用嵌入显示,默认不开启,注:该选项功能暂未启用
Label for "Any" value on non-required single-select exposed filters
在公开的过滤表单中,如果是非必填的,那么会出现“任意值”选项,该项用于控制“任意值”选项使用的label,即选择“<Any>”还是“- Any -”,默认为“<Any>”。注:该项设置实际上并不会起作用,在代码层面已移除。
Live preview settings(实时预览设置)
Automatically update preview on changes(在变更时,自动更新预览)
在视图配置改变时,自动触发预览,默认选中
Show information and statistics about the view during live preview(在预览的时候显示视图的信息与统计)
预览时,是否显示视图的信息与统计,默认显示,选中该项后会展开更多设置细节
Show the SQL query(显示SQL查询)
显示SQL查询语句
Show SQL query(显示SQL查询)
设置查询语句的显示位置,在预览内容的上方还是下方
Show performance statistics(显示性能统计)
是否显示视图性能分析数据
Show other queries run during render during live preview(在呈现期间,在实时预览期间显示其它查询)
在渲染视图时,系统可能会运行其他一些数据库查询,选中该项会把这些查询也显示出来
高级设置:
针对视图模块的高级设置页路径如下:
/admin/structure/views/settings/advanced
这些配置数据同基本设置一样保存在“views.settings”配置对象中,各选项含义:
Disable views data caching(禁用视图数据缓存)
视图默认会缓存数据库表、模块等数据以提高性能,选中该项后将禁用缓存,这在生产站点将有很严重的性能影响
Clear Views' cache(清除视图缓存)
提交按钮,点击后将清空所有视图的缓存
Add Views signature to all SQL queries(在所有SQL查询中添加视图签名)
是否添加视图签名,即在所有视图产生的SQL查询语句后面添加视图名字,格式为“视图名:显示实例名”,这在数据库日志分析和调试时很有用,正常情况下不必开启,默认值为不开启
Display extenders(显示扩展)
默认安装中该项不显示,因为没有有效的扩展显示插件定义,仅在有显示扩展插件定义时才有效,用来控制扩展显示插件的开启与关闭,扩展显示插件用于跨显示类型修改视图输出
视图的编辑与保存:
在视图的编辑页面用户所做的所有配置修改都被保存在临时储存器中(即:共享临时储存,服务id:tempstore.shared,见本系列的临时储存主题),直到用户点击“保存”按钮后才会正式生效,同时临时储存中的数据被清除;如果用户点击了“取消”按钮,那么会直接清除临时储存中的数据,相当于所有尚未保存的修改自动撤销;在未保存前,用户可以刷新页面,此时所做修改不会丢失(因为修改并非保存在前端,而是后端的临时储存中,因此可以跨页存在);如果用户做了修改后既不保存也不取消,那么临时储存器在达到超期时间后会自动删除数据,默认超期时间是一周(可配置),这相当于是点击了取消按钮。
为了解决多用户并发编辑视图所产生的问题,当一个用户正在编辑视图时(即临时储存中有修改数据时)视图会被锁定,仅允许该用户编辑,如果此时另外一个有权限的用户试图去编辑该视图,那么页面会给出类似如下的提示:
“This view is being edited by user yunke, and is therefore locked from editing by others. This lock is 6 seconds old. Click here to break this lock.”
并禁止编辑(实际上在前端还是能编辑,但所有的修改会直接丢失),但用户可以点击提示中的“break this lock”链接强制废除锁定,强制废除时,前一个用户所做的所有修改将撤销(临时储存被清除)
个性化视图:
即主题化视图,在视图的配置中,我们可以添加各种自定义CSS类去控制外观,同时我们也可以提供自定义的模板进行控制,在系统中提供了从细到总的主题钩子机制,钩子名详见:
\Drupal\views\Plugin\views\field\FieldPluginBase::themeFunctions
\Drupal\views\ViewExecutable::buildThemeFunctions
也可打开主题调试查看钩子建议
补充:
1、相关参考文档:
官网视图模块文档:
https://www.drupal.org/docs/8/core/modules/views
官网用户手册文档:
https://www.drupal.org/docs/user_guide/en/views-chapter.html
2、视图是用来显示内容的,不适用于配置实体,如何通过视图显示自定义数据库表等请见开发篇
结束语:
好了,视图使用层面的所有细节都已经讲完,随后的主题将讲解实现原理,但开始前请先在心中想一想如果自己来实现这些功能会怎么规划处理呢,这样在理解实现原理时才有趣,才会充满期待