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

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

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

 888888b.              888       888           
888 "88b 888 o 888
888 .88P 888 d8b 888
8888888K. 888 888 888 d888b 888 888 888
888 "Y88b 888 888 888d88888b888 `Y8bd8P'
888 888 Y88 88P 88888P Y88888 X88K
888 d88P Y8bd8P 8888P Y8888 .d8""8b.
8888888P" Y88P 888P Y888 888 888


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