diff --git a/modules/registration_views/includes/registration_handler_field_entity_capacity_total.inc b/modules/registration_views/includes/registration_handler_field_entity_capacity_total.inc index f55a509..346cebc 100644 --- a/modules/registration_views/includes/registration_handler_field_entity_capacity_total.inc +++ b/modules/registration_views/includes/registration_handler_field_entity_capacity_total.inc @@ -3,16 +3,18 @@ * @file * Display maximum slots for an entity. */ -class registration_handler_field_entity_capacity_total extends views_handler_field { +class registration_handler_field_entity_capacity_total extends views_handler_field_entity { function render($values) { - $slots = $this->get_value($values); - if (isset($slots)) { - if (!empty($slots)) { - return $slots; - } - else { - return t('Unlimited'); - } + $entity = $this->get_value($values); + list($entity_id) = entity_extract_ids($this->entity_type, $entity); + + $settings = registration_entity_settings($this->entity_type, $entity_id); + + if ($settings['capacity'] != 0) { + return $settings['capacity']; + } + else { + return t('unlimited'); } } } diff --git a/modules/registration_views/includes/registration_handler_field_entity_capacity_used.inc b/modules/registration_views/includes/registration_handler_field_entity_capacity_used.inc index d8657d7..47188af 100644 --- a/modules/registration_views/includes/registration_handler_field_entity_capacity_used.inc +++ b/modules/registration_views/includes/registration_handler_field_entity_capacity_used.inc @@ -1,7 +1,7 @@ tokenize_value($this->options['entity'], 0); + return registration_administer_registrations_access($this->options['entity_type'], (int)$entity, $account); + } + + function get_access_callback() { + $entity = $this->tokenize_value($this->options['entity'], 0); + return array('registration_administer_registrations_access', array($this->options['entity_type'], (int)$entity)); + } + + function summary_title() { + return t('%entity_type with ID %entity', array('%entity_type' => $this->options['entity_type'], '%entity' => $this->options['entity'])); + } + + function option_definition() { + $options = parent::option_definition(); + $options['entity_type'] = array('default' => NULL); + $options['entity'] = array('default' => NULL); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['entity_type'] = array( + '#type' => 'textfield', + '#title' => t('Entity type'), + '#default_value' => $this->options['entity_type'], + '#required' => TRUE, + '#description' => t("The type of entity who's permission needs to be checked."), + ); + $form['entity'] = array( + '#type' => 'textfield', + '#title' => t('Entity ID'), + '#default_value' => $this->options['entity'], + '#required' => TRUE, + '#description' => t("The entity ID of the entity who's permission needs to be checked."), + ); + + $count = 0; // This lets us prepare the key as we want it printed. + foreach ($this->view->display_handler->get_handlers('argument') as $arg => $handler) { + $options[t('Arguments')]['%' . ++$count] = t('@argument title', array('@argument' => $handler->ui_name())); + $options[t('Arguments')]['!' . $count] = t('@argument input', array('@argument' => $handler->ui_name())); + } + + if (!empty($options)) { + $output = '

' . t('The following tokens are available. If you would like to have the characters \'[\' and \']\' please use the html entity codes \'%5B\' or \'%5D\' or they will get replaced with empty space.' . '

'); + foreach (array_keys($options) as $type) { + if (!empty($options[$type])) { + $items = array(); + foreach ($options[$type] as $key => $value) { + $items[] = $key . ' == ' . $value; + } + $output .= theme('item_list', + array( + 'items' => $items, + 'type' => $type + )); + } + } + + $form['token_help'] = array( + '#type' => 'fieldset', + '#title' => t('Replacement patterns'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#value' => $output, + '#id' => 'edit-options-token-help', + '#dependency' => array( + 'edit-options-tokenize' => array(1), + ), + '#prefix' => '
', + '#suffix' => '
', + ); + } + } + + function options_validate(&$form, &$form_state) { + // @todo + if (FALSE && !$form_state['values']['entity_type']) { + form_error($form['entity_type'], t('You must enter a valid entity type.')); + } + } + + /** + * Get the 'render' tokens to use for advanced rendering. + * + * This runs through all of the fields and arguments that + * are available and gets their values. This will then be + * used in one giant str_replace(). + */ + function get_render_tokens() { + $tokens = array(); + if (!empty($this->view->build_info['substitutions'])) { + $tokens = $this->view->build_info['substitutions']; + } + + $path = explode('/', $this->view->display_handler->get_option('path')); + $count = 0; + foreach ($path as $key => $piece) { + if (strpos($piece, '%') !== FALSE) { + $token = '%' . ++$count; + if (!isset($tokens[$token])) { + $tokens[$token] = ''; + } + + // Use strip tags as there should never be HTML in the path. + // However, we need to preserve special characters like " that + // were removed by check_plain(). + $tokens['!' . $count] = $key; + } + } + + return $tokens; + } + + /** + * Replace a value with tokens from the last field. + */ + function tokenize_value($value, $row_index = NULL) { + if (strpos($value, '[') !== FALSE || strpos($value, '!') !== FALSE || strpos($value, '%') !== FALSE) { + $tokens = $this->get_render_tokens(); + + $value = filter_xss_admin($value); + $value = strtr($value, $tokens); + $value = strip_tags($value); + } + + return $value; + } +} diff --git a/modules/registration_views/includes/registration_views.views_default.inc b/modules/registration_views/includes/registration_views.views_default.inc new file mode 100644 index 0000000..825f13c --- /dev/null +++ b/modules/registration_views/includes/registration_views.views_default.inc @@ -0,0 +1,267 @@ +name = 'registrations'; + $view->description = ''; + $view->tag = 'default'; + $view->base_table = 'registration'; + $view->human_name = 'Registrations'; + $view->core = 7; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Master */ + $handler = $view->new_display('default', 'Master', 'default'); + $handler->display->display_options['title'] = 'Registrations'; + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'administer_registrations'; + $handler->display->display_options['access']['entity_type'] = 'node'; + $handler->display->display_options['access']['entity'] = '!1'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['pager']['options']['items_per_page'] = '50'; + $handler->display->display_options['style_plugin'] = 'table'; + $handler->display->display_options['style_options']['columns'] = array( + 'capacity_used' => 'capacity_used', + 'registration_id' => 'registration_id', + 'anon_mail' => 'anon_mail', + 'mail' => 'mail', + 'name_1' => 'name_1', + 'name' => 'name', + 'count' => 'count', + 'created' => 'created', + 'state' => 'state', + 'view_registration' => 'view_registration', + 'edit_registration' => 'view_registration', + 'delete_registration' => 'view_registration', + ); + $handler->display->display_options['style_options']['default'] = 'created'; + $handler->display->display_options['style_options']['info'] = array( + 'capacity_used' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'registration_id' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'anon_mail' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'mail' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'name_1' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'name' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'count' => array( + 'sortable' => 1, + 'default_sort_order' => 'desc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'created' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'state' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'view_registration' => array( + 'align' => '', + 'separator' => ' ', + 'empty_column' => 0, + ), + 'edit_registration' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'delete_registration' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + /* Header: Global: Text area */ + $handler->display->display_options['header']['area']['id'] = 'area'; + $handler->display->display_options['header']['area']['table'] = 'views'; + $handler->display->display_options['header']['area']['field'] = 'area'; + $handler->display->display_options['header']['area']['content'] = '[capacity_used] total slots out of [capacity_total] used for %1. Registration is [registration_status].'; + $handler->display->display_options['header']['area']['format'] = 'plain_text'; + $handler->display->display_options['header']['area']['tokenize'] = TRUE; + /* No results behavior: Global: Unfiltered text */ + $handler->display->display_options['empty']['area_text_custom']['id'] = 'area_text_custom'; + $handler->display->display_options['empty']['area_text_custom']['table'] = 'views'; + $handler->display->display_options['empty']['area_text_custom']['field'] = 'area_text_custom'; + $handler->display->display_options['empty']['area_text_custom']['label'] = 'Empty text'; + $handler->display->display_options['empty']['area_text_custom']['empty'] = TRUE; + $handler->display->display_options['empty']['area_text_custom']['content'] = 'There are no registrants.'; + /* Relationship: Registration: Author entity author_uid */ + $handler->display->display_options['relationships']['author']['id'] = 'author'; + $handler->display->display_options['relationships']['author']['table'] = 'registration'; + $handler->display->display_options['relationships']['author']['field'] = 'author'; + $handler->display->display_options['relationships']['author']['label'] = 'Created By'; + /* Relationship: Registration: User */ + $handler->display->display_options['relationships']['user_uid']['id'] = 'user_uid'; + $handler->display->display_options['relationships']['user_uid']['table'] = 'registration'; + $handler->display->display_options['relationships']['user_uid']['field'] = 'user_uid'; + /* Relationship: Registration: Registration to Node */ + $handler->display->display_options['relationships']['registration_related_node']['id'] = 'registration_related_node'; + $handler->display->display_options['relationships']['registration_related_node']['table'] = 'registration'; + $handler->display->display_options['relationships']['registration_related_node']['field'] = 'registration_related_node'; + $handler->display->display_options['relationships']['registration_related_node']['label'] = 'Host entity from Registration'; + $handler->display->display_options['relationships']['registration_related_node']['required'] = TRUE; + /* Field: Registration: Registration ID */ + $handler->display->display_options['fields']['registration_id']['id'] = 'registration_id'; + $handler->display->display_options['fields']['registration_id']['table'] = 'registration'; + $handler->display->display_options['fields']['registration_id']['field'] = 'registration_id'; + $handler->display->display_options['fields']['registration_id']['label'] = 'ID'; + /* Field: Registration: Anonymous e-mail */ + $handler->display->display_options['fields']['anon_mail']['id'] = 'anon_mail'; + $handler->display->display_options['fields']['anon_mail']['table'] = 'registration'; + $handler->display->display_options['fields']['anon_mail']['field'] = 'anon_mail'; + $handler->display->display_options['fields']['anon_mail']['label'] = ''; + $handler->display->display_options['fields']['anon_mail']['exclude'] = TRUE; + $handler->display->display_options['fields']['anon_mail']['element_label_colon'] = FALSE; + /* Field: User: E-mail */ + $handler->display->display_options['fields']['mail']['id'] = 'mail'; + $handler->display->display_options['fields']['mail']['table'] = 'users'; + $handler->display->display_options['fields']['mail']['field'] = 'mail'; + $handler->display->display_options['fields']['mail']['relationship'] = 'user_uid'; + $handler->display->display_options['fields']['mail']['label'] = 'Email'; + $handler->display->display_options['fields']['mail']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['mail']['alter']['text'] = '[anon_mail][mail]'; + $handler->display->display_options['fields']['mail']['hide_alter_empty'] = FALSE; + /* Field: User: Name */ + $handler->display->display_options['fields']['name_1']['id'] = 'name_1'; + $handler->display->display_options['fields']['name_1']['table'] = 'users'; + $handler->display->display_options['fields']['name_1']['field'] = 'name'; + $handler->display->display_options['fields']['name_1']['relationship'] = 'user_uid'; + $handler->display->display_options['fields']['name_1']['label'] = 'User'; + /* Field: User: Name */ + $handler->display->display_options['fields']['name']['id'] = 'name'; + $handler->display->display_options['fields']['name']['table'] = 'users'; + $handler->display->display_options['fields']['name']['field'] = 'name'; + $handler->display->display_options['fields']['name']['relationship'] = 'author'; + $handler->display->display_options['fields']['name']['label'] = 'Created By'; + /* Field: Registration: Slots consumed */ + $handler->display->display_options['fields']['count']['id'] = 'count'; + $handler->display->display_options['fields']['count']['table'] = 'registration'; + $handler->display->display_options['fields']['count']['field'] = 'count'; + $handler->display->display_options['fields']['count']['label'] = 'Count'; + /* Field: Registration: Date created */ + $handler->display->display_options['fields']['created']['id'] = 'created'; + $handler->display->display_options['fields']['created']['table'] = 'registration'; + $handler->display->display_options['fields']['created']['field'] = 'created'; + $handler->display->display_options['fields']['created']['label'] = 'Created'; + $handler->display->display_options['fields']['created']['date_format'] = 'medium'; + /* Field: Registration: State entity */ + $handler->display->display_options['fields']['state']['id'] = 'state'; + $handler->display->display_options['fields']['state']['table'] = 'registration'; + $handler->display->display_options['fields']['state']['field'] = 'state'; + $handler->display->display_options['fields']['state']['label'] = 'State'; + /* Field: Registration: View link */ + $handler->display->display_options['fields']['view_registration']['id'] = 'view_registration'; + $handler->display->display_options['fields']['view_registration']['table'] = 'registration'; + $handler->display->display_options['fields']['view_registration']['field'] = 'view_registration'; + $handler->display->display_options['fields']['view_registration']['label'] = 'Actions'; + /* Field: Registration: Edit link */ + $handler->display->display_options['fields']['edit_registration']['id'] = 'edit_registration'; + $handler->display->display_options['fields']['edit_registration']['table'] = 'registration'; + $handler->display->display_options['fields']['edit_registration']['field'] = 'edit_registration'; + /* Field: Registration: Delete link */ + $handler->display->display_options['fields']['delete_registration']['id'] = 'delete_registration'; + $handler->display->display_options['fields']['delete_registration']['table'] = 'registration'; + $handler->display->display_options['fields']['delete_registration']['field'] = 'delete_registration'; + /* Field: Registration Settings: Spaces used */ + $handler->display->display_options['fields']['capacity_used']['id'] = 'capacity_used'; + $handler->display->display_options['fields']['capacity_used']['table'] = 'node'; + $handler->display->display_options['fields']['capacity_used']['field'] = 'capacity_used'; + $handler->display->display_options['fields']['capacity_used']['relationship'] = 'registration_related_node'; + $handler->display->display_options['fields']['capacity_used']['label'] = ''; + $handler->display->display_options['fields']['capacity_used']['exclude'] = TRUE; + /* Field: Registration Settings: Registration Status */ + $handler->display->display_options['fields']['registration_status']['id'] = 'registration_status'; + $handler->display->display_options['fields']['registration_status']['table'] = 'node'; + $handler->display->display_options['fields']['registration_status']['field'] = 'registration_status'; + $handler->display->display_options['fields']['registration_status']['relationship'] = 'registration_related_node'; + $handler->display->display_options['fields']['registration_status']['exclude'] = TRUE; + /* Field: Registration Settings: Total spaces */ + $handler->display->display_options['fields']['capacity_total']['id'] = 'capacity_total'; + $handler->display->display_options['fields']['capacity_total']['table'] = 'node'; + $handler->display->display_options['fields']['capacity_total']['field'] = 'capacity_total'; + $handler->display->display_options['fields']['capacity_total']['relationship'] = 'registration_related_node'; + $handler->display->display_options['fields']['capacity_total']['exclude'] = TRUE; + /* Contextual filter: Registration: Host entity ID */ + $handler->display->display_options['arguments']['entity_id']['id'] = 'entity_id'; + $handler->display->display_options['arguments']['entity_id']['table'] = 'registration'; + $handler->display->display_options['arguments']['entity_id']['field'] = 'entity_id'; + $handler->display->display_options['arguments']['entity_id']['default_action'] = 'not found'; + $handler->display->display_options['arguments']['entity_id']['title_enable'] = TRUE; + $handler->display->display_options['arguments']['entity_id']['title'] = '%1'; + $handler->display->display_options['arguments']['entity_id']['default_argument_type'] = 'fixed'; + $handler->display->display_options['arguments']['entity_id']['summary']['number_of_records'] = '0'; + $handler->display->display_options['arguments']['entity_id']['summary']['format'] = 'default_summary'; + $handler->display->display_options['arguments']['entity_id']['summary_options']['items_per_page'] = '25'; + $handler->display->display_options['arguments']['entity_id']['specify_validation'] = TRUE; + $handler->display->display_options['arguments']['entity_id']['validate']['type'] = 'node'; + + /* Display: Page */ + $handler = $view->new_display('page', 'Page', 'page'); + $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; + $handler->display->display_options['path'] = 'node/%/registrations/list'; + $handler->display->display_options['menu']['type'] = 'default tab'; + $handler->display->display_options['menu']['title'] = 'Registrations'; + $handler->display->display_options['menu']['weight'] = '0'; + $handler->display->display_options['menu']['context'] = 0; + $handler->display->display_options['tab_options']['type'] = 'tab'; + $handler->display->display_options['tab_options']['title'] = 'Manage Registrations'; + $handler->display->display_options['tab_options']['weight'] = '0'; + $export['registrations'] = $view; + + return $export; +} diff --git a/modules/registration_views/registration_views.info b/modules/registration_views/registration_views.info index 13f8076..b65128f 100644 --- a/modules/registration_views/registration_views.info +++ b/modules/registration_views/registration_views.info @@ -12,6 +12,7 @@ files[] = includes/registration_handler_field_registration_link_edit.inc files[] = includes/registration_handler_field_registration_link_delete.inc ; Views: Registration Host Entity +files[] = includes/registration_plugin_access_administer_registrations.inc files[] = includes/registration_handler_relationship.inc files[] = includes/registration_handler_field_entity_capacity_used.inc files[] = includes/registration_handler_field_entity_capacity_total.inc diff --git a/modules/registration_views/registration_views.module b/modules/registration_views/registration_views.module index c3c5e0d..f724938 100644 --- a/modules/registration_views/registration_views.module +++ b/modules/registration_views/registration_views.module @@ -16,6 +16,24 @@ function registration_views_views_api() { } /** + * Implements hook_views_plugins(). + */ +function registration_views_views_plugins() { + $plugins = array( + 'access' => array( + 'administer_registrations' => array( + 'title' => t('Administer registrations'), + 'help' => t('Access will be granted to users with administer registrations access for a specified entity.'), + 'handler' => 'registration_plugin_access_administer_registrations', + 'uses options' => TRUE, + ), + ), + ); + + return $plugins; +} + +/** * Implements hook_views_data(). */ function registration_views_views_data() { @@ -264,6 +282,17 @@ function registration_views_views_data_alter(&$data) { ), ); + // Host entity: total slots. + $data[$info['base table']]['capacity_total'] = array( + 'real field' => $info['entity keys']['id'], + 'group' => t('Registration Settings'), + 'title' => t('Total spaces'), + 'help' => t('Maximum number of spaces available for this entity.'), + 'field' => array( + 'handler' => 'registration_handler_field_entity_capacity_total', + ), + ); + // Host entity: used slots. $data[$info['base table']]['capacity_used'] = array( 'real field' => $info['entity keys']['id'], diff --git a/registration.module b/registration.module index 75748b1..6d7accf 100644 --- a/registration.module +++ b/registration.module @@ -508,6 +508,15 @@ function registration_register_page_access($entity_type, $entity) { * @see registration_menu() */ function registration_administer_registrations_access($entity_type, $entity, $account = NULL) { + global $user; + + if (is_numeric($entity)) { + $entity = entity_object_load($entity, $entity_type); + } + if (!isset($account)) { + $account = $user; + } + $registration_type = registration_get_entity_registration_type($entity_type, $entity); if ($registration_type) { if (user_access("administer $registration_type registration", $account)) {