You are here

function flexiform_conditional_fields_flexiform_element_configure_form in Flexiform 7

Add the conditional fields form.

1 call to flexiform_conditional_fields_flexiform_element_configure_form()
flexiform_conditional_fields_form_flexiform_field_configure_form_alter in flexiform_conditional_fields/flexiform_conditional_fields.module
Alter the configuration form for flexiform elements.

File

flexiform_conditional_fields/flexiform_conditional_fields.admin.inc, line 10
Admin UI for flexiform_conditional_fields.

Code

function flexiform_conditional_fields_flexiform_element_configure_form($form, &$form_state, $complete_form) {
  $element = $complete_form['#flexiform_element'];
  $flexiform = $complete_form['#flexiform'];
  $settings = $element
    ->getSettings();
  $dependent = $element_namespace = $element
    ->getElementNamespace();
  $dependees = !empty($settings['conditional_fields']) ? $settings['conditional_fields'] : array();
  $form['table'] = array(
    '#theme' => 'table',
    '#header' => array(
      t('Dependees'),
      array(
        'data' => t('Description'),
        'colspan' => 2,
      ),
      array(
        'data' => t('Operations'),
        'colspan' => 2,
      ),
    ),
    '#rows' => array(),
    '#attributes' => array(
      'class' => array(
        'conditional-fields-overview',
      ),
    ),
    'dependencies' => array(),
  );
  $form['table']['#attached']['css'][] = drupal_get_path('module', 'conditional_fields') . '/conditional_fields.css';
  if (!empty($dependees)) {
    $destination = drupal_get_destination();
    $grouping_count = array();

    // Enable row grouping by operator.
    $first_row = $show_AND = $show_OR = $show_XOR = TRUE;
    if (!isset($grouping_count[$dependent])) {
      $grouping_count[$dependent] = array(
        'AND' => 0,
        'OR' => 0,
        'XOR' => 0,
      );
      foreach ($dependees as $options) {
        $grouping_count[$dependent][$options['grouping']]++;
      }
    }
    foreach ($dependees as $dependency_key => $options) {
      list($dependee) = explode('|', $dependency_key);
      if (empty($flexiform->elements[$dependee])) {
        unset($flexiform->elements[$element_namespace]['conditional_fields'][$dependency_key]);
        unset($dependees[$dependency_key]);
        continue;
      }
      $form['table'][$dependency_key] = array();
      $dependee_count = count($dependees);
      $dependee_element = FlexiformElement::getElement($flexiform, $dependee);
      $row = array(
        'dependee' => array(
          '#markup' => check_plain($dependee_element
            ->label() . ' (' . $dependee . ')'),
        ),
      );

      // To avoid clutter, collect information about groupings so we can show each
      // operator once per dependent.
      if ($dependee_count > 1) {
        if (${'show_' . $options['grouping']}) {
          $row['group'] = array(
            '#markup' => $options['grouping'],
            '#rowspan' => $grouping_count[$dependent][$options['grouping']],
          );
          ${'show_' . $options['grouping']} = FALSE;
        }
        $row['description']['#colspan'] = 1;
      }
      else {
        $row['description']['#colspan'] = 2;
      }
      $row['description']['#markup'] = conditional_fields_dependency_description($dependee_element
        ->label(), $element
        ->label(), $options);
      $row['edit'] = array(
        '#type' => 'link',
        '#title' => t('edit'),
        '#href' => 'admin/structure/flexiforms/manage/' . $flexiform->form . '/form-fields/' . $element_namespace . '/conditional-fields/' . $dependency_key . '/edit',
        '#options' => array(
          'query' => $destination,
          'attributes' => array(
            'title' => t('Edit dependency settings.'),
          ),
        ),
        '#query' => drupal_get_destination(),
      );
      $row['delete'] = array(
        '#type' => 'link',
        '#title' => t('delete'),
        '#href' => 'admin/structure/flexiforms/manage/' . $flexiform->form . '/form-fields/' . $element_namespace . '/conditional-fields/' . $dependency_key . '/delete',
        '#options' => array(
          'query' => $destination,
          'attributes' => array(
            'title' => t('Delete dependency.'),
          ),
        ),
      );
      if (!empty($row['group'])) {
        $form['table'][$dependency_key] = array(
          'dependee' => &$row['dependee'],
          'group' => &$row['group'],
          'description' => &$row['description'],
          'edit' => &$row['edit'],
          'delete' => &$row['delete'],
        );
        $form['table']['#rows'][$dependency_key] = array(
          'dependee' => array(
            'data' => &$row['dependee'],
          ),
          'group' => array(
            'data' => &$row['group'],
          ),
          'description' => array(
            'data' => &$row['description'],
            'colspan' => $row['description']['#colspan'],
          ),
          'edit' => array(
            'data' => &$row['edit'],
          ),
          'delete' => array(
            'data' => &$row['delete'],
          ),
        );
      }
      else {
        $form['table'][$dependency_key] = array(
          'dependee' => &$row['dependee'],
          'description' => &$row['description'],
          'edit' => &$row['edit'],
          'delete' => &$row['delete'],
        );
        $form['table']['#rows'][$dependency_key] = array(
          'dependee' => array(
            'data' => &$row['dependee'],
          ),
          'description' => array(
            'data' => &$row['description'],
            'colspan' => $row['description']['#colspan'],
          ),
          'edit' => array(
            'data' => &$row['edit'],
          ),
          'delete' => array(
            'data' => &$row['delete'],
          ),
        );
      }
      unset($row);
    }
  }

  // Build a list of fields.
  $fields = array();
  foreach ($flexiform->elements as $namespace => $settings) {
    $fields[$namespace] = FlexiformElement::getElement($flexiform, $namespace)
      ->label();
  }

  // Build list of states.
  $states = array_map('drupal_strtolower', conditional_fields_states());

  // Build list of conditions.
  foreach (conditional_fields_conditions() as $condition => $label) {
    $conditions[$condition] = $condition == 'value' ? t('has value...') : t('is !label', array(
      '!label' => drupal_strtolower($label),
    ));
  }

  // Add new dependency row.
  $form_row = array(
    'dependee' => array(
      '#type' => 'select',
      '#title' => t('Dependee'),
      '#title_display' => 'invisible',
      '#description' => t('Dependee'),
      '#options' => $fields,
      '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
    ),
    'state' => array(
      '#type' => 'select',
      '#title' => t('State'),
      '#title_display' => 'invisible',
      '#options' => $states,
      '#default_value' => 'visible',
      '#prefix' => t('This element is') . '&nbsp;<span class="description-select">',
      '#suffix' => '</span>&nbsp;' . t('when the dependee'),
    ),
    'condition' => array(
      '#type' => 'select',
      '#title' => t('Condition'),
      '#title_display' => 'invisible',
      '#options' => $conditions,
      '#default_value' => 'value',
      '#prefix' => '&nbsp;<span class="description-select">',
      '#suffix' => '</span>',
    ),
    'actions' => array(
      'submit' => array(
        '#type' => 'submit',
        '#value' => t('Add dependency'),
        '#submit' => array(
          'flexiform_conditional_fields_flexiform_element_configure_form_submit',
        ),
      ),
    ),
  );
  $form['table']['add_new_dependency'] = array(
    'dependee' => &$form_row['dependee'],
    'state' => &$form_row['state'],
    'condition' => &$form_row['condition'],
    'actions' => &$form_row['actions'],
  );
  $form['table']['#rows']['add_new_dependency'] = array(
    'dependee' => array(
      'data' => &$form_row['dependee'],
    ),
    'state' => array(
      'data' => &$form_row['state'],
    ),
    'condition' => array(
      'data' => &$form_row['condition'],
    ),
    'actions' => array(
      'data' => &$form_row['actions'],
    ),
  );
  return $form;
}