Drupal → Views сортировка по выражению/условию/формуле

14.01.2022

Дано — тип материала с числовым полем field_price.

Задача — в Views отсортировать ноды по наличию цены, т.е. сначала идут ноды с ценой (любой), а потом без.

1. Создаём класс плагина:

// src/Plugin/views/sort/IsNull.php

namespace Drupal\MODULENAME\Plugin\views\sort;

use Drupal\views\Plugin\views\sort\SortPluginBase;

/**
 * @ViewsSort("is_null")
 */
class IsNull extends SortPluginBase {

  /**
   * {@inheritDoc}
   */
  public function query(): void {
    $this->ensureMyTable();
    $query = $this->query; /** @var \Drupal\views\Plugin\views\query\Sql $query */
    $sort_alias = $this->tableAlias . '_' . $this->field;
    $query->addOrderBy(NULL, "($this->tableAlias.$this->realField IS NULL OR $this->tableAlias.$this->realField = 0)", $this->options['order'], $sort_alias);
  }

}

2. Добавляем в Views новую сортировку по полю field_price:

// MODULENAME.views.module

/**
 * Implements hook_views_data_alter().
 */
function MODULENAME_views_data_alter(array &$data): void {
  $data['node__field_price']['field_price_is_null'] = [
    'group' => $data['node__field_price']['field_price']['group'],
    'title' => t('Price is empty'),
    'title short' => t('Price is empty'),
    'real field' => 'field_price_value',
    'sort' => [
      'id' => 'is_null',
    ],
  ];
}

3. Сбрасываем кэш и в форме редактирования представления добавляем новую сортировку. SQL запрос будет выглядеть примерно так:

SELECT n.nid, (fp.field_price_value IS NULL OR fp.field_price_value = 0) AS field_price_is_null
FROM node n
LEFT JOIN node__field_price fp ON fp.entity_id = n.nid
ORDER BY field_price_is_null DESC

P.S: для решения конкретно этой задачи (сортировки по null) есть модуль Views Sort Null Field, а код выше, это просто пример написания своего sort-плагина.

Написанное актуально для
Drupal 8+
Похожие записи

Добавить комментарий