Вы здесь

Как реализовать сортировку для кастомного псевдополя views?

0

Уважаемое сообщество, подскажите, пожалуйста, как можно реализовать сортировку для кастомного псевдополя views?
Само поле в mymodule.views.onc


function mymodule_views_data_alter(array &$data) { $data['node']['node_rating'] = array( 'title' => t('Node Rating'), 'field' => array( 'title' => t('Node Rating'), 'help' => t('Node rating by comment votes'), 'id' => 'node_rating', ), 'sort' => array( // ID of sort handler plugin to use. 'id' => 'node_rating', ), );

'id' => 'node_rating' - Здесь, скорее всего нужен свой плагин. Кто-нибудь может подкинуть идею по написанию этого плагина?

Версия Drupal: 
8.x
Категория: 
Plugin API
Вопрос задан 26.07.2017 - 12:56
Аватар пользователя 96med
96med
14

Ответы

1

http://xandeadx.ru/blog/drupal/611 — Views 3. Только в query() будет не формула, а нужный запрос. И там Drupal 7.

Если значение можно вытащить из базы, берите напрямую, если оно как-то считается программно, надо делать таблицу и хранить его там.

$this->query->addOrderBy('table', 'field', $this->options['order'] 'order');

Надо делать sort плагин. src/Plugin/views/sort/NodeRating.php

<?php

namespace Drupal\MYMODULE\Plugin\views\sort;

use Drupal\Core\Form\FormStateInterface;

/**
 * @ViewsSort("node_rating")
 */
class NodeRating extends SortPluginBase {

  /**
   * {@inheritdoc}
   */
  public function query() {
    $this->ensureMyTable();
    $this->query->addOrderBy('table', 'field', $this->options['order'] 'order');
  }

}

Пример писал в слепую, придется проверять самому. А также не забыть заменить table и филд значения на свои.

Я вчера как раз статью на эту тему публиковал, возможно поможет.

Ответ дан 27.07.2017 - 06:34
Аватар пользователя Niklan
Niklan
445

Спасибо! Очень полезная статья. Добавил в закладки.

Саму идею уловил. Осталось решить проблему с составлением правильного запроса. Тут все совсем печально.

Комментарий оставлен 27.07.2017 - 18:45

Для этого советую почитать\перечитать раздел query() и addOrderBy(), а также самый последний абзац статьи. Очень-очень внимательно и уловить мысль. Вы сразу поймете как делать. По сути пример выше и есть решение $this->options['order'] содержит текущую сортировку Views (ASC, DESC), вам нужно лишь подставить название таблицы БД и поля данной таблицы где ваш рейтинг по которому нужно сортировать и всё!

Комментарий оставлен 28.07.2017 - 06:25