Views使用总结

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
fishfree's picture
Start: 
2014-05-09 12:30 - 13:30 Asia/Shanghai
Organizers: 
Event type: 
Training (free or commercial)

打算讲以下内容:
* Views format
* Views filter
* Views contextual filter(重点)
* Views relationship

大家有需要我解答的,请在下面跟帖。

参考文档

Working with Views
How to create a monthly archive block for a Drupal blog with Views

我自己平时总结的一些ctools+views配合的笔记,有点零散,有的是我个人的理解,不一定正确,仅供大家参考。

ctools 还能调用search form和search results。自带的一个子模块Term Depth access可控制term在context中的访问深度
Page manager search 让Page Manager生成的page可以被搜索
page manager里多个variant,若多个variant都是valid,则第一个被验证的variant被选用。应提供一个默认的variant,防止所有variant验证失败。目前我知道的支持page manager的Variant可以是:Panel、Panelizer、HTTP response code、Contextual Admin。
page manager的arguments 若path中有wildcard,才会出现argument的配置
Pagemanager path aliases page manager生成的友好路径在breadcrumb中呈现不合理,则需要这个模块
views content 在views中添加了一种“content pane”的view,可以让view content pane生成的内容通过ctools提供给Panels、Dashboard等使用了ctools接口的模块使用。其中argument input 的作用是用来给contextual filters指定参数来源的,因为前者的数据可以从ctools page context 和panels的argument等渠道获取,要比后者的数据来源更多更广。有时,contextual filter也可以直接获取default value值(如:from url),但如果此时不想依赖于path,而是想依赖于ctools和panels提供的参数,则更好的解决方法应该是使用content pane及其argument input功能,否则就直接使用views的page或者block等display了(当然设置过多的block而不真正显示出来,也是有违block的主要使用用途的)。可在其中设置多个可被嵌入对象覆盖的参数。argument input若是from context,最好勾选“Context is optional”,否则在panels里添加时看不到views content pane. views content pane里的use panel path设置为是的话,就会继承Panels路径,在暴露表单、VBO、分页链接上都用得到。
views的一些样式插件,如timeline要求一个date字段作为生成依据,但又想充分利用display suite来呈现entity,则可以将show设成rendered entity,然后仍然可以加入fields,且加入rendered node/rendered user就可以显示内容
Views聚合:右侧use aggregation,on后每个字段、filter、sort、relationship都可以设置aggregation settings,relationship创建时设置好aggregation后就不可以修改了,这从数据库角度考虑是合理的。启用了aggregation后需要删除默认的sort。可以和group by结合起来,教程参见http://www.drupalholics.com/drupal-views-3-aggregate-settings-for-group-by/ nodeone有教程http://nodeone.se/en/aggregation-and-relationships将aggregation和relationship的关系
contextual filters主要通过url参数得到(这个插件有补充作用Views Contextual filter query),还可以通过ctools的context、context模块(views_arg_context)、session和cookie(通过views argument session和views argument cookie两个扩展模块)、以及其他一些模块(如views reference等),还可以通过编程传递。另外,views field view模块可以从父view中的字段得到contextual filter。创建views的第一步最好选择可以直接提供contextual filters字段的entity(views创建好后无法更改machine name(可通过导出改名删掉旧的再导入的方法,但前提是该view未被使用)和要show的entity的),否则通过relationship得到的contextual filters可能难以管用;而view要显示的fields可以通过relationships得到,且contextual filters一般都是只有一个值,所以通过这一个值和relationships仍然可以得到一个list。依赖于relationship的contextual filters的例子可见user relationships模块自带的user_relationships_content view。
When the filter value is not in the URL:这项设置对于block display的views是必需的。其子设置项Display a summary: 是将所有contextual filters全部列出来
Specify validation criteria: 路径中可能有用户胡乱输入或恶意攻击的参数,所以需要验证
allow multiple values:参数之间用+连接表示or,用逗号连接表示and
Reduce duplicates:若有多个contextual filters,会根据每个filter过滤,结果可能会有重叠,则可以使用该选项去重
expose filter in blocks:可以把views的filters放在block里,而非放在views上方,但只有page display的views才能接收这些filters
grouping in the advanced section. Once enabled, a number of data fields may be used for grouping operations. The functionality is not fully developed, and it is not clear how it will work. But it will make it possible to sort nodes by the number of comments, or taxonomy terms by how many nodes are marked with each term.
Fieldable panels panes、 views content pane都可以接受ctools传过来的context作为参数
Fieldable panels panes有点像BEAN,把不是entity的对象变成了fieldable的entity
date browser的display是由date模块提供的,用于按照日期来浏览内容的,但这一功能现在已取消了,由date pager新功能代替 http://www.drupalgardens.com/content/date-browser-format-views
views context context类型的view可以给page manager作为context来使用,同时会在page manager中呈现一种views context类型的元素,可以在其中选择那个context类型的view的各项分解内容,如:第几条数据项、头、尾、分页器等等。
page manager和views的relationship都是Drupal数据库抽象层schema的的主键外键关系(这是由数据库适配器定义的,实际的数据表如mysql中只定义了primary key而未定义foreign key),page manager的context也是基于此关系join到别的表中获得的。
views中的contextual filter的参数一般是来自于views page的url。可以在url中设置一个占位符,别的页面可以将此参数传进来(如:别的view的某个field的rewrite output可以使用replacement pattern(先加几个字段设为从界面中不显示)设置一个新的url),然后该page再将其传给contextual filter。
CTools Advanced Entity Plugins 内容重排功能,如:限定只能搜索某些nodes,过滤应用了某种属性的entity,没试过,不是很明白这个模块的作用
page manager existing page 覆写已有的页面,该模块提供自动完成搜索已有页面和回调函数功能
Fieldable panels panes 创建一个entity,可以在panels的添加内容中直接加入,非常好用!!但似乎只能通过编程添加这种pane content type。类似的模块还有Dynamic Fieldable Content,且支持ctools的导出

views 中的relationship views中添加了relationship后,就可以添加其他表中的更多字段。且在添加字段时会出现选用relationship的界面。原因是:如:一个comment可以和node和user关联,若这两种关联都添加之后,当要选择User:name字段时,就需要选择哪种relationship了,不然无法确定是node的作者还是comment的作者。

Comments

haisu's picture

VIEWS,看来重磅内容来了。这4条就能讲一堂课,期待。哈哈。

firehare's picture

期待呀!
可惜本周五我出差还没回!
只能看视频了,遗憾!!!