You are here

public function ConditionalFieldEditForm::buildEditContextSettings in Conditional Fields 4.x

Same name and namespace in other branches
  1. 8 src/Form/ConditionalFieldEditForm.php \Drupal\conditional_fields\Form\ConditionalFieldEditForm::buildEditContextSettings()

Builds Edit Context Settings block.

1 call to ConditionalFieldEditForm::buildEditContextSettings()
ConditionalFieldEditForm::buildForm in src/Form/ConditionalFieldEditForm.php
Form constructor.

File

src/Form/ConditionalFieldEditForm.php, line 405

Class

ConditionalFieldEditForm
An edit form for conditional fields.

Namespace

Drupal\conditional_fields\Form

Code

public function buildEditContextSettings(array $form, FormStateInterface $form_state, $condition) {
  $label = array_key_exists('dependee', $condition) ? $condition['dependee'] : '?';
  $settings = array_key_exists('settings', $condition) ? $condition['settings'] : [];
  $form['state'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Form state'),
    '#description' => $this
      ->t('The Javascript form state that is applied to the target field when the condition is met. Note: this has no effect on server-side logic and validation.'),
    '#options' => $this->list
      ->conditionalFieldsStates(),
    '#default_value' => array_key_exists('state', $settings) ? $settings['state'] : 0,
    '#required' => TRUE,
    '#ajax' => [
      'callback' => '::ajaxAdminStateCallback',
      'wrapper' => 'effects-wrapper',
    ],
  ];
  $effects = $effects_options = [];
  $selected_state = $form_state
    ->getValue('state') ?: $condition['settings']['state'];
  foreach ($this->list
    ->conditionalFieldsEffects() as $effect_name => $effect) {
    if (empty($selected_state)) {
      continue;
    }
    if (in_array($selected_state, $effect['states'])) {
      $effects[$effect_name] = $effect['label'];
      if (isset($effect['options'])) {
        $effects_options[$effect_name] = $effect['options'];
      }
    }
  }
  $form['effects_wrapper'] = [
    '#type' => 'container',
    '#attributes' => [
      'id' => 'effects-wrapper',
    ],
  ];
  $effect = array_key_exists('effect', $settings) ? $settings['effect'] : '';
  $effect = $form_state
    ->hasValue('effect') ? $form_state
    ->getValue('effect') : $effect;
  if (count($effects) == 1) {
    $effects_keys = array_keys($effects);
    $form['effects_wrapper']['effect'] = [
      '#type' => 'hidden',
      '#value' => array_shift($effects_keys),
      '#default_value' => array_shift($effects_keys),
    ];
  }
  elseif (count($effects) > 1) {
    $form['effects_wrapper']['effect'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Effect'),
      '#description' => $this
        ->t('The effect that is applied to the target field when its state is changed.'),
      '#options' => $effects,
      '#default_value' => $effect,
      '#states' => [
        'visible' => [
          ':input[name="state"]' => [
            [
              'value' => 'visible',
            ],
            [
              'value' => '!visible',
            ],
          ],
        ],
      ],
    ];
  }
  $form['effects_wrapper']['effect_options'] = [
    '#tree' => TRUE,
  ];
  foreach ($effects_options as $effect_name => $effect_options) {
    foreach ($effect_options as $effect_option_name => $effect_option) {
      $effect_option += [
        '#title' => $this
          ->t('@effect effect option: @effect_option', [
          '@effect' => $effects[$effect_name],
          '@effect_option' => $effect_option_name,
        ]),
        '#states' => [
          'visible' => [
            ':input[name="effect"]' => [
              [
                'value' => $effect_name,
              ],
            ],
          ],
        ],
      ];
      if (isset($form_state
        ->getValue('effect_options')[$effect_name][$effect_option_name])) {
        $effect_option['#default_value'] = $form_state
          ->getValue('effect_options')[$effect_name][$effect_option_name];
      }
      elseif ($settings['effect'] == $effect_name) {
        $effect_option['#default_value'] = $settings['effect_options'][$effect_name][$effect_option_name];
      }
      $form['effects_wrapper']['effect_options'][$effect_name][$effect_option_name] = $effect_option;
    }
  }
  $form['reset'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Reset the target to its default values when the form is submitted if the dependency is not triggered.'),
    '#default_value' => array_key_exists('reset', $settings) ? $settings['reset'] : 0,
    '#states' => [
      'visible' => [
        ':input[name="condition"]' => [
          [
            'value' => '!empty',
          ],
          [
            'value' => 'empty',
          ],
          [
            'value' => 'value',
          ],
          [
            'value' => 'checked',
          ],
          [
            'value' => '!checked',
          ],
        ],
      ],
    ],
    '#description' => $this
      ->t('Note: This setting only applies if the condition is "Value", "Empty", "Checked", "Unchecked", or "Filled" and may not work with some field types. Also, ensure that the default values are valid, since they will not be validated.'),
  ];
  $form['dependency_advanced'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Advanced edit context settings', [
      '@entity' => $label,
    ]),
    '#open' => FALSE,
  ];
  $selector_description = $this
    ->t('Only use if you know what you are doing, otherwise leave the field empty to let the dependency use an automatically generated selector.');
  $selector_description .= '<br />' . $this
    ->t('You can use the following placeholders:');
  $selector_description .= "<ul>\n";
  $selector_description .= '<li>' . $this
    ->t('%lang: current language of the field.') . "</li>\n";
  $selector_description .= '<li>' . $this
    ->t('%key: part identifier for fields composed of multiple form elements, like checkboxes.') . "</li>\n";
  $selector_description .= '</ul>';
  $form['dependency_advanced']['selector'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Custom jQuery selector for control field'),
    '#description' => $selector_description,
    '#default_value' => array_key_exists('selector', $settings) ? $settings['selector'] : '',
  ];
  return $form;
}