Дано — тип материала с числовым полем 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+
Похожие записи
- Как работает опция "Aggregation type" в настройках полей Views при включённой агрегации
- Необязательное значение одной из дат в раскрытом фильтре с оператором BETWEEN
- Views фильтр "товар имеет опубликованную вариацию"
- Как расширить функционал фильтр-плагина Views? (добавляем возможность фильтровать числовые поля по нескольким значениям)
- Как для определённой роли спрятать колонку или поле в представлении Views
Добавить комментарий