查看视图中的自定义查询? -- views 领域 和 database 领域 drupal 相关 的问题

Custom query in Views?


23
vote

问题

中文

在某些时候,我发现需要修改按视图生成的SQL查询,最后我overrode views_pre_execute 并更改了该特定视图的查询。

这感觉就像一个丑陋的黑客,我想知道是否有更优雅和可维护的方法来做到这一点。理想是一种方法,允许我直接从ui视图修改查询。

英文原文

At some point I found the need to modify an SQL query generated by Views, in the end I overrode views_pre_execute and changed the query for that specific view.

This feels like an ugly hack to me and I wonder if there is a more elegant and maintainable way to do that. Ideal would be a way that would allow me to directly modify the query from the Views UI.

     
         
         

回答列表

25
 
vote

您也可以使用 hook_views_query_alter() 在运行之前更改查询。我认为这类似于 hook_views_pre_execute ,但可以更轻松地修改查询。您基本上通过键控阵列访问查询的每个部分。我没有找到太多官方文档,但它在 https://www.appnovation.com/blog/using-hook-views-query-alter 。这也是我必须用来修复日历模块中的日期错误的方法。

 

You can also use hook_views_query_alter() to alter the query before it's run. I think this is similar to hook_views_pre_execute, but makes it easier to modify the query. You basically get access to each part of the query through a keyed array. I haven't found much official documentation, but there's a pretty good example of it at https://www.appnovation.com/blog/using-hook-views-query-alter. This is also the approach I had to use to fix a date bug in the Calendar module.

 
 
         
         
4
 
vote

一般而言,这取决于您的用例。

如果要有一个字段/过滤器/参数,它应该以某种方式行事,建议为它写一个处理程序。 有关更多信息,请参阅视图的高级帮助。

如果要更改查询的某些部分,则可以使用 hook_views_query_alter()。 关于 hook_views_query_alter() 的坏事是你不能真正重复使用那里的代码。

这是文档中显示的示例代码。它给出了钩子可以做的例子。

  function mymodule_views_query_alter(&$view, &$query) {   // (Example assuming a view with an exposed filter on node title.)   // If the input for the title filter is a positive integer, filter against   // node ID instead of node title.   if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {     // Traverse through the 'where' part of the query.     foreach ($query->where as &$condition_group) {       foreach ($condition_group['conditions'] as &$condition) {         // If this is the part of the query filtering on title, chang the         // condition to filter on node ID.         if ($condition['field'] == 'node.title') {           $condition = array(             'field' => 'node.nid',              'value' => $view->exposed_raw_input['title'],              'operator' => '=',           );         }       }     }   } }   
 

In general this depends on your use case.

If you want to have a field/filter/argument which should behave in a certain way, it is recommended to write a handler for it. See advanced help of views for more information.

If you want to change some parts of the query you can also use hook_views_query_alter(). The bad thing about hook_views_query_alter() is that you can't really reuse the code there.

This is the example code shown from the documentation. It gives an example of what the hook can do.

function mymodule_views_query_alter(&$view, &$query) {   // (Example assuming a view with an exposed filter on node title.)   // If the input for the title filter is a positive integer, filter against   // node ID instead of node title.   if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {     // Traverse through the 'where' part of the query.     foreach ($query->where as &$condition_group) {       foreach ($condition_group['conditions'] as &$condition) {         // If this is the part of the query filtering on title, chang the         // condition to filter on node ID.         if ($condition['field'] == 'node.title') {           $condition = array(             'field' => 'node.nid',              'value' => $view->exposed_raw_input['title'],              'operator' => '=',           );         }       }     }   } } 
 
 
3
 
vote

我使用了 hook_views_query_alter() 来改变视图mysql查询。下面的示例在Drupal 7下测试,使用 7.x-3.0 ,它为查询添加了自定义 998887666 子句:

   function MYTHEME_views_query_alter(&$view, &$query) {    // check so it's the correct view    if($view->name == 'product_view') {      // set a custom 'ORDER BY' clause in the query      $query->orderby[0] = array(        'field' => 'SUBSTR(taxonomy_term_data_name,3,4)',        'direction' => 'ASC'      );      $query->orderby[1] = array(        'field' => 'SUBSTR(taxonomy_term_data_name,1,2)',        'direction' => 'ASC'      );    }  }   
 

I have used the hook_views_query_alter() to alter a views mysql query. The following example is tested under Drupal 7 with 7.x-3.0, it adds a custom ORDER BY clause to the query:

 function MYTHEME_views_query_alter(&$view, &$query) {    // check so it's the correct view    if($view->name == 'product_view') {      // set a custom 'ORDER BY' clause in the query      $query->orderby[0] = array(        'field' => 'SUBSTR(taxonomy_term_data_name,3,4)',        'direction' => 'ASC'      );      $query->orderby[1] = array(        'field' => 'SUBSTR(taxonomy_term_data_name,1,2)',        'direction' => 'ASC'      );    }  } 
 
 
1
 
vote

我不知道是否可以直接更改SQL,但您可以编写自己的现场处理程序并制作自己的查询。

 

I don't know if you can directly change the sql, but you could write your own field handler and craft your own query.

 
 

相关问题

5  如何在分类词汇之间创造关系?  ( How to create relationships between taxonomy vocabularies ) 
我正在尝试构建一个与craigslist类似的内容约定的网站。问题是,我并不真正知道在Drupal中创造多个词汇关系的好方法。这是我需要的最终结果: 词汇: 位置 类别(包含"商品" 和"服务" ) 状态 内容类型: 项目 关系: 用户有许多项目 用户有一个位置 位置有许多用户 位置具有所有类别 项...

6  从视图中重复分类分类术语  ( Duplicate taxonomy terms from view ) 
所以我尚未能够找到解决方案,而无需使用预处理函数来检查重复或仅使用"标签" 模块。很好,可以封闭。 如何配置(块)视图以显示词汇表的术语列表,每个术语显示一次(也许是指示它使用的次数的数字) - 即使术语可以由多个节点? "截然不同" 没有工作..字段'分类:所有术语'和'分类:术语'都会产生类似的重复项目,当该术...

5  是否有可能使用鼠标视图拥有和或或或在过滤器集中?  ( Is it possible with drupal views to have and and or in a filter set ) 
我试图用四个过滤器(a,b,c,d)构建一个视图。有了视图3,可以选择是否希望将这些过滤器与语句或语句进行陈述。有没有办法配置视图,以便将其中的一些链接以及与其他人一起链接或? 例如,以类似于:的查询结束 SELECT * FROM {table} WHERE A = 0 AND B = 0 AND ...

2  对Creator和发起人仅可查看公共节点的回应  ( Making responses to public nodes only viewable by the creator and the originator ) 
我有一个在D6中建立的原型网站,相关模块: cck 评论块 节点评论 视图 视图或 该站点围绕打开请求列表;征求私人反应。这些节点属于内容类型请求。 所有打开的请求都公开,因为所有用户(登录或未登录)可以查看这些节点。 当收到响应(注释)到打开的请求时,它只应该由原始请求的作者或响应作者查看。 这些响应应...

0  如何生成一个列表,其中包含哪些空格?  ( How to generate a list of which features are enabled in which spaces ) 
我正在使用有机组,特征和空格运行一个Drupal 6.x站点,我对生成一个空格启用的空格的列表有兴趣。优选地,具有沿Y轴的空间的表,以及沿X轴的特征。 关于如何生成此的任何想法?我可以使用视图生成组空间列表,但无法找到已启用功能的字段。 ...

11  hook_preprocess_page():如何讲述视图页面?  ( Hook preprocess page how to tell a views page ) 
im写一个需要在视图页面中插入一些javascript和css文件的自定义模块。 im使用hook_preprocess_page,但我无法判断当前页面是否来自视图: function mymodule_preprocess_page(&vars) { var_dump($vars); //outpu...

3  在排除当前显示的节点的视图中使用哪些参数?  ( What argument to use in views that excludes the node currently being displayed ) 
例如:如果您的视图生成了内容类型X的节点列表,您如何使该列表排除当前显示的节点? ...

5  视图幻灯片VS列表视图+ jQuery Cycle Lite?  ( Views slideshow vs list viewjquery cycle lite ) 
在我的工作站主页上的旋转图像是以列表格式的视图创建。我正在使用 jquery循环Lite 插件,用于旋转效果。 CycliT.Lite.js文件在我的主题的.info文件中的脚本数组中设置,页面中有一点代码.TPL.php检查这是否是主页,如果是,则设置旋转器。< / p> 现在我正在第二个旋转器用于另一个部分,我一...

2  gmap视图模块 - 弹出窗口太大了  ( Gmap views module popups are too big ) 
我正在使用gmap模块及其视图对应。我拥有的问题是,我正在使用自定义文本字段来显示以我从查询中删除的HTML包裹的字段。但是,弹出窗口不会正确尺寸;它最终太大了。这是我的自定义文本字段的代码: <div id="col1"> [field_thtr_img_fid] </div> <div id="col2"...

1  自定义SQL:NodeReference Joins和最新视频  ( Custom sql nodereference joins and latest vid ) 
我有一个构成自定义SQL查询的时间。 查询有多个Nodereference,需要返回最新的节点修订版。 我理解得很好,但由于某种原因,返回最新版本的额外复杂性正在绊倒我。 我宁愿通过创建视图并以编程方式执行它们,仅仅因为 WHERE 条款的复杂性,就会以编程方式执行它们。 我已经尝试翻译等同的视图的输出,但是对视图粘...

13  构建视图过滤器  ( Building a views filter ) 
我想为我构建的自定义模块构建过滤器,并与视图集成。实质上,该模块允许您定义不同节点之间的关系类型。我想为此创建一个过滤器,以便我可以显示某种关系的节点。 我找不到任何描述过滤器更详细地描述过滤器的文档,并向它们解释各个部分。在这方面,API文档是可怕的。 任何人都可以在详细建筑视图过滤器上建立一个很好的资源/文章? ...

1  如何在网站的每页上使用视图筛选表单创建块?  ( How to create a block with views filter form available on each page of the site ) 
这适用于一个小房地产局的网站。 我有一个 property_offer 内容类型设置和优惠类型词汇,有4个术语(购买,销售,卖出租赁和承担租约)。然后我已经创建了一个与页面显示的视图,对于网站的首页,它列出了所有优惠,还有4个术语中的每一个页面。 如何为此视图创建公开的过滤器,这必须作为块可用,以便我可以将其放在站点...

4  如何控制来自视图内容窗格的“更多”链接,以指向Biblio过滤页面  ( How do i control the more link from a views content pane to point to a biblio ) 
我正在使用drupal 6.我正在尝试创建一个查看窗格,列出匹配特定术语的三个Biblio项,然后提供与使用相同术语过滤的更多项目的链接。 Biblio允许我使用 biblio/term/term_name 很好地访问这些项目。有没有办法控制视图提供的 more 链接,以便它指向这个位置? ...

3  使用有机组时是否可以创建“元论坛”视图?  ( Is it possible to create a meta forum view when using organic groups ) 
我们正在使用有机组的Drupal 6.x。这些组具有非常不同的用户和权限集,每个组都有一个论坛。 我想知道是否有一种"meta-forum" 视图,即用户拥有访问权限的所有不同论坛的一个视图,由组组织。 我看了一下为此配置一个视图,而我能够在所有订阅组中的最新论坛条目的列表中获取内容,我无法获得"论坛类型" 视图我在...

3  列出与节点参考字段有关的书籍概要  ( List outline of books related to another book by a node reference field ) 
我正在使用具有四种内容类型的书模块:a,b,c和d。 a是子页面的内容类型,其余的是在书概述中允许。 我还有一个节点参考字段,允许用户选择与他们正在创建的类型的类型的节点。 我正在尝试使用视图来显示与某个类型的节点相关的所有节点,并显示这些相关节点的轮廓。 e.g。查看书A.1相关主题及其轮廓: 书a.1 书...

6  什么是视图3的有效优化技术?  ( What are effective optimization techniques for views 3 ) 
我一直在进行一点我正在处理的网站上,这是广泛使用视图的。 即使使用视图缓存,仍然占用处理时间的2/3。是否有最佳的练习方法来加快视图,或者已知导致性能点击的事物。 我应该添加视图是solr视图,因此这是一个大多数关于视图架构的问题,而不是优化查询。 已尝试使用APC,但它没有更改执行时间。 ...

6  我可以使用简单的XML来馈送视图吗?  ( Can i use simple xml to feed views ) 
我想使用视图的力量来处理我的数据,这是一个只有网格resp table 的简单XML。 <list> <listpos id="12312"> <foo>attr1</foo> <bar>attr bar</bar> ... </listpos> <listpos id="12...

1  “节点:创建的一天”不匹配,不反映实际创造的一天  ( Node created day mismatched not reflecting the actual created day ) 
视图版本:7.x-3.0-alpha1 我正在尝试创建一个博客存档视图,如博客/ yyyy / mm / dd,其中博客/ 2011/03/10应该显示2011年3月10日在2011年创建的所有帖子。但是,页面博客/ 2011/03 / 03/10 实际上显示了在 2011上创建的所有帖子,3月11日,11th ,...

4  在模块中覆盖视图表布局  ( Overriding a view table layout in module ) 
我正在尝试从我的模块中覆盖视图表。我无法找到参数的假设是什么,并以什么顺序(对于我的hook_theme func)。我从视图/主题复制了主题文件,没有修改。有谁知道出现了什么问题,以及争论值应该是什么? 我的主题配置目前: 'views_view_table__opportunities_mentions' =...

4  如何在搜索结果中返回视图的内容?  ( How to return a views content in search results ) 
我们有一个页面显示包含两个或多个节点的视图,但是在搜索将与这些节点有关的关键字时,返回仅与各个节点的链接。我们真正想要的只是链接到要返回的视图的页面显示,但它没有显示在结果列表中。 我正在寻找通过自定义模块缓存的视图并索引缓存的内容,但我想知道是否有人遇到这种情况并可以分享他们的解决方案? 编辑:澄清了。 ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.