Drupal → Сортировка по формуле в Views
Пример модуля для Views, добавляющий критерий сортировки по заранее определённой формуле.
Views 2
/** * Implements hook_views_api() */ function modulename_views_api() { return array('api' => 2); } /** * Implements hook_views_data() */ function modulename_views_data() { return array( 'views' => array( 'mysort' => array( 'title' => t('Sort by formula'), 'group' => t('Global'), 'sort' => array( 'handler' => 'views_handler_sort_formula', 'formula' => 'node.changed - node.created', // Формула или подзапрос ), ), ), ); }
Views 3
В третьей версии немного сложнее, так как из ядра удалили хэндлер views_handler_sort_formula
и поэтому придётся написать его аналог:
modulename.module
/** * Implements of hook_views_api(). */ function modulename_views_api() { return array('api' => 3); }
modulename.views.inc
/** * Implements hook_views_data() */ function modulename_views_data() { return array( 'views' => array( 'mysort' => array( 'title' => t('Sort by formula'), 'group' => t('Global'), 'sort' => array( 'handler' => 'modulename_handler_sort_mysort', ), ), ), ); }
modulename_handler_sort_mysort.inc
class modulename_handler_sort_mysort extends views_handler_sort { function query() { $this->ensure_my_table(); $this->query->add_orderby(NULL, 'node.changed - node.created', $this->options['order'], 'formula_result'); } }
modulename.info
... files[] = modulename_handler_sort_mysort.inc
SQL запрос, сгенерированный Views, будет выглядеть приблизительно так:
SELECT (node.changed - node.created) AS formula_result ORDER BY formula_result
Подробнее у гракера.
Оставить комментарий