You are here

function availability_calendar_booking_formlet_form_inc in Availability Calendars 7.5

Callback for drupal_get_form() to create the booking formlet view.

drupal_get_form() is called by hook_field_formatter_view (in our case: availability_calendar_booking_formlet_field_formatter_view).

Parameters

string $form_id:

array $form_state:

Return value

array

1 call to availability_calendar_booking_formlet_form_inc()
availability_calendar_booking_formlet_form in booking_formlet/availability_calendar_booking_formlet.module
Callback for drupal_get_form() to create the booking formlet view.

File

booking_formlet/availability_calendar_booking_formlet.inc, line 451
General helper methods for Availability Calendar Booking formlet to make the .module file smaller:

Code

function availability_calendar_booking_formlet_form_inc($form_id, $form_state) {
  static $formlet_count = 0;
  $formlet_count++;
  $entity_type = $form_state['build_info']['args'][0];
  $entity = $form_state['build_info']['args'][1];
  $entity_id = entity_extract_ids($entity_type, $entity);
  $entity_id = $entity_id[0];
  $entity_label = entity_label($entity_type, $entity);
  $settings = $form_state['build_info']['args'][2];
  $cids = $form_state['build_info']['args'][3];
  $calendar = $form_state['build_info']['args'][4];
  $calendar_settings = $form_state['build_info']['args'][5];

  /** @var DateTime */
  $from = $form_state['build_info']['args'][6];

  /** @var DateTime */
  $to = $form_state['build_info']['args'][7];

  /** @var integer */
  $duration = 0;
  if ($from instanceof DateTime && $to instanceof DateTime) {

    //PHP5.3: use getTimestamp() and/or diff().
    $timestamp_from = (int) $from
      ->format('U');
    $timestamp_to = (int) $to
      ->format('U');

    // To is inclusive, so add 1 day to the difference.
    $duration = (int) round(($timestamp_to - $timestamp_from) / (60 * 60 * 24)) + 1;
  }
  $form = array();
  $form['#id'] = "availability-calendar-booking-formlet-form-{$formlet_count}";
  $form['cid'] = array(
    '#type' => 'hidden',
    '#value' => $calendar !== NULL ? $calendar['cid'] : '',
  );
  $form['calendar_label'] = array(
    '#type' => 'hidden',
    '#value' => $calendar !== NULL ? $calendar['name'] : '',
  );
  $form['entity_type'] = array(
    '#type' => 'hidden',
    '#value' => $entity_type,
  );
  $form['entity_id'] = array(
    '#type' => 'hidden',
    '#value' => $entity_id,
  );
  $form['entity_label'] = array(
    '#type' => 'hidden',
    '#value' => $entity_label,
  );
  $form['from_iso'] = array(
    '#type' => 'hidden',
    '#value' => !empty($from) ? $from
      ->format(AC_ISODATE) : '',
  );
  $form['to_iso'] = array(
    '#type' => 'hidden',
    '#value' => !empty($to) ? $to
      ->format(AC_ISODATE) : '',
  );
  $form['duration'] = array(
    '#type' => 'hidden',
    '#value' => $duration,
  );
  if ($settings['submit_only']) {
    $form['from_display'] = array(
      '#type' => 'hidden',
      '#value' => $from instanceof DateTime ? availability_calendar_format_display_date($from) : '',
    );
    $form['to_display'] = array(
      '#type' => 'hidden',
      '#value' => $to instanceof DateTime ? availability_calendar_format_display_date($to) : '',
    );
  }
  else {
    $title = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_date_1');
    $button_text = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_clear_date_1_text');
    $button_title = availability_calendar_booking_formlet_get_customizable_title('availability_calendar_booking_formlet_clear_date_1_title');
    $form['from_display'] = array(
      '#type' => 'textfield',
      '#title' => $title,
      '#default_value' => $from instanceof DateTime ? availability_calendar_format_display_date($from) : '',
      '#required' => TRUE,
      '#disabled' => TRUE,
      '#attributes' => array(
        'readonly' => 'readonly',
      ),
      '#prefix' => '<div class="acbf-date">',
      '#suffix' => '<input class="acbf-reset-from form-reset"' . $button_title . ' type="reset" value="' . $button_text . '" /></div>',
    );
    if ($settings['single_day_only']) {
      $form['to_display'] = array(
        '#type' => 'hidden',
        '#value' => $to instanceof DateTime ? availability_calendar_format_display_date($to) : '',
      );
      $title = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_date');
      $button_text = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_clear_date_text');
      $button_title = availability_calendar_booking_formlet_get_customizable_title('availability_calendar_booking_formlet_clear_date_title');
      $form['from_display']['#title'] = $title;
      $form['from_display']['#suffix'] = '<input class="acbf-reset-from form-reset"' . $button_title . ' type="reset" value="' . $button_text . '" /></div>';
    }
    else {
      $title = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_date_2');
      $button_text = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_clear_date_2_text');
      $button_title = availability_calendar_booking_formlet_get_customizable_title('availability_calendar_booking_formlet_clear_date_2_title');
      $form['to_display'] = array(
        '#type' => 'textfield',
        '#title' => $title,
        '#default_value' => $to instanceof DateTime ? availability_calendar_format_display_date($to) : '',
        '#required' => TRUE,
        '#disabled' => TRUE,
        '#attributes' => array(
          'readonly' => 'readonly',
        ),
        '#prefix' => '<div class="acbf-date">',
        '#suffix' => '<input class="acbf-reset-both form-reset"' . $button_title . ' type="reset" value="' . $button_text . '" /></div>',
      );

      // Display the duration if the settings indicate so.
      if (!empty($settings['display_duration'])) {
        $duration_display = '';
        switch ($settings['display_duration']) {
          case 'days':
            $duration_display = format_plural($duration, '1 day', '@count days');
            break;
          case 'nights':
            $duration_display = format_plural($duration, '1 night', '@count nights');
            break;
          case 'nights_and_days':
            $duration_display = format_plural($duration, '1 night', '@count nights');
            $duration_display .= ' / ';
            $duration_display .= format_plural($duration + 1, '1 day', '@count days');
            break;
        }
        $title = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_duration');
        $form['duration_display'] = array(
          '#type' => 'textfield',
          '#title' => $title,
          '#default_value' => $duration_display,
          '#required' => TRUE,
          '#disabled' => TRUE,
          '#attributes' => array(
            'readonly' => 'readonly',
          ),
          '#prefix' => '<div class="acbf-date">',
          '#suffix' => '</div>',
        );
      }
    }
  }

  // Add form submit button.
  $button_text = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_submit_text');
  $button_title = availability_calendar_booking_formlet_get_customizable_text('availability_calendar_booking_formlet_submit_title');
  $form['actions'] = array(
    '#type' => 'actions',
    'submit' => array(
      '#type' => 'submit',
      '#value' => $button_text,
      '#disabled' => TRUE,
    ),
  );
  if ($button_title != '') {
    $form['actions']['submit']['#attributes']['title'] = $button_title;
  }
  global $language;
  $post_url = '';
  if ($settings['define_per_language'] && isset($settings['post_url'][$language->language])) {
    $post_url = $settings['post_url'][$language->language];
  }
  else {
    if (isset($settings['post_url'][LANGUAGE_NONE])) {
      $post_url = $settings['post_url'][LANGUAGE_NONE];
    }
    else {
      if (is_array($settings['post_url'])) {
        $post_url = reset($settings['post_url']);
      }
    }
  }
  if (is_array($post_url)) {
    $post_url = reset($post_url);
  }
  $options = array();

  // Extract the fragment if any.
  if (strpos($post_url, '#') !== FALSE) {
    list($post_url, $options['fragment']) = explode('#', $post_url, 2);
  }
  $form['#action'] = url($post_url, $options);
  $form['#method'] = !empty($settings['use_get']) ? 'GET' : 'POST';

  // Add js and css.
  // If only the book now button is shown, the calendar might not be shown.
  // Make sure there is a javascript instance that represents the selected
  // calendar (and that can be queried by our javascript).
  if ($calendar !== NULL) {
    availability_calendar_add_calendar_js($calendar['cid'], $calendar_settings['allocation_type']);
  }
  availability_calendar_booking_formlet_add_js($form['#id'], $cids, $settings);
  $form['#attached']['css'] = array(
    drupal_get_path('module', 'availability_calendar_booking_formlet') . '/availability_calendar_booking_formlet.css',
  );
  return $form;
}