“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
接上篇
配置版块:Filter criteria(过滤条件):
该配置版块用于设置各种过滤条件对数据单元进行过滤,各过滤条件可以组成分组,在组内或组间可用“与”或“或”进行连接,相当于在程序中使用括号进行条件组合,但默认不支持多层分组嵌套(组中再分组)。
应用一个条件就是应用一个过滤器,各种类型的条件对应不同类型的过滤器,过滤器以插件方式提供,由以下插件管理器管理:
plugin.manager.views.filter
可能有读者疑惑:用作过滤的值是否是字段部分覆写后的值,这里需要注意过滤器插件和字段插件无关,过滤器插件并不运行在字段插件之上,换句话说过滤并非作用在查询出来的结果集上,而是作用在数据的查询阶段(构造SQL的where部分以获得结果集),而字段设置部分的覆写是作用在数据查询出来以后。
各字段使用何种过滤器插件在“视图数据”中指定,没有指定过滤器的字段不会出现在过滤添加表单中,详见开发篇
在该配置块右上方有一个下拉按钮,有如下选项:
(新增)Add:
点击后弹出添加对话框,这里实际上是在添加过滤器作用的对象,通常是字段,不同类型的对象会运用不同的过滤器(插件),添加时可以指定是为本视图所有显示实例添加还是仅本实例,可快捷搜索,也可按组类别过滤(这里有个bug:中文界面下类别数少于英文,但实际条目数是一样的),一次可以添加多个过滤条件,点击应用后会依次弹出各条件的配置对话框
(与/或调整)And/Or Rearrange:
点击该按钮后,可以排序条件,建立条件组,指定组内及组间的逻辑关系(拖动十字箭头图标或直接输入排序权重及选择组),也可直接快速删除条件和组,添加的条件会按这里的组织方式显示在过滤配置版块,关闭对话框后点击单个条目可进行该类型条件的具体配置。
过滤器通用设置:
过滤器设置表单由过滤器插件提供,不同类型的过滤器,其过滤设置不一样,但有些配置是通用的(由插件基类提供),通用配置如下:
(把这个过滤条件显示给网站的访问者,允许他们更改过滤条件。)Expose this filter to visitors, to allow them to change it
用于配置是否提供一个有过滤设置选项的表单给用户,让用户可自行选择过滤值,表单采用GET方法提交, 所有过滤参数均以查询参数在URL中进行传递。当选中该选项后,将进一步打开如下设置项:
(公开的过滤器类型)Filter type to expose
前文讲到不同类型的字段对应不同类型的过滤器,每种过滤器由一个插件提供,此“过滤器类型”和本设置所指的过滤器类型是不同的概念,这里的过滤器类型是指本过滤器以哪种方式提供给用户使用,举个例子帮助理解:
假设我们选择了文章创建时间作为过滤条件,由于创建时间保存的是时间戳,因此默认应用的过滤器类型是日期过滤器,我们要过滤出过去一天内发布的文章,需要先选择一个比较操作:“大于Is greater than”,然后选择值类型为相对类型,值为“-1 day”,这样就可以了,用户如果需要其他时间范围可以在公开的过滤表单中输入值,但是这里有个问题:用户可能对“-1 day”这样的用法不了解,体验很差,那么是否可以预先给出一些范围供用户选择即可呢?是可以的,本质上是我们预先设置好各个范围的操作和值,然后将这些范围提供给用户选择即可,这种做法叫做分组过滤器,而不预先设置好需要用户自行定义叫做使用单个过滤器,这里的单个和分组即是本设置项所指的类型,因此本设置项有两个可选值:
(单个过滤器)Single filter:
以单个过滤器设置方式提供给用户使用,用户可以自行设置比较操作、值或两者均可设置
(分组过滤器)Grouped filters:
也叫群组过滤器,不用用户去设置过滤器,而是提供一组预先定义好的“操作和值”以供选择即可,此时用户不能自定义操作和值,只能从预定义中进行选择,每一组预定义管理员都可以给出一个label进行提示。
不论是选择单个还是分组,都会有一些通用的设置选项:
(标记)Label
在过滤器表单中本过滤项的标题
(描述)Description
在过滤器表单中本过滤项的描述
(过滤器标识符)Filter identifier
一个变量名,在URL查询参数中以该变量名来传递过滤器值,必填,允许的字符有:字母、数字、点号“.”、连字符“-”、下划线“_”、波浪符“~”
在使用单个过滤器设置时有如下通用配置:
(记住用户最后一次的选择)Remember the last selection
刷新后不会以默认值方式出现,而以用户的选择做默认值
(公开操作符)Expose operator
选中后,用户可以指定过滤器使用的操作符号
(限制有效操作)Limit the available operators
控制可让用户选择的操作符
(操作符变量名)Operator identifier
在URL查询参数中以该变量名来传递操作符,该项仅在公开操作符时才有效
在使用分组过滤器时有如下通用配置:
(可选)Optional
过滤器是否可选,如果是,那么将出现“任意”选择项,表示所有值均可
(控件类型)Widget type
提供的分组选项采用什么控件,默认有下拉列表和选择框
(允许多选)Allow multiple selections
是否可以选择多个分组选项
分组列表:
以表格方式提供各分组的配置项,默认有是否设定为默认值、分组label、操作选择、值选择、移除分组、添加分组
常用过滤器:
各种过滤器提供了非常强大的过滤功能,她们以插件方式提供,被前文所述“plugin.manager.views.filter”插件管理器管理,这里列出一些例子:
字符串过滤器:
插件id:string,默认用于文本型字段,如标题字段等,提供了以下这些匹配方式:
Is equal to:等于
Is not equal to:不等于
Contains:包含,配置值为一个字或词
Contains any word:包含任意词,配置值为“空格分隔的字词或英文双引号包括的句子”
Contains all words:包含全部词,配置值为“空格分隔的字词或英文双引号包括的句子”
Starts with:以配置值开始
Does not start with:不以配置值开始
Ends with:以配置值结束
Does not end with:不以配置值结束
Does not contain:不包含配置值
Length is shorter than:字符数比配置值短,配置值为一个整数
Length is longer than:字符数比配置值长,配置值为一个整数
Regular expression:正则表达式
Is empty (NULL):无值
Is not empty (NOT NULL):有值
数字过滤器:
插件id:numeric,默认用于数值型字段,如价格等,提供了以下这些匹配方式:
Is less than:小于“<”
Is less than or equal to:小于等于“<=”
Is equal to:等于“=”
Is not equal to:不等于“!=”
Is greater than or equal to:大于等于“>=”
Is greater than:大于“>”
Is between:两数之间,等效数据库“BETWEEN”
Is not between:不再两数之间,等效数据库“NOT BETWEEN”
Regular expression:正则表达式
Is empty (NULL):是空值
Is not empty (NOT NULL):不是空值
时间过滤器:
插件id:date
继承自数字过滤器,将值视为时间,可以添加相对时间,如值为'+1 day',那么表示当前时间加上一天后的结果(相当于:time()+24*60*60),相对时间的表示详见php函数:strtotime。
组合过滤器:
插件id:combine
继承自字符串过滤器,默认使用字符串过滤器的操作符,该过滤器允许在多个字段上搜索匹配,在底层会用“CONCAT_WS”查询函数把字段组合在一起,再应用匹配操作
多值及多属性字段用作过滤:
多值字段:
当以多值字段作为过滤条件时,条件会作用到每一个值上,这可能导致查询出的数据单元重复,假设我们有一个叫做“卖点”的多值字段,字段类型为字符串,用来储存产品的买点特性,每一个卖点均是一个值,如果要求过滤出至少有一个卖点的产品,此时如果采用字段本身做条件,条件为值不为空,那么当一个产品有N个卖点时,将被列出N次,为了避免重复,此时我们应该采用字段的下标(:delta)做条件,条件为值等于0(这意味着至少有一个卖点,值等于1,意味着至少有两个卖点,依次类推)。如果要查询出卖点中有包含某个字符的产品怎么办呢?此时必须使用卖点字段本身做条件,但如果此时同一款产品中有N个卖点都包含了该字符,那么将导致该产品重复N次,此时如何消重呢?可点击高级(Advanced)-查询设置(查询设置)-选中Distinct项,但这样的查询因其性能消耗较大应尽量避免。
多属性字段:
多属性字段用作过滤较简单,因为系统已经把各属性拆分列在了过滤条件列表中,选择对应的属性即可
配置版块:Sort criteria(排序标准):
该配置版块用于设置数据单元如何进行排序,可指定多个排序字段并设置她们的优先级,不同类型的字段有不同的排序方法,各种排序方法对应一个排序器,排序器以插件方式提供,由以下插件管理器管理:
plugin.manager.views.sort
在该配置块右上方有一个下拉按钮,有如下选项:
(新增)Add:
点击后弹出添加排序对话框,这里通常是在添加排序器作用的对象,通常是字段,不同类型的对象会运用不同的排序器,添加时可以指定是为本视图所有显示实例添加还是仅本实例,可快捷搜索,也可按组类别过滤,一次可添加多个排序,点击应用后会依次弹出各排序的配置对话框
(调整)Rearrange:
点击该按钮后,可以配置各排序的优先级(拖动十字箭头图标或直接输入排序权重),即在前一个优先级高的排序中值相同的情况下,进一步采用优先级低的排序,也可直接快速删除排序,关闭对话框后点击单个条目可进行该排序的具体配置。
不同类型的字段对应不同的排序器(字段所用排序器在“视图数据”中指定,详见开发篇),配置表单由排序器提供,不同排序器的设置不同,(排序器基类提供的)以下配置是通用的:
(把这个排序显示给用户,让它们自己选择)Expose this sort to visitors, to allow them to change it
用于配置是否提供一个有排序设置选项的表单给用户,让用户可自行选择排序方式,表单采用GET方法提交,所有过滤参数均以查询参数在URL中进行传递。当选中该项后,将可进一步设置排序字段在排序表单中的label
常用排序器:
插件id:random
随机排序视图,每次显示顺序都不一样,但如果视图渲染结果有缓存,那么在缓存有效时会按缓存中的顺序显示
多值及多属性字段用作排序
多属性字段:
多属性字段用作排序较简单,因为系统已经把各属性拆分列在了排序条件列表中,选择对应的属性即可
多值字段:
从应用层面讲,多值字段不应当用作排序字段,如果出现了这种需求应当首先考虑是数据结构不合理。但视图模块依然允许以多值字段进行排序,此时,字段如果有N个值,那么系统会将原数据单元拆分成N个数据单元后再排序,这样将可能导致显示重复,此时即使选中“高级(Advanced)-查询设置(查询设置)- Distinct项”也不能消除重复,此时可在过滤设置中配合该字段的下标进行过滤以减轻重复,仅加载出用来排序的下标值,换言之这样就指定了具体以哪一个值进行排序,但这不是彻底的解决方案,因为在多值个数没有受限制时可能会遗漏数据,依然应该首先考虑数据结构问题。
配置版块: settings(显示类型设置):
该版块在不同显示类型下名称不同,设置项也不同,如页面显示类型叫页面设置(Page settings),块显示类型叫块设置(Block settings),以下依次讲解:
页面设置(Page settings):
(路径)Path:
仅供有url访问的显示类型才有该选项,配置访问该视图的URL,在URL中可以使用“%”放置一个占位变量,这会在上下文过滤器中用到(见后),系统会为配置的URL建立路由(真实的存在于路由系统中),如果该处配置的URL和系统已定义的路由相同,那么会优先使用视图路由,相当于原路由被覆写,但原路由依然存在于路由系统中,撤销视图后将可再次使用。
(菜单)Menu:
用于为本页面创建一个菜单,可选以下这些设置
(没有菜单条目)No menu entry:
表示不创建菜单,在已经创建了菜单时,选择此项将取消创建的菜单
(普通菜单条目)Normal menu entry:
将本页添加到系统中的某个菜单里
(菜单选项卡)Menu tab:
用于将本视图中具备相同URL段前缀的page类型的显示实例,用选项卡的方式组织到一起
(默认菜单选项卡)Default menu tab:
设定本显示实例做选项卡中的默认选项卡,选择该项后,在“Parent menu item”配置表单中,有如下三项:
Already exists、Normal menu item、Menu tab
在生成本页路由时,后两项将会去掉路径的最后一段
选项卡组合示例:
假设在同一个视图下有A、B两个page类型的显示实例,A的路径设置为“yunke”,菜单项设置为“Default menu tab”,输入标题链接等,点击应用,然后选择“Already exists”继续点击应用,然后设置B的路径为“yunke/2”,菜单项选择“Menu tab”,然后输入菜单链接文本(Menu link title),其他采用默认值,点击应用并保存,此时访问“yunke”和“yunke/2”就能看到选项卡了,注意他们有相同的URL段前缀:“yunke”,如果不相同那么不会被组织成选项卡
(注:在该示例中,如果A的路径为“yunke/1”,那么在A的设置中,“Parent menu item”配置表单须选择Normal menu item或Menu tab)
目前视图系统还不能创建次选项卡,可手动创建,请参考本系列:菜单本地任务MenuLocalTasks
(访问)Access:
用于进行访问控制,默认提供了以下三种类型的访问控制:
(权限)Permission:
用于指定用户需要具备某种权限才能访问,配置对话框会将系统中所有的权限列出
(角色)Role:
用于指定用户需要具备某种角色才能访问,相当于是要有某种权限组合才可访问
(无限制的)Unrestricted:
访问无任何限制
在底层,每一种访问控制类型均由一个插件提供,由以下插件管理器管理:
plugin.manager.views.access
块设置(Block settings)
(区块名)Block name:
在区块管理页(/admin/structure/block)中,点击放置区块时显示的块名,在没有设置时,默认为“视图名:显示实例名”
(块分类)Block category:
在区块管理页中,点击放置区块时显示的块分类名,无值时默认为“Lists (Views)”,该控件采用了自动完成功能,可以从已存分类中选择,也可以直接建立新分类
(允许的设置)Allow settings:
设置在放置区块时,能够进行的配置,默认有:
(每页条目数)Items per page
选中后,在放置块时可以配置每页显示的条数
(访问)Access:
同页面设置
附件设置(Attachment settings)
(附属于)Attach to:
用于设置将本附件显示实例附加到本视图中其他哪些显示实例中输出,可多选或不选,附件不可附属于另一个附件
(附件位置)Attachment position:
在附件输出时,放置在被附加显示实例的什么位置,可选的有前面、后面,或者两者均放置
(继承上下文过滤器)Inherit contextual filters
是否从被附属的显示实例上继承上下文过滤器
(继承暴露的过滤器)Inherit exposed filters
是否从被附属的显示实例上继承公开的过滤器
(访问)Access:
同页面设置
订阅源设置(Feed settings)
(路径)Path:
同页面设置
(附属于)Attach to:
用于设置将本订阅源显示实例附加到本视图中其他哪些显示实例中,可多选或不选,不可附属于附件、实体引用、feed类型的显示实例,被附属的显示实例在输出时,页面中将出现一个订阅源图标,点击可看到本订阅源的输出
(访问)Access:
同页面设置
实体引用和嵌入显示类型的设置
这两个显示类型实例的设置版块中仅有访问控制项,同页面设置
配置版块:Header(页眉):
在该配置版块中,可以在视图内容前面添加各种类型的内容,比如一个实体、一个块、一个链接、自定义内容,甚至是另外一个视图,各类型内容由区域插件提供,插件管理器如下:
plugin.manager.views.area
在下文的页脚、无结果时的行为配置中,可添加的内容同样由该区域插件提供
配置版块:Footer(页脚):
同页眉配置版块相同,但是在页脚插入,可插入内容由区域插件提供
配置版块:No results behavior(无结果时的行为)
指定在视图没有查询到数据时,该如何处理,常见的可显示某个实体、自定义文本、另一个视图,覆写标题等,可添加的处理由区域插件提供
配置版块:Pager(分页器设置):
该版块用于设置是否使用分页器或分页器类型:
Use pager(使用分页器)
可选择的类型及对应设置如下:
(显示指定条目数量)Display a specified number of items:
不使用分页器,显示固定数目的数据,设置项如下:
(显示条目数量)Items to display:
当输入0时,意为不限制
(偏移值)Offset (number of items to skip):
一个大于等于0的整数,该数之前的条目不会被显示,如设置为3,那么前三条数据不会被显示
(显示全部条目)Display all items:
不使用分页器,显示全部数据,仅有一个配置项:
(偏移值)Offset (number of items to skip)
同前,设定偏移,偏移之前的不显示
(使用完整分页器分页输出)Paged output, full pager:
采用完整类型的分页器,配置项如下:
(每页条目数)Items per page:
每页要显示的条目数量(数据单元数量),0为不限制
注意:在除页面显示类型外的显示实例下,该项被命名为:(显示条目数量)Items to display,容易被误导为是要显示条目的总数
(偏移值)Offset (number of items to skip)
同前,设定偏移,偏移之前的不显示
(分页器id)Pager ID
分页器id,该项设置指定分页参数值在“page”查询值中的位置,是一个大于等于0的整数,当页面中有多个分页器时才需使用,以区别不同的分页器,当仅有这一个分页器时,应该保持默认值0,关于分页器的详细实现请参考本系列分页器主题
bug:实测该项视图实现有问题,假设页面中有个块使用了分页器,id为0,主内容也使用了分页器id为1,此时块的分页器工作正常,但主内容的分页器会遗失块分页器参数,导致主内容翻页时,块分页器被指向第一页
(页面数量)Number of pages
允许显示的页数,假设按每页条数和偏移计算出一共有10页,该项如果设置为2,那么仅显示前两页,换句话说该项可用于控制要显示的总数据量,留空或0为显示全部页
(分页器链接label)Pager link labels
分别用于指定“第一页”、“前一页”、“下一页”、“尾页”这些链接用什么词表示
(公开选项)Exposed options
设置是否允许用户设定每页条数、是否可以查看全部、设置偏移
(可见分页链接数量)Number of pager links visible
分页器在显示时,中间数字链接的数量,如设置为3,将有3个数字链接,该项设置如果大于总链接数则是无效的,此时将显示全部分页链接
(使用迷你分页器分页输出)Paged output, mini pager:
采用迷你型分页器,各设置选项和完整型分页器一样,所不同的是该分页器很简洁,分页链接仅有“前一页”和“下一页”
More link(更多链接):
用于在视图输出的右下方显示一个链接,该链接通常是“更多”,因此也通称为更多链接,但须注意该链接可用于“更多”之外的用途,如“添加”、站外链接等,配置项如下:
(创建更多链接)Create more link:
该项如果被选中,那么会在视图右下方显示一个链接,链接文本可以进一步制定,链接URL在链接显示中设置,通常是该视图的页面显示类型的视图页,见下。
(总是显示更多链接)Always display the more link
即便没有更多数据单元了也总是显示“更多链接”
(更多链接文本)More link text
用于指定更多链接的文本,默认为“更more多”,可依据链接的实际用途而具体设置,比如“添加”
Link display(链接显示):
配置“更多链接”的URL,可以指向页面类型的视图显示,或自定义链接等等。注意:在页面类型显示实例的分页器配置版块默认不列出该项,此时可在默认显示实例(Master)中进行配置,如果Master没有被列出,可在视图设置(/admin/structure/views/settings)中勾选“总是显示主(默认)显示”(Always show the master (default) display)
配置版块:Language(语言)
用于配置本显示实例在显示时,采用什么语言,通常采用“Content language of view row”,即站点语言协商机制协商出的内容语言
中集完,请继续阅读下集
反馈互动