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. }

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

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

  d888    888        .d888  8888888b.  
d8888 888 d88P" 888 Y88b
888 888 888 888 888
888 88888b. 888888 888 d88P
888 888 "88b 888 8888888P"
888 888 888 888 888
888 888 888 888 888
8888888 888 888 888 888


Зарегистрируйтесь для добавления материалов без проверки.