123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- <?php
- /*
- * @file
- * Handling of devel generate functionality for repeating dates.
- */
- /**
- * Implements hook_date_field_insert().
- *
- * A substitute for hook_devel_generate to handle repeating dates.
- */
- function date_repeat_field_date_field_insert(&$items, $context) {
- $entity_type = $context['entity_type'];
- $entity = $context['entity'];
- $field = $context['field'];
- $instance = $context['instance'];
- $langcode = $context['langcode'];
- // The first value was already created by the regular Devel Generate code.
- // Skipping doing anything if there is no value for this field.
- if (empty($items)) {
- return;
- }
- $item = $items[0];
- // Unset any previous dates past the first one.
- $count = count($items);
- for ($i = 1; $i < $count; $i++) {
- unset($items[$i]);
- }
- // Compute repeating date values.
- module_load_include('inc', 'date_repeat', 'date_repeat_calc');
- module_load_include('inc', 'date_api', 'date_api_ical');
- $increment = $instance['widget']['settings']['increment'];
- $timezone = date_get_timezone($field['settings']['tz_handling'], $item['timezone']);
- $timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
- switch ($field['type']) {
- case 'date':
- $format = DATE_FORMAT_ISO;
- break;
- case 'datestamp':
- $format = DATE_FORMAT_UNIX;
- break;
- case 'datetime':
- $format = DATE_FORMAT_DATETIME;
- break;
- }
- $start = new dateObject($item['value'], $timezone_db, $format);
- $start2 = new dateObject($item['value2'], $timezone_db, $format);
- // Create a repeating date rule.
- $duration = $start->difference($start2);
- $form_values = array();
- // Create the default case more frequently than case 1 or 2.
- $which = mt_rand(0, 10);
- $max_items = mt_rand(3, 10);
- $intervals = array_keys(date_repeat_interval_options());
- unset($intervals[0]);
- $interval = $intervals[mt_rand(1, 3)];
- switch ($which) {
- case 1:
- $mo = mt_rand(1, 28);
- $options = array('YEARLY', 'MONTHLY');
- $freq = date_content_generate_key($options);
- $freq = $options[$freq];
- $form_values['FREQ'] = $freq;
- // Make sure we'll find a match in our range.
- if ($freq == 'YEARLY') {
- $interval = 1;
- }
- $form_values['BYMONTHDAY'] = array($mo);
- break;
- case 2:
- $mo = mt_rand(1, 12);
- $options = array('YEARLY', 'MONTHLY');
- $freq = date_content_generate_key($options);
- $freq = $options[$freq];
- $form_values['FREQ'] = $freq;
- // Make sure we'll find a match in our range.
- if ($freq == 'YEARLY') {
- $interval = 1;
- }
- $form_values['BYMONTH'] = array($mo);
- break;
- default:
- $dows = array_keys(date_content_repeat_dow_options());
- $day = date_content_generate_key($dows);
- $dow = $dows[$day];
- $options = array('MONTHLY', 'DAILY', 'WEEKLY');
- $freq = date_content_generate_key($options);
- $freq = $options[$freq];
- $form_values['FREQ'] = $freq;
- $form_values['BYDAY'] = array($dow);
- break;
- }
- $form_values['INTERVAL'] = $interval;
- switch ($freq) {
- case 'YEARLY':
- $period = 'year';
- break;
- case 'MONTHLY':
- $period = 'month';
- break;
- case 'WEEKLY':
- $period = 'week';
- break;
- default:
- $period = 'day';
- break;
- }
- $form_values['UNTIL'] = array();
- $form_values['COUNT'] = $max_items;
- $rrule = date_api_ical_build_rrule($form_values);
- $items[0]['rrule'] = $rrule;
- $values = date_repeat_build_dates($rrule, $form_values, $field, $item);
- $items += $values;
- }
- function date_content_generate_key($array) {
- $keys = array_keys($array);
- $min = array_shift($keys);
- $max = array_pop($keys);
- return mt_rand($min, $max);
- }
- /**
- * Helper function for BYDAY options.
- *
- * Creates options like -1SU and 2TU
- * Omit options that won't find many matches, like 5th Sunday.
- */
- function date_content_repeat_dow_options() {
- $options = array();
- foreach (date_repeat_dow_count_options() as $count_key => $count_value) {
- foreach (date_repeat_dow_day_options() as $dow_key => $dow_value) {
- if ($count_key != 5 && $count_key != -5) {
- $options[$count_key . $dow_key] = $count_value . ' ' . $dow_value;
- }
- }
- }
- return $options;
- }
|