Twig сортирует массив объектов по полю

У меня есть объект с полями:

  • Пользовательимя
  • фамилия
  • возраст

и еще немного. Я отправляю в массив Twig с объектами user.

В ветке отобразить пользователей в таблице:

 {% for user in users %}
     <td>{{ user.name }}<td> <td>{{ user.lastname}}<td> <td>{{ user.age}}<td>
 {% endfor %}

Как сортировать пользователей по имени, фамилии и т.д. в Twig. Я хочу создать сортируемую таблицу.

Ответ 1

Да, вы можете добавить настраиваемый фильтр:

{% for user in users|usort %}
    ...
{% endfor %}

а затем добавьте добавочный/новый фильтр в Twig:

new \Twig_SimpleFilter('usort', array($this, 'usortFilter'))

public function usortFilter($item){
    usort($item, function ($item1, $item2) {
        if ($item1['orderNo'] == $item2['orderNo']) return 0;
        return $item1['orderNo'] < $item2['orderNo'] ? -1 : 1;
    });

    return $item;
}

Ответ 2

Сортировка в обратном порядке:

{% for user in users|sort|reverse %}
    ...
{% endfor %}

сортировка и разворот.

Ответ 3

Начиная с Twig 2.12 (выпущен 5 октября 2019 г.), вы можете использовать фильтр sort с функцией стрелки в аргументе arrow.

Например, чтобы заказать по имени:

{% for user in users|sort((a, b) => a.name <=> b.name) %}
    <td>{{ user.name }}</td> <td>{{ user.lastname}}</td> <td>{{ user.age}}</td>
{% endfor %}

Документация на веточку: https://twig.symfony.com/doc/2.x/filters/sort.html

Ответ 4

Вы должны сделать это в своей модели, используя предложение "Заказать по". Однако, если вы хотите иметь таблицу, которая может быть отсортирована динамически, вы должны посмотреть плагин jQuery tablesorter (или эквивалент, если вы не хотите использовать jQuery).

http://tablesorter.com/docs/

Ответ 5

Невозможно в ветке из коробки заказать по определенному полю. Вы можете сортировать по id с помощью PHP asort в twig, который будет фильтром |sort, или вы можете написать собственное расширение ветки, которое делает то, что вам нужно.

{% for user in users|sort %}
    ...
{% endfor %}

и отменить порядок, используя | обратный фильтр

{% for user in users|reverse(true) %}
    ...
{% endfor %}