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

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

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

           .d8888b.                      
d88P Y88b
888
888d888 888d888b. 888 888 .d88b.
888P" 888P "Y88b 888 888 d8P Y8b
888 888 888 888 888 88888888
888 Y88b d88P Y88b 888 Y8b.
888 "Y8888P" "Y88888 "Y8888
888
Y8b d88P
"Y88P"
Зарегистрируйтесь для добавления материалов без проверки.