Модуль views предоставляет несколько хуков для «внешних» манипуляций, подобно ядру Drupal.
Вы можете реализовать hook_views_pre_render(&$view)
в пользовательском модуле и манипулировать массивом результатов, доступным в $view->result
:
/**
* Implementation of hook_views_pre_render()
*
* @param view $view
*/
function YourModuleName_views_pre_render(&$view) {
// Check if this is the view and display you want to manipulate
// NOTE: Adjust/Remove the display check, if you want to manipulate some/all displays of the view
if ('YourViewName' == $view->name && 'YourDisplayName' == $view->current_display) {
// EXAMPLE: Just reverse result order
// TODO: Replace with your desired (re)ordering logic
$view->result = array_reverse($view->result);
}
}
Хук вызывается в середине процесса генерации представления, после того, как все данные результата собраны, но до того, как фактический вывод будет обработан, поэтому изменения в массиве результатов будут отражены в окончательном выводе представления.
РЕДАКТИРОВАНИЕ: В качестве альтернативы, вы можете обработать представление «вручную», скопировав поведение функции views_get_view_result()
, но вместо возврата результата вы манипулируете им и продолжаете отображать представление:
function yourModule_get_custom_sorted_view($display_id = NULL) {
// As the custom sorting probably only works for a specific view,
// we 'demote' the former $name function parameter of 'views_get_view_result()'
// and set it within the function:
$name = 'yourViewName';
// Prepare a default output in case the view definition can not be found
// TODO: Decide what to return in that case (using empty string for now)
$output = '';
// Then we create the result just as 'views_get_view_result()' would do it:
$args = func_get_args();
if (count($args)) {
array_shift($args); // remove $display_id
}
$view = views_get_view($name);
if (is_object($view)) {
if (is_array($args)) {
$view->set_arguments($args);
}
if (is_string($display_id)) {
$view->set_display($display_id);
}
else {
$view->init_display();
}
$view->pre_execute();
$view->execute();
// 'views_get_view_result()' would just return $view->result here,
// but we need to go on, reordering the result:
$important_var = important_function();
$view->result = sorting_function($result, $important_var);
// Now we continue the view processing and generate the rendered output
// NOTE: $view->render will call $view->execute again,
// but the execute method will detect that it ran already and not redo it.
$output = $view->render();
// Clean up after processing
$view->post_execute();
}
return $output;
}
Примечание: Это много дублирования кода и, следовательно, подвержено ошибкам - я не рекомендую этого и предпочитаю использовать описанную выше реализацию ловушки, пытаясь найти способ получить доступ к вашему '$ важный_вар изнутри этого.