【问题标题】:How to make referenced column sortable in drupal 7 view如何在drupal 7视图中使引用的列可排序
【发布时间】:2019-01-21 12:08:17
【问题描述】:

我在 Drupal 7 中有一个视图,它显示用户信息,例如(姓名、地址、状态等)。我在此(表)视图中有一列作为“已发布事件”。基本上事件是由用户创建的,我想让这个列可排序吗?我附上了图片以供更多参考。

我尝试过申请关系但没有成功。

table settings

我的处理程序代码如下:

 $handler->display->display_options['sorts']['event_count_published']   ['id'] = 'event_count_published';

$handler->display->display_options['sorts']['event_count_published']   ['table'] = 'search_api_index_user_search_index';
 $handler->display->display_options['sorts']['event_count_published']   ['field'] = 'event_count_published';
$handler->display->display_options['sorts']['event_count_published']   ['order'] = 'DESC';

 'mail' => array(
  'sortable' => 1,
  'default_sort_order' => 'asc',
  'align' => '',
  'separator' => '',
  'empty_column' => 0,
),
'event_count_published' => array(
  'align' => '',
  'separator' => '',
  'empty_column' => 0,
  'sortable' => 1,
),

上面的代码在“tcd_reporting.views_default.inc”文件中,如果我输入'sortable => 1',它仍然不提供排序

字段由以下代码创建:

 $properties['event_count_published'] = array(
'label' => t('Published Events'),
'description' => t('Number of published events authored by user.'),
'type' => 'integer',
'getter callback' => 'tcd_event_content_type_count_published_get',
'computed' => TRUE,
'entity views field' => TRUE,

);

【问题讨论】:

  • 所以“已发布事件”是事件数量的正常工作列,只是缺少排序功能?
  • 是的,它是一个字段,是计算用户创建的事件的数量。 @JacekRosłan
  • 我添加了另一张图片以供参考。 drupal 没有在设置中提供排序选项@JacekRosłan

标签: php sorting drupal-7 drupal-views


【解决方案1】:

【简介】哪个函数负责视图中的“点击排序”?

单击排序 - 第二个屏幕中的此复选框 - 视图表设置中的功能仅对具有正确定义的处理程序的字段启用。您可能知道视图中的每个字段都有很少的处理程序(用于显示、过滤、排序)。并且要在指定列上进行单击排序,其字段处理程序必须定义两个函数:click_sortableclick_sort。第一个只需要返回true,而第二个需要正确实现视图排序。例如查看处理程序:[views_module_path]/handlers/views_handler_field.inc

您的情况:

您的“已发布事件”列似乎定义了没有click_sortableclick_sort 函数的处理程序(或click_sortable 仅返回false)。

可能的修复:

找到您定义视图源的位置(这取决于您如何告知视图,如果我理解它类似于“用户信息” - 可能在 hook_entity_info 函数或 hook_views_data 函数中),检查什么是处理程序分配给您的“已发布事件”字段并进行更改。

很难说出需要查看的位置,因为这取决于您的实现。

我建议您尝试创建 hook_views_data_alter 函数并 dpm() 开始。稍后您可以像这样更改它:

mymodule_views_data_alter(&$data) {
  $data['some_view_info']['published_event']['field']['handler'] = 'views_handler_field_numeric';
}

编辑 1

首先你能说出这段代码在哪里吗?它是在处理程序类中,还是某些视图挂钩? Views 为您提供了很大的灵活性,但这使它们难以理解,而且我不确定您究竟实现了什么以及如何实现。

假设您的字段正常工作,您可以尝试简单地启用点击排序。

示例:我创建了 hook_views_data_alter 函数来查看视图数据的内容

function mymodule_views_data_alter(&$data) {
  dpm($data,'d');
}

您可能需要清除缓存才能查看 *_alter 挂钩的 dpm。 在 dpm'ed 数组中,我找到了通用示例的“用户”,其字段名称如下所示:

我建议您尝试使用click_sortable = TRUE 更改您的字段,看看会发生什么。如果这没有帮助,请提供有关您的字段、如何创建它、它在hook_views_data_alter 中的外观以及它定义了哪些处理程序的更多信息。

编辑 2

好的,因此您将视图导出为代码到views_default 文件中。但是这只允许你导出视图你创建从数据库到代码,所以它基本上反映了你在视图网络编辑器中所做的事情(例如页面yourwebsite.com/admin/structure/views/view/your_view_name/edit )。您需要做的是更改其中一个字段的行为,使其可排序(在处理程序类中添加 click_sortableclick_sort 函数)或更改此字段的处理程序 strong> 为带排序选项的一个(将field 处理程序更改为另一个,如views_handler_field_numeric)。如果您没有创建处理程序的经验并且这是通用处理程序之一,我建议您返回我的 Edit 1,检查您的 dpm,并尝试更改 $data 数组以找到解决方案。

编辑 3

小解释,以防止混淆。创建新视图时,您选择此特定视图所基于的集合(最简单的示例 - 它可能是 MySQL 表,视图将使用 SQL 查询从中检索数据)。通过挖掘,我们有:

  1. 集合 - 例如。 User 是数据库表user,它是您在创建新视图时选择的源。

  2. 字段 - 例如。 mail 是数据库列 mail,您可以将此字段添加到您的视图中。

  3. 字段处理程序 - 例如。 views_handler_field_numeric,这是指定字段使用的处理程序的类名

现在,如果您没有创建自己的处理程序,那么您的“已发布事件”字段具有通用视图处理程序之一。 您永远不应该更改贡献模块的代码 - 特别是广泛用作视图处理程序。这就是为什么我建议添加函数click_sortableclick_sort 是不正确的。相反,您应该更改负责“已发布事件”字段的处理程序。

最好的方法是在定义字段“已发布事件”的地方定义适当的处理程序。如果在某种程度上不可能,我能想到的唯一方法是hook_views_data_altersee docs 以获取更多信息和示例。我想您应该尝试将您的字段处理程序重新定义为通用数字处理程序views_handler_field_numeric,因为它应该具有完整的排序功能,或者尝试将click_sortable 属性添加到字段数组,如您在我的帖子的第一张图片中所见,但我无法为您提供经过全面测试的示例。

【讨论】:

  • 我已经更新了我的问题,请您指导我@jacekroslan
  • 在已发布的事件中没有分配处理程序@jacekroslan
  • 感谢您的宝贵时间和帮助@jacekroslan
  • 没问题,如果您在途中遇到更多问题,请随时询问,只需尝试提供good example。在 D7 视图中,这非常重要,因为您可以通过多种方式实现一件事,并且它们的问题大相径庭 - 很难判断它是错误还是功能;)
  • 你能告诉我应该在哪里写“click_sortable”和“click_sort”,因为我不知道处理程序在哪里定义。 @jacekroslan
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多