Помогите справится с проблемой. пытаюсь сделать сортировку по виртуальному полю:
Файл хандлера (считает количество значение в определенной таблице):
Связь:
'parent' => 'views_handler_field',
'file' => 'lot_handler_field_counts.inc',
);
Само поле отображается корректно, но если попытаться отсортировать по нему, то выдается ошибка:
....lot.counts AS unknown FROM.... ORDER BY unknown ASC LIMIT 0, 20
Столбец виртуальный и его действительно там нет. Как его туда добавить?
Меня еще в получившемся ошибочном запросе смущает что имя этого столбца не определено. Где его определить?
Возможно нужно подставить атрибут formula, но не совсем тогда понятно что туда писать в этом случае
Заранее спасибо
Комментарии
Разобрался. Решение включая возможности фильтрации по этому полю следующее:
1. Объявляем поле:
'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):
'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:
// Определяем обработчик, наследуем от стандартного класса "числовое значение"
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:
// Определяем обработчик, наследуем от стандартного класса "числовое значение"
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 будут добавлен соответствующие запросы, для возможности сортировки и фильтрации
Надеюсь кому нибудь поможет