547e81e87b4c304424d66d04780543772468c8c4 includes/registration.field.inc | 48 ++++++++++ includes/registration.forms.inc | 193 ++++++++++++++++++++++++++++++++++++++-- registration.install | 28 +++++- registration.module | 2 +- 4 files changed, 261 insertions(+), 10 deletions(-) diff --git a/includes/registration.field.inc b/includes/registration.field.inc index 11b99b2..8efd70b 100644 --- a/includes/registration.field.inc +++ b/includes/registration.field.inc @@ -18,14 +18,24 @@ function registration_field_info() { 'default_registration_settings' => array( 'status' => 0, 'capacity' => 0, + 'event' => array( + 'event_date_type' => NULL, + 'event_date_field' => NULL, + 'event_date' => NULL, + ), 'scheduling' => array( + 'scheduling_type' => NULL, 'open' => NULL, 'close' => NULL, + 'open_relative' => NULL, + 'close_relative' => NULL, ), 'reminder' => array( 'send_reminder' => 0, 'reminder_settings' => array( + 'reminder_type' => NULL, 'reminder_date' => NULL, + 'reminder_date_relative' => NULL, 'reminder_template' => NULL, ), ), @@ -83,6 +93,44 @@ function registration_field_instance_settings_form($field, $instance) { unset($settings_form['save']); $form['default_registration_settings'] += $settings_form; + // List all parent entity fields suitable for being a relative date. + $parent_field_options = array(NULL => t("- None -")); + if (module_exists('date')) { + $fields = field_info_fields(); + foreach ($fields as $field_name => $f) { + // Get field/bundle info. + $date_field_instance = field_info_instance($instance['entity_type'], $field_name, $instance['bundle']); + if (empty($date_field_instance)) { + continue; + } + if (in_array($f['type'], array('date', 'datestamp', 'datetime'))) { + $parent_field_options[$f['field_name']] = $date_field_instance['label']; + } + } + + // Override form options so we do not show the field name. + $form['default_registration_settings']['event']['event_date_type']['#options'] = array( + 'inherit' => t('Inherit date from an entity field.'), + 'fixed' => t('Use a fixed date'), + ); + + // Add a date field selection option for field instance forms. + $form['default_registration_settings']['event']['event_date_field'] = array( + '#type' => "select", + '#title' => "Date field to use for relative dates", + '#options' => $parent_field_options, + '#default_value' => isset($default_settings['event_date_field']) ? $default_settings['event_date_field'] : 0, + '#description' => t('Choose a date field that will be used for the calculation of relative dates.'), + '#weight' => 0, + '#states' => array( + 'visible' => array('xor', + array(':input[name="event[event_date_type]"]' => array('value' => 'inherit')), + array(':input[name="instance[settings][default_registration_settings][event][event_date_type]"]' => array('value' => 'inherit')), + ), + ), + ); + } + $form['hide_register_tab'] = array( '#type' => 'checkbox', '#title' => t('Hide Register Tab'), diff --git a/includes/registration.forms.inc b/includes/registration.forms.inc index e6d6299..33cc2aa 100644 --- a/includes/registration.forms.inc +++ b/includes/registration.forms.inc @@ -526,6 +526,11 @@ function registration_registrations_broadcast_form_submit($form, &$form_state) { * @see hook_registration_entity_settings() */ function registration_entity_settings_form($form, &$form_state, $settings, $entity_type = NULL, $entity_id = NULL) { + // Convert the values we stored in the settings back to normal values. + foreach($settings['settings'] as $key => $value) { + $settings[$key] = $value; + } + if ($entity_id) { // We'll need this info when we submit the form: $form_state['entity'] = array( @@ -538,12 +543,20 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti if (module_exists('date_popup')) { $date_popup_installed = TRUE; } + // Define the date selection options. + $date_selection_options = array( + 'relative' => t('Relative'), + 'absolute' => t('Absolute'), + ); + $form['status'] = array( '#type' => 'checkbox', '#title' => t('Enable'), '#description' => t('Check to enable registrations.'), '#default_value' => isset($settings['status']) ? $settings['status'] : -1, + '#weight' => -1, ); + $form['capacity'] = array( '#type' => 'textfield', '#title' => t('Capacity'), @@ -554,6 +567,56 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti '#default_value' => isset($settings['capacity']) ? $settings['capacity'] : 0, ); + $form['event'] = array( + '#type' => 'fieldset', + '#title' => t('Event Date'), + '#collapsible' => TRUE, + '#collapsed' => FALSE, + '#tree' => TRUE, + ); + + $form['event']['event_date_type'] = array( + '#type' => 'radios', + '#title' => t('Date format'), + '#default_value' => isset($settings['event_date_type']) ? $settings['event_date_type'] : 'inherit', + '#options' => array( + 'inherit' => t("Inherit date from entity field '@field'.", array('@field' => isset($settings['event_date_field']) ? $settings['event_date_field'] : NULL)), + 'fixed' => t('Use a fixed date'), + ), + '#description' => t('Choose to load the date from an other entity field, or provide an absolute date.'), + ); + + $form['event']['event_date_field'] = array( + '#type' => 'value', + '#value' => isset($settings['event_date_field']) ? $settings['event_date_field'] : 'field_date', + ); + + $form['event']['event_date'] = array( + '#type' => 'textfield', + '#title' => t('Event Date'), + '#maxlength' => 25, + '#description' => t('Date of this registrations event. Format: %time. The date format is YYYY-MM-DD and %timezone is the time zone offset from UTC. Leave this blank removes relative date functionality.', array( + '%time' => !empty($settings['event_date']) ? date_format(date_create($settings['event_date']), 'Y-m-d H:i:s O') : format_date(time(), 'custom', 'Y-m-d H:i:s O'), + '%timezone' => !empty($settings['event_date']) ? date_format(date_create($settings['event_date']), 'O') : format_date(time(), 'custom', 'O'), + ) + ), + '#default_value' => !empty($settings['event_date']) ? $settings['event_date'] : '', + '#states' => array( + 'visible' => array('xor', + array(':input[name="event[event_date_type]"]' => array('value' => 'fixed')), + array(':input[name="instance[settings][default_registration_settings][event][event_date_type]"]' => array('value' => 'fixed')), + ), + ), + ); + if ($date_popup_installed) { + $form['event']['event_date']['#type'] = 'date_popup'; + $form['event']['event_date']['#date_format'] = 'Y-m-d H:i:s O'; + $form['event']['event_date']['#description'] = t('Date of this registrations event. (This uses the !timezone.)', array( + '!timezone' => l(t('site default time zone'), 'admin/config/regional/settings'), + )); + unset($form['event']['event_date']['#maxlength']); + } + $form['scheduling'] = array( '#type' => 'fieldset', '#title' => t('Scheduling'), @@ -561,7 +624,29 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti '#collapsed' => FALSE, '#tree' => TRUE, ); + + $form['scheduling']['scheduling_type'] = array( + '#type' => 'radios', + '#title' => t('Date format'), + '#default_value' => isset($settings['scheduling_type']) ? $settings['scheduling_type'] : 'relative', + '#options' => $date_selection_options, + '#description' => t('Choose to use a date relative to the event date, or an absolute date.'), + ); + $form['scheduling']['open_relative'] = array( + '#type' => 'textfield', + '#title' => t('Open Offset'), + '#maxlength' => 25, + '#description' => t('Open offset.'), + '#default_value' => !empty($settings['open_relative']) ? $settings['open_relative'] : '', + '#states' => array( + 'visible' => array('xor', + array(':input[name="scheduling[scheduling_type]"]' => array('value' => 'relative')), + array(':input[name="instance[settings][default_registration_settings][scheduling][scheduling_type]"]' => array('value' => 'relative')), + ), + ), + ); + $form['scheduling']['open'] = array( '#type' => 'textfield', '#title' => t('Open Date'), @@ -572,6 +657,12 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti ) ), '#default_value' => !empty($settings['open']) ? $settings['open'] : '', + '#states' => array( + 'visible' => array('xor', + array(':input[name="scheduling[scheduling_type]"]' => array('value' => 'absolute')), + array(':input[name="instance[settings][default_registration_settings][scheduling][scheduling_type]"]' => array('value' => 'absolute')), + ), + ), ); if ($date_popup_installed) { $form['scheduling']['open']['#type'] = 'date_popup'; @@ -582,6 +673,20 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti unset($form['scheduling']['open']['#maxlength']); } + $form['scheduling']['close_relative'] = array( + '#type' => 'textfield', + '#title' => t('Close Offset'), + '#maxlength' => 25, + '#description' => t('Close offset.'), + '#default_value' => !empty($settings['close_relative']) ? $settings['close_relative'] : '', + '#states' => array( + 'visible' => array('xor', + array(':input[name="scheduling[scheduling_type]"]' => array('value' => 'relative')), + array(':input[name="instance[settings][default_registration_settings][scheduling][scheduling_type]"]' => array('value' => 'relative')), + ), + ), + ); + $form['scheduling']['close'] = array( '#type' => 'textfield', '#title' => t('Close Date'), @@ -592,11 +697,17 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti ) ), '#default_value' => !empty($settings['close']) ? $settings['close'] : '', + '#states' => array( + 'visible' => array('xor', + array(':input[name="scheduling[scheduling_type]"]' => array('value' => 'absolute')), + array(':input[name="instance[settings][default_registration_settings][scheduling][scheduling_type]"]' => array('value' => 'absolute')), + ), + ), ); if ($date_popup_installed) { $form['scheduling']['close']['#type'] = 'date_popup'; $form['scheduling']['close']['#date_format'] = 'Y-m-d H:i:s O'; - $form['scheduling']['close']['#description'] = t('When to automatically close registrations.. (This uses the !timezone.)', array( + $form['scheduling']['close']['#description'] = t('When to automatically close registrations. (This uses the !timezone.)', array( '!timezone' => l(t('site default time zone'), 'admin/config/regional/settings'), )); unset($form['scheduling']['close']['#maxlength']); @@ -622,12 +733,35 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti '#title' => t('Settings'), '#collapsible' => FALSE, '#states' => array( - 'visible' => array( - ':input[name="send_reminder"]' => array('checked' => TRUE), + 'visible' => array('xor', + array(':input[name="reminder[send_reminder]"]' => array('checked' => TRUE)), + array(':input[name="instance[settings][default_registration_settings][reminder][send_reminder]"]' => array('checked' => TRUE)), ), ), ); + $form['reminder']['reminder_settings']['reminder_type'] = array( + '#type' => 'radios', + '#title' => t('Date format'), + '#default_value' => isset($settings['reminder_type']) ? $settings['reminder_type'] : 'relative', + '#options' => $date_selection_options, + '#description' => t('Choose to use a date relative to the event date, or an absolute date.'), + ); + + $form['reminder']['reminder_settings']['reminder_date_relative'] = array( + '#type' => 'textfield', + '#title' => t('Reminder Offset'), + '#maxlength' => 25, + '#description' => t('Reminder offset.'), + '#default_value' => !empty($settings['reminder_date_relative']) ? $settings['reminder_date_relative'] : '', + '#states' => array( + 'visible' => array('xor', + array(':input[name="reminder[reminder_settings][reminder_type]"]' => array('value' => 'relative')), + array(':input[name="instance[settings][default_registration_settings][reminder][reminder_settings][reminder_type]"]' => array('value' => 'relative')), + ), + ), + ); + $form['reminder']['reminder_settings']['reminder_date'] = array( '#type' => 'textfield', '#title' => t('Reminder Date'), @@ -638,6 +772,12 @@ function registration_entity_settings_form($form, &$form_state, $settings, $enti ) ), '#default_value' => !empty($settings['reminder_date']) ? $settings['reminder_date'] : '', + '#states' => array( + 'visible' => array('xor', + array(':input[name="reminder[reminder_settings][reminder_type]"]' => array('value' => 'absolute')), + array(':input[name="instance[settings][default_registration_settings][reminder][reminder_settings][reminder_type]"]' => array('value' => 'absolute')), + ), + ), ); if ($date_popup_installed) { $form['reminder']['reminder_settings']['reminder_date']['#type'] = 'date_popup'; @@ -833,7 +973,7 @@ function registration_entity_settings_form_validate($form, &$form_state) { function registration_entity_settings_form_submit($form, &$form_state) { $entity = $form_state['entity']; - $fields = registration_convert_form_settings($form_state['values']); + $fields = registration_convert_form_settings($form_state['values'], $entity); registration_update_entity_settings($entity['entity_type'], $entity['entity_id'], $fields); @@ -849,10 +989,22 @@ function registration_entity_settings_form_submit($form, &$form_state) { * * @return array */ -function registration_convert_form_settings($values) { +function registration_convert_form_settings($values, $entity_data) { + $entity = entity_load_single($entity_data['entity_type'], $entity_data['entity_id']); + + // Add additional settings for relative date processing to settings. + $values['settings']['event_date_type'] = isset($values['event']['event_date_type']) ? $values['event']['event_date_type'] : NULL; + $values['settings']['event_date_field'] = isset($values['event']['event_date_field']) ? $values['event']['event_date_field'] : NULL; + $values['settings']['scheduling_type'] = isset($values['scheduling']['scheduling_type']) ? $values['scheduling']['scheduling_type'] : NULL; + $values['settings']['open_relative'] = isset($values['scheduling']['open_relative']) ? $values['scheduling']['open_relative'] : NULL; + $values['settings']['close_relative'] = isset($values['scheduling']['close_relative']) ? $values['scheduling']['close_relative'] : NULL; + $values['settings']['reminder_type'] = isset($values['reminder']['reminder_settings']['reminder_type']) ? $values['reminder']['reminder_settings']['reminder_type'] : NULL; + $values['settings']['reminder_date_relative'] = isset($values['reminder']['reminder_settings']['reminder_date_relative']) ? $values['reminder']['reminder_settings']['reminder_date_relative'] : NULL; + $fields = array( 'status' => $values['status'], 'capacity' => $values['capacity'], + 'event_date' => isset($values['event']['event_date']) ? $values['event']['event_date'] : NULL, 'send_reminder' => isset($values['reminder']['send_reminder']) ? $values['reminder']['send_reminder'] : 0, 'reminder_date' => NULL, 'reminder_template' => isset($values['reminder']['reminder_settings']['reminder_template']) ? $values['reminder']['reminder_settings']['reminder_template'] : NULL, @@ -861,20 +1013,45 @@ function registration_convert_form_settings($values) { 'close' => NULL, ); + // Event Date: + if (!empty($values['event']['event_date']) && $values['event']['event_date_type'] == 'fixed') { + $event_date = strtotime($values['event']['event_date']); + $fields['event_date'] = date('Y-m-d H:i:s', $event_date); + } + elseif(!empty($values['event']['event_date_field']) && $values['event']['event_date_type'] == 'inherit') { + $field_name = $values['event']['event_date_field']; + $field_items = field_get_items($entity_data['entity_type'], $entity, $field_name); + $offset_date = new DateObject( + $field_items[0]['value'], + $field_items[0]['timezone_db'] + ); + $event_date = $offset_date->getTimestamp(); + $fields['event_date'] = date('Y-m-d H:i:s', $event_date); + } + // Reminder: Reminder Date: - if (!empty($values['reminder']['reminder_settings']['reminder_date'])) { + if (!empty($values['reminder']['reminder_settings']['reminder_date']) && $values['reminder']['reminder_settings']['reminder_type'] == 'absolute') { $fields['reminder_date'] = date('Y-m-d H:i:s', strtotime($values['reminder']['reminder_settings']['reminder_date'])); } + elseif(!empty($values['reminder']['reminder_settings']['reminder_date_relative']) && $values['reminder']['reminder_settings']['reminder_type'] == 'relative') { + $fields['reminder_date'] = date('Y-m-d H:i:s', strtotime($values['reminder']['reminder_settings']['reminder_date_relative'], $event_date)); + } // Scheduling: open date: - if (!empty($values['scheduling']['open'])) { + if (!empty($values['scheduling']['open']) && $values['scheduling']['scheduling_type'] == 'absolute') { $fields['open'] = date('Y-m-d H:i:s', strtotime($values['scheduling']['open'])); } + elseif(!empty($values['scheduling']['open_relative']) && $values['scheduling']['scheduling_type'] == 'relative') { + $fields['open'] = date('Y-m-d H:i:s', strtotime($values['scheduling']['open_relative'], $event_date)); + } // Scheduling: close date: - if (!empty($values['scheduling']['close'])) { + if (!empty($values['scheduling']['close']) && $values['scheduling']['scheduling_type'] == 'absolute') { $fields['close'] = date('Y-m-d H:i:s', strtotime($values['scheduling']['close'])); } + elseif(!empty($values['scheduling']['close_relative']) && $values['scheduling']['scheduling_type'] == 'relative') { + $fields['close'] = date('Y-m-d H:i:s', strtotime($values['scheduling']['close_relative'], $event_date)); + } return $fields; } diff --git a/registration.install b/registration.install index f987893..e555211 100644 --- a/registration.install +++ b/registration.install @@ -124,11 +124,20 @@ function registration_schema() { 'default' => 0, ), 'status' => array( - 'description' => 'Boolean indicating if registrations are open (1) or closed (0) for the given entity', + 'description' => 'Boolean indicating if registrations are open (1) or closed (0) for the given entity.', 'type' => 'int', 'not null' => TRUE, 'default' => 1, ), + 'event_date' => array( + 'description' => 'Date of the event of the registration (used for relative planning)', + 'type' => 'datetime', + 'mysql_type' => 'datetime', + 'pgsql_type' => 'timestamp', + 'sqlite_type' => 'varchar', + 'sqlsrv_type' => 'smalldatetime', + 'not null' => FALSE, + ), 'send_reminder' => array( 'description' => 'Boolean indicating whether reminder emails should be sent. This is set to 0 once the reminders are sent.', 'type' => 'int', @@ -682,3 +691,20 @@ function registration_update_7201(&$sandbox) { 'default' => 0, )); } + +/** + * Add the event date to a registration for relative planning. + */ +function registration_update_7202(&$sandbox) { + db_add_field('registration_entity', 'event_date', + array( + 'description' => 'Date of the event of the registration (used for relative planning)', + 'type' => 'datetime', + 'mysql_type' => 'datetime', + 'pgsql_type' => 'timestamp', + 'sqlite_type' => 'varchar', + 'sqlsrv_type' => 'smalldatetime', + 'not null' => FALSE, + ) + ); +} diff --git a/registration.module b/registration.module index 24aa16f..42e2642 100644 --- a/registration.module +++ b/registration.module @@ -850,7 +850,7 @@ function registration_entity_set_default_settings($entity_type, $entity) { )); foreach ($registration_instances as $instance) { if (isset($instance['settings']['default_registration_settings'])) { - $settings = registration_convert_form_settings($instance['settings']['default_registration_settings']); + $settings = registration_convert_form_settings($instance['settings']['default_registration_settings'], $entity); registration_update_entity_settings($entity_type, $entity_id, $settings); } }