Drupal: og+views, сортировка по количеству участников
При разработке столкнулся с необходимостью сортировать группы, предоставляемые модулем og (Organic groups), по количеству участников. Обнаружилось, что og_views предоставляет только поле для отображения кол-ва участников, сортировки нет. После безрезультатного поиска готового решения полез я в сам модуль копаться.
Моветон, конечно, файлы модуля изменять, но на написание api для views отдельным модулем времени не было, да и не приходилось заниматься еще такими вещами.
Вот найденное мною решение:
файл og_views.views.inc:152, требуется вставить
'sort' => array( 'handler' => 'views_handler_sort', ),
в массив описывающий поле «member_count», в итоге данный массив будет выглядеть так:
$data['og']['member_count'] = array( 'title' => t('Group: Members count'), 'field' => array( 'handler' => 'og_views_handler_field_og_member_count', 'click sortable' => TRUE, 'help' => t('Number of members for a group. Excludes memberships which are pending approval.'), ), 'sort' => array( 'handler' => 'views_handler_sort', ), );
Но это еще не все, алиас поля отличается от формируемого views из структуры [‘og’][‘member_count’], исправляем, заменяя в файле og_views_handler_field_og_member_count.inc все совпадения с «member_count» на «og_member_count». В итоге приводим к такому виду:
class og_views_handler_field_og_member_count extends views_handler_field_numeric { function query() { $table = $this->query->ensure_table('og'); $sql = og_list_users_sql(1, 0, NULL, TRUE); $sql = str_replace('%d', 'og.nid', $sql); $this->query->add_field('', "($sql)", 'og_member_count'); $this->field_alias = 'og_member_count'; } function render($values) { $nid = $values->nid; $txt = $values->og_member_count; if (og_is_group_member($nid)) { $value = og_is_picture() ? l($txt, "og/users/$nid/faces") : l($txt, "og/users/$nid"); return check_plain($this->options['prefix']) . $value . check_plain($this->options['suffix']); } else { return parent::render($values); } } }