Вы здесь

Как сделать сортировку по собственному Views field handler?

0

Ранее как-то не сталкивался с хендлерами вьюсов, и тут пришлось накатить пару field handler. Как оказалось это не сложно, но я встрял, когда потребовалось отсортировать отображение по значению из моего кастомного поля.

Если кратко, моё кастомное поле делает два запрос в render() и возвращает сумму результатов этих запросов (count query). Всё отлично, но вот кажется это я делаю не верно и надо использовать query(). Верно ли делать так как я сделал, или надо выносить запросы в query()? Тогда как быть если нужно сделать запросы в разные БД и их результат сохранить?

В общем для сортировки я решил написать свой хендлер, и там по факту допускается только query(), я понял что сортировка там делается на уровне SQL запросов, и собственно встрял серьезно тут. Я очень много гуглил но результаты какие-то очень печальные. Я понял что там, судя по всему, можно использовать уже загруженные данные, но как получить значение своего поля я не понял. Я также уловил что там, если хочешь написать свой запрос - нельзя использовать DBO (db_select и т.д.), надо писать чистый SQL, что тоже странно.

В общем как правильно делаются сортировки по кастомным полям если результат поля делается в 2 запроса?

Примера кода будет вполне достаточно, я сам разберусь там что к чему. Просто в инете какой-то мусор ищется, и как правило просто про кастом поля, без сортировок. И поля все делают как и я сделал, в render() прямо с запросами игнорируя query() что меня очень напрягает. А если рыться в исходниках Views, там вообще комменты к методам заставляют плакать.

Версия Drupal: 
7.x
Категория: 
Database API
Связанные проекты: 
Views
Вопрос задан 07.02.2017 - 19:04
Аватар пользователя Niklan
Niklan
445

Ответы

0

В Views возможны сортировки только на уровне ORDER BY.

Если у тебя значения по которым нужно делать сортировку высчитываются уже после запроса, то сделать сортировку средствами MySQL как ты понимаешь невозможно, можно только вручную отсортировать $view->result в hook_views_pre_render. Ну или добавить в таблицу поле с уже высчитанными заранее значениями.

Про сортировку по формуле писал у себя - http://xandeadx.ru/blog/drupal/611

Ответ дан 07.02.2017 - 19:25
Аватар пользователя xandeadx
xandeadx
1527

Спасибо.

А что если я перепишу два запроса в один, мне его надо получается в query() уже вставлять а не в render()? И как тогда пометить что именно по нему нужна сортировка в sort handler, там как-то alias получается нужно задать? В сортировке я вижу алиас указывается, а тогда строить запрос на значение в query() правильно? У всех этот метод пустой.

Комментарий оставлен 07.02.2017 - 19:40

Твоя задача в field_handler::query() или sort_handler::query() добавить поле с числом, по которому будет идти сортировка. Поле может быть как подзапросом, так и каким-то выражением.

Комментарий оставлен 07.02.2017 - 20:16