Как сделать сортируемую колонку сортируемой в представлении drupal 7 - PullRequest
0 голосов
/ 21 января 2019

У меня есть одно представление в Drupal 7, которое отображает информацию о пользователе, такую ​​как (имя, адрес, статус и т. Д.).У меня есть один столбец в этом представлении (таблица) как «Опубликованное событие».В основном события создаются пользователями, я хочу сделать этот столбец сортируемым.Я приложил изображение для дополнительной справки.

Screenshot

Я пытался с применением отношений, но безуспешно.

настройки таблицы

мой код обработчика подобен приведенному ниже:

 $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,

);

1 Ответ

0 голосов
/ 21 января 2019

[Введение] Какая функция отвечает за «сортировку по кликам» в представлениях?

Нажмите «Сортировать» - этот флажок на втором экране - в настройках таблицы представлений есть функция, которая включена толькодля полей, которые имеют правильно определенные обработчики.Как вы, наверное, знаете, каждое поле в представлениях имеет несколько обработчиков (для отображения, фильтрации, сортировки).А чтобы сортировка по клику была возможна в указанном столбце, его обработчик поля должен иметь две определенные функции: click_sortable и click_sort.Первому нужно просто вернуть true, а второму нужно правильно реализовать сортировку по представлению.Например, см. Обработчик: [views_module_path]/handlers/views_handler_field.inc.

Ваш случай:

Кажется, что в вашем столбце "Опубликованное событие" определен обработчик, который не имеет click_sortable иclick_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';
}

Edit 1

Сначала вы могли бы сказать, где этот код?Это внутри класса обработчика, или, может быть, какой-то хук представлений?Представления дают вам большую гибкость, но это затрудняет их понимание, и я не уверен, чего именно вы достигнете и как.

Если ваше поле работает правильно, вы можете попробовать просто включить сортировку по кликам.

Пример: я создал функцию hook_views_data_alter для просмотра содержимого данных представлений

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

Вам может потребоваться очистить кеш, чтобы увидеть dpm хаков * _alter.Внутри массива dpm я нашел «users» для общего примера, и его имя поля выглядит так:

dpm

Я предлагаю вам попробовать изменить вашполе с click_sortable = TRUE и посмотреть, что произойдет.Если это не поможет, пожалуйста, предоставьте больше информации о вашем поле, как вы его создали, как оно выглядит в hook_views_data_alter и какие обработчики оно определило.

Edit 2

Хорошо, так что у вас естьВаши просмотры экспортированы в код в файл views_default.Но это только позволяет вам экспортировать просматривать вас создал из базы данных в код, так что это в основном отражение того, что вы сделали в веб-редакторе представлений (например, page yourwebsite.com/admin/structure/views/view/your_view_name/edit).Вам нужно изменить поведение одного из ваших полей , чтобы оно стало сортируемым (добавить функции click_sortable и click_sort в класс обработчика) или изменить обработчик этого поля к одному с возможностью сортировки (измените обработчик field на другой, например views_handler_field_numeric).Если у вас нет опыта в создании обработчиков, и это один из универсальных обработчиков, я предлагаю вам вернуться к моему Edit 1 , проверить ваш dpm и попытаться изменить массив $ data, чтобы найти решение.

Редактировать 3

Небольшое объяснение, чтобы избежать путаницы.При создании нового представления вы выбираете коллекцию, на которой основано это конкретное представление (самый простой пример - это может быть таблица MySQL, и представление будет использовать запросы SQL для извлечения данных из нее).Копая вниз, мы имеем:

  1. Коллекция - например.User, которая является таблицей базы данных user, это то, что вы выбираете в качестве источника при создании нового представления.create view

  2. Поле - напр.mail, который является столбцом базы данных mail, это поля, которые вы добавляете в свое представление.

  3. Обработчик поля - например.views_handler_field_numeric, это имя класса обработчика для использования по указанному полю

Теперь, если вы не создали свой собственный обработчик, то в вашем поле «Опубликованное событие» есть один из обработчиков общих представлений. Вы никогда не должны изменять код добавляемых модулей - особенно широко используемый в качестве обработчиков представлений.Вот почему мое предложение добавить функции click_sortable и click_sort неверно.Вместо этого вам следует сменить обработчик, отвечающий за поле «Опубликованное событие».

Лучший способ - определить правильный обработчик в месте, где вы определяете свое поле «Опубликованное событие».Если это как-то невозможно, единственный способ, о котором я могу думать, это hook_views_data_alter , см. Документацию для получения дополнительной информации и примеров.Я полагаю, вы должны попытаться переопределить обработчик вашего поля в универсальный числовой обработчик views_handler_field_numeric, поскольку он должен иметь полную функцию сортировки, или попытаться добавить свойство click_sortable в массив полей, как вы можете видеть на первом изображении моего поста, но яне могу предоставить вам полностью протестированный пример.

...