Мульти-колоночная сортировка в dynamic-списках

Как задать цепочку полей для ORDER BY через sort.then в page_config

sort.then — вторичная сортировка

В page_config для dynamic-страниц ключ sort поддерживает опциональный then — массив полей для вторичной сортировки.

Это полезно когда нужно отсортировать записи сначала по одной колонке, а внутри одинаковых значений — по другой.

Базовый синтаксис

{
  "source_table": "docs",
  "template": "docs",
  "sort": {
    "field": "category",
    "order": "ASC",
    "then": [
      {"field": "sort_order", "order": "ASC"}
    ]
  },
  "items_per_page": 50
}

Полный пример с несколькими then

"sort": {
  "field": "section_title",
  "order": "ASC",
  "then": [
    {"field": "sort_order", "order": "ASC"},
    {"field": "created_at", "order": "DESC"}
  ]
}

Такой конфиг выдаст записи отсортированными по section_title (A-Z), внутри групп — по sort_order (возрастание), при одинаковом sort_order — по created_at (свежие сверху).

Какие поля можно использовать

Любые колонки из исходной таблицы (source_table). Имена полей фильтруются: разрешены только символы a-z, A-Z и _.

Если поле указано неверно или не существует — SQL-запрос вернёт ошибку, страница покажет 404 (режим debug покажет детали).

Обратная совместимость

Старый формат без then продолжает работать:

"sort": {"field": "sort_order", "order": "ASC"}

Если then отсутствует — поведение точно такое же как раньше.

Что изменилось технически

Поля в SQL-запросе теперь оборачиваются в двойные кавычки:

ORDER BY "section_title" ASC, "sort_order" ASC, "created_at" DESC

Это защищает от конфликтов с зарезервированными словами SQL (например, order, group, index).

Когда использовать

  • Каталог по разделам — группировка по category, внутри по sort_order
  • Блог с закреплёнными постами — сначала is_pinned DESC, потом created_at DESC
  • Чейнджлог — группировка по типу релиза, внутри по версии
  • Таблица с категориями — сначала категория, внутри позиция

См. также