Рейтинг:1

Пользовательская сортировка сущностных запросов

флаг in

У меня есть обычные поля "фамилия" и "имя", однако мне нужно что-то большее, чем

->сортировать('поле_фамилия', 'ASC')
->сортировать('field_firstname', 'ASC')

Фамилии являются старыми английскими именами и содержат префиксы к именам, поэтому фамилия «Святой Иоанн» должна быть отсортирована как «Святой Иоанн», чтобы появиться в списке в правильном месте.

Другие примеры могут содержать апостроф, который нужно удалить для сортировки, но он все равно будет отображаться.

В идеале я бы хотел, чтобы для этого был хороший предварительно написанный модуль, но подозреваю, что его нет.

Есть ли способ добавить пользовательскую сортировку в запрос сущности? Мне, вероятно, нужно будет использовать этот же вид в представлении, поэтому что-то, что можно повторно использовать (например, в представлении), было бы идеальным.

Рейтинг:2
флаг cn

Запрос сущности имеет только довольно простую сортировку.

Ты мог бы написать более сложный запрос, такой как запрос SELECT.

Однако, учитывая, что вы хотите повторно использовать это в представлениях, и учитывая, что у вас, вероятно, есть несколько правил, которые вы хотите применить, я бы просто добавил еще одно поле («имя для сортировки»), а затем использовал hook_entity_presave() чтобы вычислить значение, используя любые правила, которые вы хотите.

С использованием hook_entity_presave() гарантирует, что значение будет обновляться при создании или редактировании узла, поэтому оно всегда будет актуальным.

Вы можете скрыть это поле в настройках отображения сущностей, а затем сортировать по нему в Views, entityquery и во всем остальном.

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

Рейтинг:0
флаг in

На случай, если это поможет другим, я решил эту проблему, вытащив все записи с помощью базовой сортировки, а затем используя PHP usort со специальной функцией, чтобы извлечь нужные поля из объекта узла, обработать и сравнить, а затем отобразить по мере необходимости.

$node_ids = \Drupal::entityQuery('узел')
            ->условие('тип', 'мой_тип', '=')
            ->выполнить();    
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($node_ids);
usort($nodes, [$this, "my_node_sort"]);

Он отсортировал около 1800 сложных узлов без заметной задержки, так что это может быть не идеальное решение, но вполне работоспособное. Также пригодился для другой сортировки, где это не была прямая алфавитная сортировка. Не изучал представления, но подозреваю, что могу использовать аналогичный процесс.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.