Представления 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;
}

Как вы можете видеть, это было бы очень трудно сохранить другую таблицу со счетчиками, потому что данные изменяются в секунду/минуту, а пользователи, получающие доступ к узлам, разные. итак, я хотел бы понять, как заставить представления видеть, что я создаю виртуальное поле числовое и где его поместить в таблицы представлений, чтобы оно выполняло запрос из своих внутренних таблиц. Возможно ли это?

 3
Author: cmos, 2011-11-03

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',
 ),

);

 0
Author: keithm, 2011-11-03 12:45:11

Если вы хотите иметь возможность сортировать по значениям, которых нет в базе данных, вам определенно необходимо записать данные в базу данных.

Как только у вас это будет, вы сможете написать интеграцию представлений для этого поля в базе данных, и все будет в порядке.

 0
Author: Daniel Wehner, 2011-11-03 12:20:04