/** * Convert the event recurrence meta into a human readable string * * @TODO: there's a great deal of duplication between this method and tribe_events_pro_admin.recurrence.update_rule_recurrence_text (events-recurrence.js) * let's consider generating once (by JS?) and saving the result for re-use instead * * @param array $rule * @param string $start_date * @param int $event_id * * @return string human readable string */ public static function recurrenceToText($rule, $start_date, $event_id) { $text = ''; $recurrence_strings = Tribe__Events__Pro__Recurrence__Strings::recurrence_strings(); $date_strings = self::date_strings(); $interval = 1; $is_custom = false; $same_time = true; $year_filtered = false; $rule['type'] = str_replace(' ', '-', strtolower($rule['type'])); $rule['end-type'] = str_replace(' ', '-', strtolower($rule['end-type'])); $formatted_end = _x('an unspecified date', 'An unspecified end date', 'tribe-events-calendar-pro'); if (!empty($rule['end'])) { $formatted_end = date(tribe_get_date_format(true), strtotime($rule['end'])); } // if the type is "none", then there's no rules to parse if ('none' === $rule['type']) { return; } // if there isn't an end date, then there isn't a recurrence set up if ('on' === $rule['end-type'] && empty($rule['end'])) { return; } if ('custom' === $rule['type']) { $is_custom = true; $same_time = false; if ('yes' === @$rule['custom'][Tribe__Events__Pro__Recurrence__Custom_Types::to_key($rule['custom']['type'])]['same-time']) { $same_time = true; } if ('Yearly' === $rule['custom']['type']) { $year_filtered = !empty($rule['custom']['year']['filter']); } } $start_date = strtotime(tribe_get_start_date($event_id, true, Tribe__Date_Utils::DBDATETIMEFORMAT)); $end_date = strtotime(tribe_get_end_date($event_id, true, Tribe__Date_Utils::DBDATETIMEFORMAT)); $num_days = floor(($end_date - $start_date) / DAY_IN_SECONDS); // make sure we always round hours UP to when dealing with decimal lengths more than 2. Example: 4.333333 would become 4.34 $num_hours = ceil((($end_date - $start_date) / HOUR_IN_SECONDS - $num_days * 24) * 100) / 100; if ($is_custom && 'custom' === $rule['type'] && !$same_time) { $formatted_start = date('Y-m-d', $start_date) . ' ' . $rule['custom']['start-time']['hour'] . ':' . $rule['custom']['start-time']['minute']; if (isset($rule['custom']['start-time']['meridian'])) { $formatted_start .= ' ' . $rule['custom']['start-time']['meridian']; } if (isset($rule['custom']['duration'])) { try { $end_date = new DateTime('@' . $start_date); $end_date->modify('+' . absint($rule['custom']['duration']['days']) . ' days'); $end_date->modify('+' . absint($rule['custom']['duration']['hours']) . ' hours'); $end_date->modify('+' . absint($rule['custom']['duration']['minutes']) . ' minutes'); $formatted_end = Tribe__View_Helpers::is_24hr_format() ? $end_date->format('Y-m-d H:i') : $end_date->format('Y-m-d g:i'); $end_date = $end_date->format('U'); } catch (Exception $e) { // $formatted_end will default to the "unspecified end date" text in this case } } $new_num_days = floor(($end_date - $start_date) / DAY_IN_SECONDS); // make sure we always round hours UP to when dealing with decimal lengths more than 2. Example: 4.333333 would become 4.34 $new_num_hours = ceil((($end_date - $start_date) / HOUR_IN_SECONDS - $new_num_days * 24) * 100) / 100; } $weekdays = array(); $months = array(); $month_number = null; $month_day = null; $month_day_description = null; if ($is_custom && 'Weekly' === $rule['custom']['type'] && !empty($rule['custom']['week']['day'])) { foreach ($rule['custom']['week']['day'] as $day) { $weekdays[] = $date_strings['weekdays'][$day - 1]; } if (!$weekdays) { $weekdays = $date_strings['day_placeholder']; } elseif (2 === count($weekdays)) { $weekdays = implode(" {$date_strings['collection_joiner']} ", $weekdays); } else { $weekdays = implode(', ', $weekdays); $weekdays = preg_replace('/(.*),/', '$1, ' . $date_strings['collection_joiner'], $weekdays); } } elseif ($is_custom && 'Monthly' === $rule['custom']['type'] && !empty($rule['custom']['month']['number']) && !empty($rule['custom']['month']['day'])) { $month_number = $rule['custom']['month']['number']; $month_day = $rule['custom']['month']['day']; } elseif ($is_custom && 'Yearly' === $rule['custom']['type'] && !empty($rule['custom']['year']['month-number']) && !empty($rule['custom']['year']['month-day'])) { $month_number = $rule['custom']['year']['month-number']; $month_day = $rule['custom']['year']['month-day']; if (!empty($rule['custom']['year']['month'])) { foreach ($rule['custom']['year']['month'] as $month) { $months[] = $date_strings['months'][$month - 1]; } } if (!$months) { $months = $date_strings['month_placeholder']; } elseif (2 === count($months)) { $months = implode(" {$date_strings['collection_joiner']} ", $months); } else { $months = implode(', ', $months); $months = preg_replace('/(.*),/', '$1, ' . $date_strings['collection_joiner'], $months); } } $key = $rule['type']; if ('custom' === $rule['type']) { $key .= "-{$rule['custom']['type']}-{$rule['end-type']}-" . ($same_time ? 'same' : 'diff') . '-time'; if ('monthly' === $rule['custom']['type'] && is_numeric($month_number)) { $key .= '-numeric'; } elseif ('yearly' === $rule['custom']['type'] && !$year_filtered) { $key .= '-unfiltered'; } } else { $key = "simple-{$key}"; $key .= "-{$rule['end-type']}"; } $key = strtolower($key); // if custom rules were set but the custom-specific data is missing, then revert to standard // rules (weekly, monthly, and yearly) if ($is_custom && 'Weekly' === $rule['custom']['type'] && !$weekdays) { $key = 'every-week-on'; } elseif ($is_custom && 'Monthly' === $rule['custom']['type'] && !$month_number && !$month_day) { $key = 'every-month-on'; } elseif ($is_custom && 'Yearly' === $rule['custom']['type'] && !$month_number && !$month_day) { $key = 'every-year-on'; } $text = $recurrence_strings[$key]; switch ($key) { case 'simple-every-day-on': case 'simple-every-week-on': case 'simple-every-month-on': case 'simple-every-year-on': $text = sprintf($text, $formatted_end); break; case 'every-day-on': case 'every-week-on': case 'every-month-on': case 'every-year-on': case 'every-day-never': case 'every-week-never': case 'every-month-never': case 'every-year-never': $text = sprintf($text, $num_days, $num_hours, $formatted_end); break; case 'every-day-after': case 'every-week-after': case 'every-month-after': case 'every-year-after': $text = sprintf($text, $num_days, $num_hours, $rule['end-count']); break; case 'custom-daily-on-same-time': case 'custom-daily-never-same-time': $text = sprintf($text, $interval, $num_days, $num_hours, $formatted_end); break; case 'custom-daily-after-same-time': $text = sprintf($text, $interval, $num_days, $num_hours, $rule['end-count']); break; case 'custom-daily-on-diff-time': case 'custom-daily-never-diff-time': $text = sprintf($text, $interval, $formatted_start, $new_num_days, $new_num_hours, $formatted_end); break; case 'custom-daily-after-diff-time': $text = sprintf($text, $interval, $formatted_start, $new_num_days, $new_num_hours, $rule['end-count']); break; case 'custom-weekly-on-same-time': case 'custom-weekly-never-same-time': $text = sprintf($text, $interval, $weekdays, $num_days, $num_hours, $formatted_end); break; case 'custom-weekly-after-same-time': $text = sprintf($text, $interval, $weekdays, $num_days, $num_hours, $rule['end-count']); break; case 'custom-weekly-on-diff-time': case 'custom-weekly-never-diff-time': $text = sprintf($text, $interval, $weekdays, $formatted_start, $new_num_days, $new_num_hours, $formatted_end); break; case 'custom-weekly-after-diff-time': $text = sprintf($text, $interval, $weekdays, $formatted_start, $new_num_days, $new_num_hours, $rule['end-count']); break; case 'custom-monthly-on-same-time-numeric': case 'custom-monthly-never-same-time-numeric': case 'custom-monthly-on-same-time': case 'custom-monthly-never-same-time': $text = sprintf($text, $interval, $month_day_description, $num_days, $num_hours, $formatted_end); break; case 'custom-monthly-after-same-time-numeric': case 'custom-monthly-after-same-time': $text = sprintf($text, $interval, $month_day_description, $num_days, $num_hours, $rule['end-count']); break; case 'custom-monthly-on-diff-time-numeric': case 'custom-monthly-never-diff-time-numeric': case 'custom-monthly-on-diff-time': case 'custom-monthly-never-diff-time': $text = sprintf($text, $interval, $month_day_description, $formatted_start, $new_num_days, $new_num_hours, $formatted_end); break; case 'custom-monthly-after-diff-time-numeric': case 'custom-monthly-after-diff-time': $text = sprintf($text, $interval, $month_day_description, $formatted_start, $new_num_days, $new_num_hours, $rule['end-count']); break; case 'custom-yearly-on-same-time-unfiltered': case 'custom-yearly-never-same-time-unfiltered': case 'custom-yearly-on-same-time': case 'custom-yearly-never-same-time': $text = sprintf($text, $interval, $months, $month_day_description, $num_days, $num_hours, $formatted_end); break; case 'custom-yearly-after-same-time-unfiltered': case 'custom-yearly-after-same-time': $text = sprintf($text, $interval, $months, $month_day_description, $num_days, $num_hours, $rule['end-count']); break; case 'custom-yearly-on-diff-time-unfiltered': case 'custom-yearly-never-diff-time-unfiltered': case 'custom-yearly-on-diff-time': case 'custom-yearly-never-diff-time': $text = sprintf($text, $interval, $months, $month_day_description, $formatted_start, $new_num_days, $new_num_hours, $formatted_end); break; case 'custom-yearly-after-diff-time-unfiltered': case 'custom-yearly-after-diff-time': $text = sprintf($text, $interval, $months, $month_day_description, $formatted_start, $new_num_days, $new_num_hours, $rule['end-count']); break; } return $text; }
</select> <select tabindex="<?php tribe_events_tab_index(); ?> " name="recurrence[<?php echo esc_attr($rule_type); ?> ][][custom][start-time][minute]" data-field="custom-start-time-minute"> {{#tribe_recurrence_select custom.[start-time].minute}} <?php echo $start_minute_options; ?> {{/tribe_recurrence_select}} </select> <?php if (!Tribe__View_Helpers::is_24hr_format()) { ?> <select tabindex="<?php tribe_events_tab_index(); ?> " name="recurrence[<?php echo esc_attr($rule_type); ?> ][][custom][start-time][meridian]" data-field="custom-start-time-meridian"> {{#tribe_recurrence_select custom.[start-time].meridian}} <?php echo $start_meridian_options; ?> {{/tribe_recurrence_select}} </select> <?php
tribe_events_tab_index(); ?> " id="StateProvinceText" name="venue[Province]" type='text' name='' size='25' value='<?php echo esc_attr($currentProvince); ?> ' /> <select class="chosen" tabindex="<?php tribe_events_tab_index(); ?> " id="StateProvinceSelect" name="venue[State]"> <option value=""><?php esc_html_e('Select a State:', 'the-events-calendar'); ?> </option> <?php foreach (Tribe__View_Helpers::loadStates() as $abbr => $fullname) { echo '<option value="' . esc_attr($abbr) . '"'; selected(($_VenueStateProvince != -1 ? $_VenueStateProvince : $currentState) == $abbr); echo '>' . esc_html($fullname) . '</option>'; } ?> </select> </td> </tr> <tr class="venue"> <td class='tribe-table-field-label'><?php esc_html_e('Postal Code:', 'the-events-calendar'); ?> </td> <td>
protected function set_end_date_time() { $this->vars['endMinuteOptions'] = Tribe__View_Helpers::getMinuteOptions($this->vars['_EventEndDate']); $this->vars['endHourOptions'] = Tribe__View_Helpers::getHourOptions($this->vars['_EventAllDay'] == 'yes' ? null : $this->vars['_EventEndDate']); $this->vars['endMeridianOptions'] = Tribe__View_Helpers::getMeridianOptions($this->vars['_EventEndDate']); $datepicker_format = Tribe__Date_Utils::datepicker_formats(tribe_get_option('datepickerFormat')); if ($this->vars['_EventEndDate']) { $end = Tribe__Date_Utils::date_only($this->vars['_EventEndDate'], false, $datepicker_format); } // If we don't have a valid end date, assume today's date $this->vars['EventEndDate'] = isset($end) && $end ? $end : date($datepicker_format); }
/** * Includes the tickets metabox inside the Event edit screen * * @param WP_Post $post */ public function do_meta_box($post) { $startMinuteOptions = Tribe__View_Helpers::getMinuteOptions(null); $endMinuteOptions = Tribe__View_Helpers::getMinuteOptions(null); $startHourOptions = Tribe__View_Helpers::getHourOptions(null, true); $endHourOptions = Tribe__View_Helpers::getHourOptions(null, false); $startMeridianOptions = Tribe__View_Helpers::getMeridianOptions(null, true); $endMeridianOptions = Tribe__View_Helpers::getMeridianOptions(null); $show_global_stock = Tribe__Tickets__Tickets::global_stock_available(); $tickets = Tribe__Tickets__Tickets::get_event_tickets($post->ID); $global_stock = new Tribe__Tickets__Global_Stock($post->ID); include $this->path . 'src/admin-views/meta-box.php'; }
<?php $organizers = Tribe__Events__Main::instance()->get_organizer_info(); $organizer_options = array(); if (is_array($organizers) && !empty($organizers)) { $organizer_options[0] = __('No Default', 'tribe-events-calendar-pro'); foreach ($organizers as $organizer) { $organizer_options[$organizer->ID] = $organizer->post_title; } } $venues = Tribe__Events__Main::instance()->get_venue_info(); $venue_options = array(); if (is_array($venues) && !empty($venues)) { $venue_options[0] = __('No Default', 'tribe-events-calendar-pro'); foreach ($venues as $venue) { $venue_options[$venue->ID] = $venue->post_title; } } $state_options = Tribe__View_Helpers::loadStates(); $state_options = array_merge(array('' => __('Select a State', 'tribe-events-calendar-pro')), $state_options); $country_options = Tribe__View_Helpers::constructCountries(); $defaultsTab = array('priority' => 30, 'fields' => array('info-start' => array('type' => 'html', 'html' => '<div id="modern-tribe-info">'), 'info-box-title' => array('type' => 'html', 'html' => '<h2>' . __('Default Content', 'tribe-events-calendar-pro') . '</h2>'), 'info-box-description' => array('type' => 'html', 'html' => '<p>' . __('<p>Choose the default venue & organizer. Set default address information to save time when entering a new venue or organizer.</p><p>You can override these settings as you enter a new event.</p>', 'tribe-events-calendar-pro') . '</p>'), 'info-end' => array('type' => 'html', 'html' => '</div>'), 'tribe-form-content-start' => array('type' => 'html', 'html' => '<div class="tribe-settings-form-wrap">'), 'eventsDefaultOrganizerHelperTitle' => array('type' => 'html', 'html' => '<h3>' . __('Organizer', 'tribe-events-calendar-pro') . '</h3>'), 'eventsDefaultOrganizerID' => array('type' => 'dropdown_chosen', 'label' => __('Default organizer', 'tribe-events-calendar-pro'), 'default' => false, 'validation_type' => 'options', 'options' => $organizer_options, 'if_empty' => __('No saved organizers yet.', 'tribe-events-calendar-pro'), 'can_be_empty' => true), 'current-default-organizer' => array('type' => 'html', 'display_callback' => 'tribe_display_saved_organizer'), 'eventsDefaultVenueHelperTitle' => array('type' => 'html', 'html' => '<h3>' . __('Venue', 'tribe-events-calendar-pro') . '</h3>'), 'eventsDefaultVenueID' => array('type' => 'dropdown_chosen', 'label' => __('Default venue', 'tribe-events-calendar-pro'), 'default' => false, 'validation_type' => 'options', 'options' => $venue_options, 'if_empty' => __('No saved venues yet.', 'tribe-events-calendar-pro'), 'can_be_empty' => true), 'current-default-venue' => array('type' => 'html', 'display_callback' => 'tribe_display_saved_venue'), 'eventsDefaultAddressHelperTitle' => array('type' => 'html', 'html' => '<h3>' . __('Address', 'tribe-events-calendar-pro') . '</h3>'), 'eventsDefaultAddressHelperText' => array('type' => 'html', 'html' => '<p class="description">' . __('You can use this setting to set specific, individual defaults for any new Venue you create (these will not be used for your default venue).', 'tribe-events-calendar-pro') . '</p>'), 'eventsDefaultAddress' => array('type' => 'text', 'label' => __('Default address', 'tribe-events-calendar-pro'), 'default' => false, 'class' => 'venue-default-info', 'validation_type' => 'address', 'can_be_empty' => true), 'current-default-address' => array('type' => 'html', 'class' => 'venue-default-info', 'display_callback' => 'tribe_display_saved_address'), 'eventsDefaultCity' => array('type' => 'text', 'label' => __('Default city', 'tribe-events-calendar-pro'), 'default' => false, 'class' => 'venue-default-info', 'validation_type' => 'city_or_province', 'can_be_empty' => true), 'current-default-city' => array('type' => 'html', 'class' => 'venue-default-info', 'display_callback' => 'tribe_display_saved_city'), 'eventsDefaultState' => array('type' => 'dropdown_chosen', 'label' => __('Default state', 'tribe-events-calendar-pro'), 'default' => false, 'class' => 'venue-default-info', 'validation_type' => 'options', 'options' => $state_options, 'can_be_empty' => true), 'current-default-state' => array('type' => 'html', 'display_callback' => 'tribe_display_saved_state'), 'eventsDefaultProvince' => array('type' => 'text', 'label' => __('Default province', 'tribe-events-calendar-pro'), 'default' => false, 'class' => 'venue-default-info', 'validation_type' => 'city_or_province', 'can_be_empty' => true), 'current-default-province' => array('type' => 'html', 'class' => 'venue-default-info', 'display_callback' => 'tribe_display_saved_province'), 'eventsDefaultZip' => array('type' => 'text', 'label' => __('Default postal code/zip code', 'tribe-events-calendar-pro'), 'default' => false, 'class' => 'venue-default-info', 'validation_type' => 'address', 'can_be_empty' => true), 'current-default-zip' => array('type' => 'html', 'class' => 'venue-default-info', 'display_callback' => 'tribe_display_saved_zip'), 'defaultCountry' => array('type' => 'dropdown_chosen', 'label' => __('Default country', 'tribe-events-calendar-pro'), 'default' => false, 'class' => 'venue-default-info', 'validation_type' => 'options_with_label', 'options' => $country_options, 'can_be_empty' => true), 'current-default-country' => array('type' => 'html', 'display_callback' => 'tribe_display_saved_country'), 'eventsDefaultPhone' => array('type' => 'text', 'label' => __('Default phone', 'tribe-events-calendar-pro'), 'default' => false, 'class' => 'venue-default-info', 'validation_type' => 'phone', 'can_be_empty' => true), 'current-default-phone' => array('type' => 'html', 'class' => 'venue-default-info', 'display_callback' => 'tribe_display_saved_phone'), 'tribeEventsCountries' => array('type' => 'textarea', 'label' => __('Use a custom list of countries', 'tribe-events-calendar-pro'), 'default' => false, 'validation_type' => 'country_list', 'tooltip' => __('One country per line in the following format: <br>US, United States <br> UK, United Kingdom. <br> (Replaces the default list.)', 'tribe-events-calendar-pro'), 'can_be_empty' => true), 'tribe-form-content-end' => array('type' => 'html', 'html' => '</div>'))); /** * @todo remove in 4.3 * @deprecated */ if (apply_filters('tribe_enable_default_value_replace_checkbox', false)) { _deprecated_function("'defaultValueReplace checkbox'", '4.0', 'Built-in WordPress postmeta filters'); $defaultsTab['fields'] = Tribe__Main::array_insert_before_key('eventsDefaultOrganizerHelperTitle', $defaultsTab['fields'], array('eventsDefaultOptionsHelperTitle' => array('type' => 'html', 'html' => '<h3>' . esc_html__('Options', 'tribe-events-calendar-pro') . '</h3>'), 'defaultValueReplace' => array('type' => 'checkbox_bool', 'label' => esc_html__('If fields are left empty when they\'re submitted, automatically fill them in with these values.', 'tribe-events-calendar-pro'), 'default' => false, 'validation_type' => 'boolean'))); }
<?php $start_hour_options = Tribe__View_Helpers::getHourOptions(null, true); $start_minute_options = Tribe__View_Helpers::getMinuteOptions(null, true); $start_meridian_options = Tribe__View_Helpers::getMeridianOptions(null, true); ?> <tr class="recurrence-row"> <td class="recurrence-rules-header"><?php esc_html_e('Recurrence Rules:', 'tribe-events-calendar-pro'); ?> </td> <td> <div id="tribe-recurrence-staging"></div> <script type="text/x-handlebars-template" id="tmpl-tribe-recurrence"> <div class="tribe-event-recurrence tribe-event-recurrence-rule"> <div class="tribe-handle" title="Click to toggle"></div> <input type="hidden" name="is_recurring[]" data-field="is_recurring" value="{{#if is_recurring}}true{{else}}false{{/if}}"/> <select name="recurrence[rules][][type]" data-field="type" data-single="<?php esc_attr_e('event', 'tribe-events-calendar-pro'); ?> " data-plural="<?php esc_attr_e('events', 'tribe-events-calendar-pro'); ?> "> {{#tribe_recurrence_select type}} <option value="None"><?php esc_html_e('Once', 'tribe-events-calendar-pro'); ?> </option> <option value="Every Day"><?php esc_html_e('Every Day', 'tribe-events-calendar-pro');
/** * Gets the full region name of a given event's Venue address. * * @param int $event_id * * @return string The full region for this event's address. */ function tribe_get_full_region($event_id) { $province = tribe_get_event_meta($event_id, '_VenueStateProvince', true); $states = Tribe__View_Helpers::loadStates(); $full_region = isset($states[$province]) ? $states[$province] : $province; return apply_filters('tribe_get_full_region', $full_region); }
/** * Includes the tickets metabox inside the Event edit screen * * @param $post_id */ public function do_meta_box($post_id) { $startMinuteOptions = Tribe__View_Helpers::getMinuteOptions(null); $endMinuteOptions = Tribe__View_Helpers::getMinuteOptions(null); $startHourOptions = Tribe__View_Helpers::getHourOptions(null, true); $endHourOptions = Tribe__View_Helpers::getHourOptions(null, false); $startMeridianOptions = Tribe__View_Helpers::getMeridianOptions(null, true); $endMeridianOptions = Tribe__View_Helpers::getMeridianOptions(null); $tickets = Tribe__Tickets__Tickets::get_event_tickets($post_id); include $this->path . 'src/admin-views/meta-box.php'; }