/**
  * 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;
 }
Example #2
0
 /**
  * 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);
    ?>
Example #4
0
 /**
  * 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;
 }