Хуки сортировки views

Главные вкладки

Аватар пользователя rujet rujet 23 мая 2010 в 12:03

Начинаю постигать хуки views. И это очень интересно.
Есть поле которое формируется из php кода. И по нему не получается сделать сортировку.
Последовательно попробовал сделать темизацию. То есть на этапе view-views--field изменять массив $view.

Попробовал хуки hook_view_pre_render и hook_view_pre_build.
Типа такого

function garland_views_pre_render ($view){
if ($view->name == "object_type") {
for ($i=0; $i<=count($view->result)-1;$i++)
{
$view->result[$i]->objects_kitchen=function_na_php($view->result[$i]->id);
}
}

Но я так понимаю сортировка результата идет еще на этапе выполнения sql запроса.
Или все таки сортируется уже массив $view?

Комментарии

Аватар пользователя rujet rujet 23 мая 2010 в 14:03

Тут фишка в том, что поле можно сформировать только из php.
Есть вариант в процессе hook_view_pre_render пересортировать $view->result после изменения. Только как это сделать. В $view->result попадают записи после разбивки на страницы.
Неужели нельзя переопределить сортировку на массив результата sql запроса?

Можно сделать так.
перехватить формирование запроса через hook_view_pre_execute.
Переделать первоначальный sql запрос, убрав ограничения pager.
Поместить результат во временную таблицу, через функцию db_query_temporary
Обработать временную таблицу функцией на php.
Переделать sql запрос, заменив имя таблицы на временную.
Запустить sql запрос.

Как вы думаете. Этот вариант рабочий?
Или буду сильные потери в производительности?

Аватар пользователя gorr gorr 24 мая 2010 в 11:21

Похоже, что что-то не то делаете, надо модифицировать запрос к базе. Хук, который я указал, позволяет это делать, можно изменить запрос как угодно, добавить поля, если требуется тоже можно. $query это объект, со свойствами fields, sort, ... Добавьте в него все, что нужно, и вьюз это выведет.
Если без php никак, то может имеет смысл создать новую таблицу в базе и заносить в нее эти данные и интегрировать ее со вьюзом через хук views_data