Views handler для отображения значения поля предыдущей ревизии
Задача была следующая: создать возможность для выгрузки данных об изменении аккаунтов пользователями. В частности нужно было логировать изменение почтового адреса пользователя. Реализовывать я решил через включение ревизий для пользователя (модуль user_revision). Отображать данные решил через Views и выгружать все это дело через Views Data Export.
Самой большой сложностью было - отобразить значение email'а предыдущей ревизии. Готовых решений я не нашел и поэтому решил написать Views handler. Собственно, вот что получилось.
- /**
- * Class views_handler_mymodule_users_revision_previous_value
- */
- class views_handler_mymodule_users_revision_previous_value extends views_handler_field {
- function option_definition() {
- $options = parent::option_definition();
- $options['revision_field'] = array('default' => '');
-
- return $options;
- }
-
- function options_form(&$form, &$form_state) {
- $form['revision_field'] = array(
- '#type' => 'select',
- '#title' => t('Field'),
- '#required' => TRUE,
- '#options' => array(
- 'email' => t('Email'),
- ),
- '#default_value' => $this->options['revision_field'],
- '#description' => t('Select a field which should be displayed with
- previous revision value.'),
- );
- parent::options_form($form, $form_state);
- }
-
- function construct() {
- parent::construct();
- }
-
- function query() {
- $this->ensure_my_table();
- $field = $this->field . '_' . $this->position;
-
- switch ($this->options['revision_field']) {
- case 'email':
- $this->field_alias = $this->query->add_field(NULL,
- "(SELECT ur.mail FROM {user_revision} as ur
- WHERE ur.vid < {user_revision}.vid AND ur.uid = {user_revision}.uid
- ORDER BY ur.vid DESC LIMIT 0,1)", $field);
-
- $this->query->add_having($this->options['group'], $field, '', '<>');
- break;
- }
- }
-
- function render($values) {
- $value = $this->get_value($values);
- return $value;
- }
- }
Вот такое решение получилось. Не совсем мне конечно нравится текстовый вариант подзапроса, но ничего другого выдумать не удалось. Если знаете, как улучшить этот код - пишите!
Добавить комментарий