diff --git a/uc_roles/uc_roles.views.inc b/uc_roles/uc_roles.views.inc new file mode 100644 index 0000000..558e461 --- /dev/null +++ b/uc_roles/uc_roles.views.inc @@ -0,0 +1,110 @@ + array( + 'left_field' => 'uid', + 'field' => 'uid', + ), + ); + + + // Expose the role expiration date + $data['uc_roles_expirations']['expiration'] = array( + 'title' => t('Ubercart Role expiration date/time'), + 'help' => t('Date and time the role will expire. (See also Role expiration role.)'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + + // Expose the role id from uc_roles_expirations + $data['uc_roles_expirations']['rid'] = array( + 'title' => t('Ubercart Role expiration role'), + 'help' => t('The Role that corresponds with the Role expiration date/time'), + // Information for displaying the rid + 'field' => array( + 'handler' => 'uc_roles_handler_field_rid', + 'click sortable' => TRUE, + ), + // Information for accepting a rid as an argument + 'argument' => array( + 'handler' => 'views_handler_argument_users_roles_rid', + 'name field' => 'title', // the field to display in the summary. + 'numeric' => TRUE, + 'validate type' => 'rid', + ), + // Information for accepting a uid as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_user_roles', + ), + // Information for sorting on a uid. + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + + return $data; +} + +class uc_roles_handler_field_rid extends views_handler_field { + + // Derived from views_handler_field_user_roles + // Purpose: get the *names* that correspond to the role_expire_rids. + function pre_render($values) { + $roles = array(); + $this->items = array(); + + // Get all the unique role ids into the keys of $roles. Initializing into + // array_keys helps prevent us from having a list where the same rid appears + // over and over and over. + foreach ($values as $result) { + $roles[$this->get_value($result, NULL, TRUE)] = FALSE; + } + + if ($roles) { + $result = db_query("SELECT r.rid, r.name FROM {role} r WHERE r.rid IN (:rids) ORDER BY r.name", + array(':rids' => array_keys($roles))); + foreach ($result as $role) { + $this->items[$role->rid]['role'] = check_plain($role->name); + $this->items[$role->rid]['rid'] = $role->rid; + } + } + } + + // Render the rid as the role name. + function render($values) { + + // Return the role name corresponding to the role ID. + // TODO: Should I be using this->get_value() here? + $rid = $values->uc_roles_expirations_rid; + if ($rid) { + $role = $this->items[$rid]['role']; + if (!empty($role)) { + return $role; + } + } + } +} + diff --git a/uc_roles/uc_roles.info b/uc_roles/uc_roles.info index f7c899e..ccd2d43 100644 --- a/uc_roles/uc_roles.info +++ b/uc_roles/uc_roles.info @@ -2,8 +2,12 @@ name = Roles description = Assigns permanent or expirable roles based on product purchases. dependencies[] = uc_product dependencies[] = uc_order +dependencies[] = views package = Ubercart - core (optional) core = 7.x ; Test cases files[] = tests/uc_roles.test + +; Views handlers +files[] = uc_roles.views.inc diff --git a/uc_roles/uc_roles.module b/uc_roles/uc_roles.module index d7ee52c..65bdd74 100644 --- a/uc_roles/uc_roles.module +++ b/uc_roles/uc_roles.module @@ -1278,3 +1278,9 @@ function _uc_roles_get_expiration($duration, $granularity, $start_time = NULL) { return strtotime($operator . $duration . ' ' . $granularity, $start_time); } +/** + * Implements hook_views_api(). + */ +function uc_roles_views_api() { + return array('api' => '3.0'); +}