/** * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). * * The widget builds out a complex date element in the following way: * * - A field is pulled out of the database which is comprised of one or * more collections of start/end dates. * * - The dates in this field are all converted from the UTC values stored * in the database back to the local time. This is done in #process * to avoid making this change to dates that are not being processed, * like those hidden with #access. * * - If values are empty, the field settings rules are used to determine * if the default_values should be empty, now, the same, or use strtotime. * * - Each start/end combination is created using the date_combo element type * defined by the date module. If the timezone is date-specific, a * timezone selector is added to the first combo element. * * - The date combo element creates two individual date elements, one each * for the start and end field, using the appropriate individual Date API * date elements, like selects, textfields, or popups. * * - In the individual element validation, the data supplied by the user is * used to update the individual date values. * * - In the combo date validation, the timezone is updated, if necessary, * then the user input date values are used with that timezone to create * date objects, which are used update combo date timezone and offset values. * * - In the field's submission processing, the new date values, which are in * the local timezone, are converted back to their UTC values and stored. * */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $field = $this->field; $instance = $this->instance; $field_name = $field['field_name']; $entity_type = $instance['entity_type']; module_load_include('inc', 'date_api', 'date_api_elements'); $timezone = date_get_timezone($field['settings']['tz_handling'], isset($items[0]['timezone']) ? $items[0]['timezone'] : drupal_get_user_timezone()); $element += array('#weight' => $delta, '#default_value' => isset($items[$delta]) ? $items[$delta] : '', '#date_timezone' => $timezone, '#element_validate' => array('date_combo_validate'), '#required' => $element['#required'], '#date_items' => isset($items[$delta]) ? $items[$delta] : ''); $element['#title'] = $instance['label']; if ($field['settings']['tz_handling'] == 'date') { $element['timezone'] = array('#type' => 'date_timezone', '#theme_wrappers' => array('date_timezone'), '#delta' => $delta, '#default_value' => $timezone, '#weight' => $instance['widget']['weight'] + 1, '#attributes' => array('class' => array('date-no-float')), '#date_label_position' => $instance['widget']['settings']['label_position']); } return $element; }
/** * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). * * The widget builds out a complex date element in the following way: * * - A field is pulled out of the database which is comprised of one or * more collections of start/end dates. * * - The dates in this field are all converted from the UTC values stored * in the database back to the local time. This is done in #process * to avoid making this change to dates that are not being processed, * like those hidden with #access. * * - If values are empty, the field settings rules are used to determine * if the default_values should be empty, now, the same, or use strtotime. * * - Each start/end combination is created using the date_combo element type * defined by the date module. If the timezone is date-specific, a * timezone selector is added to the first combo element. * * - The date combo element creates two individual date elements, one each * for the start and end field, using the appropriate individual Date API * date elements, like selects, textfields, or popups. * * - In the individual element validation, the data supplied by the user is * used to update the individual date values. * * - In the combo date validation, the timezone is updated, if necessary, * then the user input date values are used with that timezone to create * date objects, which are used update combo date timezone and offset values. * * - In the field's submission processing, the new date values, which are in * the local timezone, are converted back to their UTC values and stored. * */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $field = $this->field; $instance = $this->instance; $field_name = $field['field_name']; $entity_type = $instance['entity_type']; // If this is a new entity, populate the field with the right default values. // This happens early so even fields later hidden with #access get those values. // We should only add default values to new entities, to avoid over-writing // a value that has already been set. This means we can't just check to see // if $items is empty, because it might have been set that way on purpose. // @see date_field_widget_properties_alter() where we flagged if this is a new entity. // We check !isset($items[$delta]['value']) because entity translation may create // a new translation entity for an existing entity and we don't want to clobber // values that were already set in that case. // @see http://drupal.org/node/1478848. $is_default = TRUE; $info = entity_get_info($entity_type); $id = $info['entity keys']['id']; if (!empty($form->{$id}) && !empty($form->{$id}['#value'])) { $is_default = FALSE; } // @TODO Repeating dates should probably be made into their own field type and completely separated out. // That will have to wait for a new branch since it may break other things, including other modules // that have an expectation of what the date field types are. // Since repeating dates cannot use the default Add more button, we have to handle our own behaviors here. // Return only the first multiple value for repeating dates, then clean up the 'Add more' bits in #after_build. // The repeating values will be re-generated when the repeat widget form is validated. // At this point we can't tell if this form element is going to be hidden by #access, and we're going to // lose all but the first value by doing this, so store the original values in case we need to replace them later. if (!empty($field['settings']['repeat'])) { if ($delta == 0) { $form['#after_build'] = array('date_repeat_after_build'); $form_state['storage']['repeat_fields'][$field_name] = array_merge($form['#parents'], array($field_name)); $form_state['storage']['date_items'][$field_name][$langcode] = $items; } else { return; } } module_load_include('inc', 'date_api', 'date_api_elements'); $timezone = date_get_timezone($field['settings']['tz_handling'], isset($items[0]['timezone']) ? $items[0]['timezone'] : drupal_get_user_timezone()); // TODO see if there's a way to keep the timezone element from ever being // nested as array('timezone' => 'timezone' => value)). After struggling // with this a while, I can find no way to get it displayed in the form // correctly and get it to use the timezone element without ending up // with nesting. if (is_array($timezone)) { $timezone = $timezone['timezone']; } $element += array('#type' => 'date_combo', '#theme_wrappers' => array('date_combo'), '#weight' => $delta, '#default_value' => isset($items[$delta]) ? $items[$delta] : '', '#date_timezone' => $timezone, '#element_validate' => array('date_combo_validate'), '#date_is_default' => $is_default, '#date_items' => isset($items[$delta]) ? $items[$delta] : ''); $element['#title'] = $instance['label']; if ($field['settings']['tz_handling'] == 'date') { $element['timezone'] = array('#type' => 'date_timezone', '#theme_wrappers' => array('date_timezone'), '#delta' => $delta, '#default_value' => $timezone, '#weight' => $instance['widget']['weight'] + 1, '#attributes' => array('class' => array('date-no-float')), '#date_label_position' => $instance['widget']['settings']['label_position']); } return $element; }
?> </div> <!-- /committee-updates-description --> <div class="committee-updates-right-infobox"> <div class="field field-type-date field-field-date"> <div class="field-items"> <div class="field-item"> <label><?php print t('Meeting Schedule'); ?> :</label> <?php $from_date = date_make_date($node->field_date[0]['value'], 'UTC'); date_timezone_set($from_date, timezone_open(date_get_timezone('site'))); // Fix timezone $to_date = date_make_date($node->field_date[0]['value2'], 'UTC'); date_timezone_set($to_date, timezone_open(date_get_timezone('site'))); // Fix timezone $from_date_string = date_format_date($from_date, 'custom', 'F j'); $from_time_string = date_format_date($from_date, 'custom', 'g:i A'); $to_date_string = date_format_date($to_date, 'custom', 'F j'); $to_time_string = date_format_date($to_date, 'custom', 'g:i A'); if ($from_date_string == $to_date_string) { print '<span class="date-display-start">' . "{$from_date_string}, {$from_time_string}" . '</span><span class="date-display-separator"> - </span><span class="date-display-end">' . $to_time_string . '</span>'; } else { print '<span class="date-display-start">' . "{$from_date_string}, {$from_time_string}" . '</span><span class="date-display-separator"> - </span><span class="date-display-end">' . "{$to_date_string}, {$to_time_string}" . '</span>'; } ?> <br /> <?php print l(t('Read more...'), 'node/' . $node->nid); ?>
/** * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). * * The widget builds out a complex date element in the following way: * * - A field is pulled out of the database which is comprised of one or * more collections of start/end dates. * * - The dates in this field are all converted from the UTC values stored * in the database back to the local time. This is done in #process * to avoid making this change to dates that are not being processed, * like those hidden with #access. * * - If values are empty, the field settings rules are used to determine * if the default_values should be empty, now, the same, or use strtotime. * * - Each start/end combination is created using the date_combo element type * defined by the date module. If the timezone is date-specific, a * timezone selector is added to the first combo element. * * - The date combo element creates two individual date elements, one each * for the start and end field, using the appropriate individual Date API * date elements, like selects, textfields, or popups. * * - In the individual element validation, the data supplied by the user is * used to update the individual date values. * * - In the combo date validation, the timezone is updated, if necessary, * then the user input date values are used with that timezone to create * date objects, which are used update combo date timezone and offset values. * * - In the field's submission processing, the new date values, which are in * the local timezone, are converted back to their UTC values and stored. * */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $field = $this->field; $instance = $this->instance; $field_name = $field['field_name']; $entity_type = $instance['entity_type']; // @TODO Repeating dates should probably be made into their own field type and completely separated out. // That will have to wait for a new branch since it may break other things, including other modules // that have an expectation of what the date field types are. // Since repeating dates cannot use the default Add more button, we have to handle our own behaviors here. // Return only the first multiple value for repeating dates, then clean up the 'Add more' bits in #after_build. // The repeating values will be re-generated when the repeat widget form is validated. // At this point we can't tell if this form element is going to be hidden by #access, and we're going to // lose all but the first value by doing this, so store the original values in case we need to replace them later. if (!empty($field['settings']['repeat'])) { if ($delta == 0) { $form['#after_build'] = array('date_repeat_after_build'); $form_state['storage']['repeat_fields'][$field_name] = array_merge($form['#parents'], array($field_name)); $form_state['storage']['date_items'][$field_name][$langcode] = $items; } else { return; } } module_load_include('inc', 'date_api', 'date_api_elements'); $timezone = date_get_timezone($field['settings']['tz_handling'], isset($items[0]['timezone']) ? $items[0]['timezone'] : drupal_get_user_timezone()); // TODO see if there's a way to keep the timezone element from ever being // nested as array('timezone' => 'timezone' => value)). After struggling // with this a while, I can find no way to get it displayed in the form // correctly and get it to use the timezone element without ending up // with nesting. if (is_array($timezone)) { $timezone = $timezone['timezone']; } $element += array('#weight' => $delta, '#default_value' => isset($items[$delta]) ? $items[$delta] : '', '#date_timezone' => $timezone, '#element_validate' => array('date_combo_validate'), '#date_is_default' => $is_default, '#date_increment' => $this->getSetting('increment'), '#date_year_range' => $this->getSetting('year_range'), '#required' => $element['#required'], '#date_items' => isset($items[$delta]) ? $items[$delta] : ''); $element['#title'] = $instance['label']; if ($field['settings']['tz_handling'] == 'date') { $element['timezone'] = array('#type' => 'date_timezone', '#theme_wrappers' => array('date_timezone'), '#delta' => $delta, '#default_value' => $timezone, '#weight' => $instance['widget']['weight'] + 1, '#attributes' => array('class' => array('date-no-float')), '#date_label_position' => $instance['widget']['settings']['label_position']); } return $element; }