Доброе время суток. Столкнулся с проблемой с views api может кто что подскажет.
Есть стандартное представление views я определил свой handler
$data['views']['like_count'] = array(
'title' => 'Количество like\'ов',
'help' => t('Just a numeric field.'),
'field' => array(
'handler' => 'MODULE_helper_views_handler_field_like_count',
'click sortable' => false,
),
'filter' => array(
'handler' => 'views_handler_filter_numeric',
),
'sort' => array(
'handler' => 'MODULE_views_handler_sort_like_count',
),
);
return $data;
Дальше наследовал хендлер от стандартного:
function query() {
$this->field_alias = $this->query->add_field(
NULL,
'(SELECT fc.count FROM {flag_counts} fc WHERE fc.content_id = node.nid)',
'like_count'
);
}
function render($values) {
if (empty($values->count))
return 0;
else
return $values->count;
}
}
Поле выводится все работает проблема в сортировке. при добавлении сортировки пишет SQLSTATE[42S22]: Column not found: 1054 Unknown column 'like_count' in 'field list'
в дамп sql видно что почему то создается 2 поля. Мое As like_count и like_count as_like_count_1
FROM
{node} node
LEFT JOIN {users} users_node ON node.uid = users_node.uid
LEFT JOIN {flag_content} flag_content_node ON node.nid = flag_content_node.content_id AND flag_content_node.fid = '2'
LEFT JOIN {flag_content} flag_content ON node.nid = flag_content.content_id AND (flag_content.fid = '2' AND flag_content.uid = '1' AND flag_content.sid = '0')
WHERE (( (node.status = '1') AND (node.type IN ('Page')) ))
ORDER BY node_created DESC, like_count_1 ASC
LIMIT 1 OFFSET 0
Может у кого нибудь есть идеи почему так происходит?
update решение простое нужно подключать через join таблицу используя hook_views_data. но данная таблица уже подключена в файле flag.views.inc. Просто не заметил. Тема закрыта.
Комментарии
Так какое решение-то, где? Напишите плиз. Что изменить то?
Решение по сортировке дополнительно созданным поля я так и не нашел. А правильный путь подключать целую таблицу через view api. те по сути join'ать ее.
Я не у видел связи кол-во кликов на флаге, и решил подключить эту таблицу flag_count или как то так, вручную возник какой то другой косяк который натолкнул на мысль что данная связь уже описана.
А я нашел. Точно такое же, как и по полю оказывается. Только order by добавить надо. Типа
<?php class MODULE_helper_views_handler_field_like_count extends views_handler_field_numeric {
function query() {
$this->field_alias = $this->query->add_field(
NULL,
'(SELECT count(*) FROM {flag_counts} fc WHERE fc.content_id = node.nid)',
'like_count'
);
$this->query->add_orderby(NULL, NULL,$this->options['order'], $this->real_field);
}
} ?>
Только count нужно сразу считать, в запросе. И к сожалению в count(*) нельзя поле совать - ругается, что нужно group by, а добавить его не получается.
Вообще то у сортировки есть свой хендлер который так же описывается в hook_views_data.
В стандартном хендлере numeric как раз есть эта строчка: $this->query->add_orderby(NULL, NULL,$this->options['order'], $this->real_field); только с именем таблицы и поля. Я объявмл свой класс, наследовал от стандартного numeric. Переопределил метод query как раз как ты написал но все равно не работает. Может конечно добавлением ortder by в хендлер поля решит проблему, но я уже не хочу возвращать историю файла чтолбы попробовать. Когда возникнет похожая задача попробую обязательно.
Но фильтр написать так и не получилось.
PS Хотя нет, пишется точно так же, только там из-за ограничений mysql нужно сделать хитрый финт ушами.
Например?
having вместо where