Views handler для отображения значения поля предыдущей ревизии

Задача была следующая: создать возможность для выгрузки данных об изменении аккаунтов пользователями. В частности нужно было логировать изменение почтового адреса пользователя. Реализовывать я решил через включение ревизий для пользователя (модуль user_revision). Отображать данные решил через Views и выгружать все это дело через Views Data Export.

Самой большой сложностью было - отобразить значение email'а предыдущей ревизии. Готовых решений я не нашел и поэтому решил написать Views handler. Собственно, вот что получилось.

  1. /**
  2.  * Class views_handler_mymodule_users_revision_previous_value
  3.  */
  4. class views_handler_mymodule_users_revision_previous_value extends views_handler_field {
  5. function option_definition() {
  6. $options = parent::option_definition();
  7. $options['revision_field'] = array('default' => '');
  8.  
  9. return $options;
  10. }
  11.  
  12. function options_form(&$form, &$form_state) {
  13. $form['revision_field'] = array(
  14. '#type' => 'select',
  15. '#title' => t('Field'),
  16. '#required' => TRUE,
  17. '#options' => array(
  18. 'email' => t('Email'),
  19. ),
  20. '#default_value' => $this->options['revision_field'],
  21. '#description' => t('Select a field which should be displayed with
  22. previous revision value.'),
  23. );
  24. parent::options_form($form, $form_state);
  25. }
  26.  
  27. function construct() {
  28. parent::construct();
  29. }
  30.  
  31. function query() {
  32. $this->ensure_my_table();
  33. $field = $this->field . '_' . $this->position;
  34.  
  35. switch ($this->options['revision_field']) {
  36. case 'email':
  37. $this->field_alias = $this->query->add_field(NULL,
  38. "(SELECT ur.mail FROM {user_revision} as ur
  39. WHERE ur.vid < {user_revision}.vid AND ur.uid = {user_revision}.uid
  40. ORDER BY ur.vid DESC LIMIT 0,1)", $field);
  41.  
  42. $this->query->add_having($this->options['group'], $field, '', '<>');
  43. break;
  44. }
  45. }
  46.  
  47. function render($values) {
  48. $value = $this->get_value($values);
  49. return $value;
  50. }
  51. }

Вот такое решение получилось. Не совсем мне конечно нравится текстовый вариант подзапроса, но ничего другого выдумать не удалось. Если знаете, как улучшить этот код - пишите!

Добавить комментарий

              d8b  8888888b.           
Y8P 888 "Y88b
888 888
888 888 8888 888 888 888d888
888 888 "888 888 888 888P"
Y88 88P 888 888 888 888
Y8bd8P 888 888 .d88P 888
Y88P 888 8888888P" 888
888
d88P
888P"
Зарегистрируйтесь для добавления материалов без проверки.