[решено] Проблема с views3 sort handler

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

Аватар пользователя enemis enemis 19 августа 2012 в 11:43

Доброе время суток. Столкнулся с проблемой с views api может кто что подскажет.
Есть стандартное представление views я определил свой handler

function MODULE_helper_views_data(){
  $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;

Дальше наследовал хендлер от стандартного:

class MODULE_helper_views_handler_field_like_count extends views_handler_field_numeric {
  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

SELECT node.nid AS nid, flag_content.content_id AS flag_content_content_id, node.created AS node_created, 'node' AS field_data_field_foto_look_node_entity_type, <u>(SELECT fc.count FROM {flag_counts} fc WHERE fc.content_id = node.nid) AS like_count, like_count AS like_count_1</u>
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. Просто не заметил. Тема закрыта.

Комментарии

Аватар пользователя enemis enemis 21 августа 2012 в 18:23

Решение по сортировке дополнительно созданным поля я так и не нашел. А правильный путь подключать целую таблицу через view api. те по сути join'ать ее.
Я не у видел связи кол-во кликов на флаге, и решил подключить эту таблицу flag_count или как то так, вручную возник какой то другой косяк который натолкнул на мысль что данная связь уже описана.

Аватар пользователя xakudu xakudu 21 августа 2012 в 18:58

"enemis" wrote:
Решение по сортировке дополнительно созданным поля я так и не нашел.

А я нашел. Точно такое же, как и по полю оказывается. Только 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(NULLNULL,$this->options['order'], $this->real_field);
  }
 
?>

Только count нужно сразу считать, в запросе. И к сожалению в count(*) нельзя поле совать - ругается, что нужно group by, а добавить его не получается.

Аватар пользователя enemis enemis 21 августа 2012 в 19:08

Вообще то у сортировки есть свой хендлер который так же описывается в hook_views_data.

"enemis" wrote:
'sort' => array(
'handler' => 'MODULE_views_handler_sort_like_count',
),
);
return $data;

В стандартном хендлере numeric как раз есть эта строчка: $this->query->add_orderby(NULL, NULL,$this->options['order'], $this->real_field); только с именем таблицы и поля. Я объявмл свой класс, наследовал от стандартного numeric. Переопределил метод query как раз как ты написал но все равно не работает. Может конечно добавлением ortder by в хендлер поля решит проблему, но я уже не хочу возвращать историю файла чтолбы попробовать. Когда возникнет похожая задача попробую обязательно.

Аватар пользователя xakudu xakudu 21 августа 2012 в 19:51

Но фильтр написать так и не получилось.
PS Хотя нет, пишется точно так же, только там из-за ограничений mysql нужно сделать хитрый финт ушами.