[решено]Views - сортировка по виртуальному полю

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

Аватар пользователя Positiff Positiff 27 апреля 2011 в 12:43

Помогите справится с проблемой. пытаюсь сделать сортировку по виртуальному полю:

    'counts' => array(
        'title' => t('Count bids'),
        'help'   => 'Количество ставок',
        'field' => array(
                'handler' => 'lot_handler_field_counts',
                'click sortable' => TRUE,
        ),
        'sort' => array(
                'handler' => 'views_handler_sort',
        ),
        'filter' => array(
                'handler' => 'views_handler_filter_numeric',
        ),
        ),

Файл хандлера (считает количество значение в определенной таблице):

class lot_handler_field_counts extends views_handler_field {
  function render($values) {
     return db_result(db_query('SELECT count(bid) as counts from {lot_bids} where nid = %d',$values->nid));  
  }  
  function query() {
  }
}

Связь:

  $handlers['handlers']['lot_handler_field_counts'] = array(
    'parent' => 'views_handler_field',
    'file' => 'lot_handler_field_counts.inc',
  );

Само поле отображается корректно, но если попытаться отсортировать по нему, то выдается ошибка:

user warning: Unknown column 'lot.counts' in 'field list' query: SELECT node.nid...
....lot.counts AS unknown FROM.... ORDER BY unknown ASC LIMIT 0, 20

Столбец виртуальный и его действительно там нет. Как его туда добавить?
Меня еще в получившемся ошибочном запросе смущает что имя этого столбца не определено. Где его определить?

Возможно нужно подставить атрибут formula, но не совсем тогда понятно что туда писать в этом случае

Заранее спасибо

Комментарии

Аватар пользователя Positiff Positiff 6 мая 2011 в 11:48

Разобрался. Решение включая возможности фильтрации по этому полю следующее:
1. Объявляем поле:

        $data['lot']['bid_count'] = array(             
                'title' => t('Quantity'),
                'help'   => 'Количество ставок',
                'field' => array(
                        'handler' => 'lot_handler_field_bid_count',
                        'click sortable' => TRUE,
                ),
        'filter' => array(
                'handler' => 'lot_handler_filter_bid_count',
        ),
    );

2. Объявляем handler-ы (за основу берем handler-ы numeric):

  $handlers['handlers']['lot_handler_field_bid_count'] = array(
    'parent' => 'views_handler_field_numeric',
    'file' => 'lot_handler_field_bid_count.inc',
  );
  $handlers['handlers']['lot_handler_filter_bid_count'] = array(
    'parent' => 'views_handler_filter_numeric',
    'file' => 'lot_handler_filter_bid_count.inc',
  );

3.1 Файл lot_handler_field_bid_count.inc:

<?php
// Определяем обработчик, наследуем от стандартного класса "числовое значение"
class lot_handler_field_bid_count extends views_handler_field_numeric {
        // Запрос к БД
        function query() {
            // Определяем таблицу
        $table = $this->query->ensure_table('node');
        // Запрашиваем количество ставок
        $sql = "SELECT COUNT(bid) FROM {lot_bids} lb WHERE lb.nid = node.nid";
        // Указываем название для возвращаемого поля
        $this->query->add_field('', "($sql)", 'bid_count');
        $this->field_alias = 'bid_count';
        }
        // Возвращаем полученное значение
        function render($values) {
            $txt = $values->bid_count;
            if ($txt) {
                return $txt;
        }
        else {
                return parent::render($values);
        }
        }
}

3.2 Файл lot_handler_filter_bid_count.inc:

<?php
// Определяем обработчик, наследуем от стандартного класса "числовое значение"
class lot_handler_filter_bid_count extends views_handler_filter_numeric {
        // Запрос к БД
        function query() {
                $this->ensure_my_table();
                $field = "(SELECT COUNT(bid) FROM {lot_bids} lb WHERE lb.nid = node.nid)";

                $info = $this->operators();
                if (!empty($info[$this->operator]['method'])) {
                $this->{$info[$this->operator]['method']}($field);
                }
        }
}

На выходе ко View в раздел вывода и в раздел WHERE будут добавлен соответствующие запросы, для возможности сортировки и фильтрации

Надеюсь кому нибудь поможет