Drupal: og+views, сортировка по количеству участников

21 апреля 2011 г.

При разработке столкнулся с необходимостью сортировать группы, предоставляемые модулем 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);
      }
    }
}
Теги:
рубрика PHP, Сайтостроение
  • Похожие статьи
  • Предыдущие из рубрики