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

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

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

 888    d8P   888    888888   .d88888b.  
888 d8P 888 "88b d88P" "Y88b
888 d8P 888 888 888 888
888d88K 888 888 888 888
8888888b 888 888 888 888
888 Y88b 888 888 888 Y8b 888
888 Y88b 888 88P Y88b.Y8b88P
888 Y88b 888 888 "Y888888"
.d88P Y8b
.d88P"
888P"
Зарегистрируйтесь для добавления материалов без проверки.