You are here

function flexiform_multistep_step_form in Flexiform 7

Form constructor for a specific step of a multistep flexiform.

1 string reference to 'flexiform_multistep_step_form'
flexiform_multistep_wrapper in flexiform_multistep/flexiform_multistep.pages.inc
Page callback for CTools Multistep Forms.

File

flexiform_multistep/flexiform_multistep.pages.inc, line 116
Page callbacks for Flexiform Multistep.

Code

function flexiform_multistep_step_form($form, &$form_state, $flexiform, $base_entity) {

  // Get hold of the full form.
  $form = drupal_retrieve_form('flexiform__' . $flexiform->form, $form_state);

  // Add the flexiform state to the object.
  $form_state['object']['flexiform_state'] = $form_state['flexiform_state'];

  // Clear out the standard submission buttons.
  unset($form['actions']);

  // Get our current group.
  $form_state['step_group'] = $form_state['form_info']['forms'][$form_state['step']]['group'];

  // Set up the more advanced trail.
  if (!empty($form['ctools_trail'])) {
    unset($form['ctools_trail']['#markup']);
    $form['ctools_trail']['#theme'] = 'item_list';
    $form['ctools_trail']['#type'] = 'ol';
    $form['ctools_trail']['#attributes']['class'][] = 'flexiform-multistep-progress';
    $form['ctools_trail']['#attributes']['class'][] = 'clearfix';
    $form['ctools_trail']['#attributes']['class'][] = 'inline';
    $past_current = FALSE;
    foreach ($form_state['form_info']['forms'] as $step => $info) {
      $item = array(
        'class' => array(
          $info['group']->group_name,
        ),
      );
      if (!$past_current) {
        $params = ctools_wizard_get_path($form_state['form_info'], $step);
        $params[] = array();
        $item['class'][] = 'available';
        $item['data'] = l($info['group']->label, $params[0], $params[1]);
      }
      else {
        $item['data'] = '<span>' . $info['group']->label . '</span>';
      }
      if ($step == $form_state['step']) {
        $item['class'][] = 'active';
        $past_current = TRUE;
      }
      $form['ctools_trail']['#items'][$step] = $item;
    }
  }

  // Clear out the multi step field groups and groups that are not part of this
  // step.
  foreach ($form['#groups'] as $name => $group) {
    if ($group->format_type == 'flexiform_step') {
      unset($form['#groups'][$name]);
      unset($form['#fieldgroups'][$name]);
      foreach ($form['#group_children'] as $child => $parent) {
        if ($parent == $name) {
          unset($form['#group_children'][$child]);
        }
      }
    }
  }

  // Set the page title if requested.
  if (!empty($form_state['step_group']->format_settings['instance_settings']['page_title'])) {
    drupal_set_title($form_state['step_group']->format_settings['instance_settings']['page_title']);
  }

  // Hide any elements that aren't in this step.
  // First, get a list of all of the children of this step group.
  $step_children = flexiform_multistep_field_group_descendants($form['#groups'], $form_state['step_group']);

  // Remove groups that are not a child of this step.
  foreach ($form['#groups'] as $name => $group) {
    if (!in_array($name, $step_children)) {
      unset($form['#groups'][$name]);
      unset($form['#fieldgroups'][$name]);
    }
  }
  $old_form = $form;
  foreach (element_children($form) as $key) {

    // Preserve special items.
    if (in_array($key, array(
      'ctools_trail',
      'buttons',
    ))) {
      continue;
    }
    if (!in_array($key, $step_children)) {
      unset($form[$key]);
    }
    else {
      if (module_exists('flexiform_conditional_fields')) {
        $el_settings = $form[$key]['#flexiform_element']
          ->getSettings();
        if (empty($el_settings['conditional_fields'])) {
          continue;
        }
        foreach ($el_settings['conditional_fields'] as $dependency_key => $options) {
          list($dependee) = explode('|', $dependency_key);
          if (in_array($dependee, $step_children)) {

            // If the dependee is also on this page then we don't need to do
            // anything.
            continue;
          }
          $condition_met = FALSE;
          $dependee_element = $old_form[$dependee];
          if (!empty($dependee_element[$dependee_element['#language']])) {
            $dependee_element = $dependee_element[$dependee_element['#language']];
          }
          $values = array();
          if (element_children($dependee_element)) {
          }
          else {
            $values = $dependee_element['#default_value'];
            if (!is_array($values)) {
              $values = array(
                $dependee_element['#delta'] => $values,
              );
            }
            foreach ($values as $delta => $value) {
              if (!is_array($value)) {
                $values[$delta] = array(
                  $dependee_element['#value_key'] => $value,
                );
              }
            }
          }
          switch ($options['condition']) {
            case '!empty':
              $condition_met = !empty($values);
              break;
            case 'empty':
              $condition_met = empty($values);
              break;
            case 'focused':
              break;
            case '!focused':
              $condition_met = TRUE;
              break;
            case 'checked':
              $condition_met = $dependee_element['#type'] == 'checkbox' && $dependee_element['#default_value'] == 1;
              break;
            case '!checked':
              $condition_met = $dependee_element['#type'] == 'checkbox' && !$dependee_element['#default_value'] == 1;
              break;
            case 'value':
              if ($values == $options['value']) {
                $condition_met = TRUE;
              }
              break;
          }
          if ($condition_met) {
            switch ($options['state']) {
              case 'visible':
                break;
              case '!visible':
                $form[$key]['#access'] = FALSE;
                break;
              case '!disabled':
                $form[$key]['#disabled'] = FALSE;
                break;
              case 'disabled':
                $form[$key]['#disabled'] = TRUE;
                break;
              case '!required':
                $form[$key]['#required'] = TRUE;
                break;
              case 'required':
                $form[$key]['#required'] = FALSE;
                break;
            }
          }
          else {
            switch ($options['state']) {
              case 'visible':
                $form[$key]['#access'] = FALSE;
                break;
              case '!visible':
                break;
              case '!disabled':
                $form[$key]['#disabled'] = TRUE;
                break;
              case 'disabled':
                $form[$key]['#disabled'] = FALSE;
                break;
              case '!required':
                $form[$key]['#required'] = TRUE;
                break;
              case 'required':
                $form[$key]['#required'] = FALSE;
                break;
            }
          }
        }
      }
    }
  }
  return $form;
}