Представления 3.0 обработчик виртуальных числовых полей
Я создал пользовательский обработчик для виртуального поля счетчика для своего модуля, но, похоже, я делаю что-то неправильно, так как не могу ни отсортировать его, ни отфильтровать как числовое поле. Кто-нибудь может сказать, что мне нужно добавить в метод запроса, чтобы на самом деле разместить значения в таблицах, чтобы представления могли его использовать?
class mymodule_handler_field_count_for_interval extends views_handler_field_numeric {
function query() {
$this->ensure_my_table();
$this->add_additional_fields();
}
function pre_render(&$values){
foreach ($values as $key=>$value){
$values[$key]->count=$this->my_module_count($value->nid);
}
}
function render($values) {
$count = $values->count;
return $count;
}
function mymodule_count($nid){
$count=0;
if (isset($this->view->filter['timestamp'])) {
$filter_operator=strtoupper($this->view->filter['timestamp']->operator);
$filter=$this->view->filter['timestamp'];
$query=db_select('my_module_table','s');
switch ($filter_operator){
case '<':
case '<=':
case '>':
case '>=':
//building the query
$query->condition('timestamp',strtotime($filter->value['value']),$filter_operator)
->condition('nid',$nid,'=')
->fields('s',array('sid'))
->addExpression('COUNT(sid)','sid_count');
$result=$query->execute();
foreach ($result as $count_row){
//counting
$count+=$count_row->sid_count;
}
break;
case 'between':
case 'not between':
//building the query
$query->condition('timestamp',array(strtotime($filter->value['min']),strtotime($filter->value['max'])),$filter_operator)
->condition('nid',$nid,'=')
->fields('s',array('sid'))
->addExpression('COUNT(sid)','sid_count');
$result=$query->execute();
foreach ($result as $count_row){
//counting
$count+=$count_row->sid_count;
}
break;
}
}
return $count;
}
}
Чтобы немного прояснить вопрос, вот моя таблица пользовательских модулей в файле установки (hook_schema).
function my_module_schema(){
$schema['my_module_table']=array(
'description'=>t('the base table for our statistics'),
'fields'=>array(
'sid'=>array(
'description'=>t('The index field'),
'type'=>'serial',
'unsigned'=>TRUE,
'not null'=>TRUE,
),
'uid'=>array(
'description'=>t('The user UID'),
'type'=>'int',
'unsigned'=>TRUE,
'not null'=>TRUE,
),
'nid'=>array(
'description'=>t('The node NID'),
'type'=>'int',
'unsigned'=>TRUE,
'not null'=>TRUE
),
'tid'=>array(
'description'=>t('The node TID for the category taxonomy.'),
'type'=>'int',
'unsigned'=>TRUE,
'not null'=>FALSE
),
'access_type'=>array(
'description'=>t('The access type: 0=>web, 1 =>mobile, 2=>barcodescan'),
'type'=>'int',
'size'=>'tiny',
'unsigned'=>TRUE,
'not null'=>TRUE,
),
'timestamp'=>array(
'description'=>t('The time of viewing'),
'type'=>'int',
'unsigned'=>TRUE,
'not null'=>TRUE
),
),
'unique keys' => array(
'sid' => array('sid'),
),
);
return $schema;
}
Как вы можете видеть, это было бы очень трудно сохранить другую таблицу со счетчиками, потому что данные изменяются в секунду/минуту, а пользователи, получающие доступ к узлам, разные. итак, я хотел бы понять, как заставить представления видеть, что я создаю виртуальное поле числовое и где его поместить в таблицы представлений, чтобы оно выполняло запрос из своих внутренних таблиц. Возможно ли это?
2 answers
Поля, фильтрация и сортировка реализованы отдельными обработчиками. В вашем случае, поскольку ваши данные являются виртуальными, вам нужно будет написать свои собственные обработчики. Вероятно, вам следует рассмотреть возможность расширения views_handler_filter_numeric и views_handler_sort. Тогда в вашем файле mymodule.views.inc у вас будет что-то вроде:
$data['mytable']['count_for_interval'] = array(
'title' => t('Count for interval'),
'help' => t('Number of counts in interval.'),
'field' => array(
'handler' => 'mymodule_handler_field_count_for_interval',
'click sortable' => TRUE,
),
'filter' => array(
'handler' => 'mymodule_handler_filter_count_for_interval',
),
'sort' => array(
'handler' => 'mymodule_handler_sort_count_for_interval',
),
'argument' => array(
'handler' => 'views_handler_argument_numeric',
),
);
Если вы хотите иметь возможность сортировать по значениям, которых нет в базе данных, вам определенно необходимо записать данные в базу данных.
Как только у вас это будет, вы сможете написать интеграцию представлений для этого поля в базе данных, и все будет в порядке.