You are here

public function WebformUiElementFormBase::buildForm in Webform 6.x

Same name and namespace in other branches
  1. 8.5 modules/webform_ui/src/Form/WebformUiElementFormBase.php \Drupal\webform_ui\Form\WebformUiElementFormBase::buildForm()

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides FormInterface::buildForm

3 calls to WebformUiElementFormBase::buildForm()
WebformUiElementAddForm::buildForm in modules/webform_ui/src/Form/WebformUiElementAddForm.php
Form constructor.
WebformUiElementDuplicateForm::buildForm in modules/webform_ui/src/Form/WebformUiElementDuplicateForm.php
Form constructor.
WebformUiElementEditForm::buildForm in modules/webform_ui/src/Form/WebformUiElementEditForm.php
Form constructor.
4 methods override WebformUiElementFormBase::buildForm()
WebformUiElementAddForm::buildForm in modules/webform_ui/src/Form/WebformUiElementAddForm.php
Form constructor.
WebformUiElementDuplicateForm::buildForm in modules/webform_ui/src/Form/WebformUiElementDuplicateForm.php
Form constructor.
WebformUiElementEditForm::buildForm in modules/webform_ui/src/Form/WebformUiElementEditForm.php
Form constructor.
WebformUiElementTestForm::buildForm in modules/webform_ui/src/Form/WebformUiElementTestForm.php
Form constructor.

File

modules/webform_ui/src/Form/WebformUiElementFormBase.php, line 148

Class

WebformUiElementFormBase
Provides a base class for webform element webforms.

Namespace

Drupal\webform_ui\Form

Code

public function buildForm(array $form, FormStateInterface $form_state, WebformInterface $webform = NULL, $key = NULL, $parent_key = NULL, $type = NULL) {

  // Override an element's default value using the $form_state.
  if ($form_state
    ->get('default_value')) {
    $this->element['#default_value'] = $form_state
      ->get('default_value');
  }
  $this->webform = $webform;
  $this->key = $key;
  $this->parentKey = $parent_key;
  $element_plugin = $this
    ->getWebformElementPlugin();
  $form['#parents'] = [];
  $form['properties'] = [
    '#parents' => [
      'properties',
    ],
  ];
  $subform_state = SubformState::createForSubform($form['properties'], $form, $form_state);
  $subform_state
    ->set('element', $this->element);
  $form['properties'] = $element_plugin
    ->buildConfigurationForm($form['properties'], $subform_state);

  // Move messages to the top of the webform.
  if (isset($form['properties']['messages'])) {
    $form['messages'] = $form['properties']['messages'];
    $form['messages']['#weight'] = -100;
    unset($form['properties']['messages']);
  }

  // Set parent key.
  $form['parent_key'] = [
    '#type' => 'value',
    '#value' => $parent_key,
  ];

  // Set element type.
  $form['properties']['element']['type'] = [
    '#type' => 'item',
    '#title' => $this
      ->t('Type'),
    'label' => [
      '#markup' => $element_plugin
        ->getPluginLabel(),
    ],
    '#weight' => -100,
    '#parents' => [
      'type',
    ],
  ];

  // Set change element type.
  if ($key && $element_plugin
    ->getRelatedTypes($this->element)) {
    $route_parameters = [
      'webform' => $webform
        ->id(),
      'key' => $key,
    ];
    if ($this->originalType) {
      $original_webform_element = $this->elementManager
        ->createInstance($this->originalType);
      $route_parameters = [
        'webform' => $webform
          ->id(),
        'key' => $key,
      ];
      $form['properties']['element']['type']['cancel'] = [
        '#type' => 'link',
        '#title' => $this
          ->t('Cancel'),
        '#url' => new Url('entity.webform_ui.element.edit_form', $route_parameters),
        '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(WebformDialogHelper::DIALOG_NORMAL, [
          'button',
          'button--small',
        ]),
        '#prefix' => ' ',
      ];
      $form['properties']['element']['type']['#description'] = '(' . $this
        ->t('Changing from %type', [
        '%type' => $original_webform_element
          ->getPluginLabel(),
      ]) . ')';
    }
    else {
      $form['properties']['element']['type']['change_type'] = [
        '#type' => 'link',
        '#title' => $this
          ->t('Change'),
        '#url' => new Url('entity.webform_ui.change_element', $route_parameters),
        '#attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NORMAL, [
          'button',
          'button--small',
        ]),
        '#prefix' => ' ',
      ];
    }
  }

  // Set element key reserved word warning message.
  // @see Drupal.behaviors.webformUiElementKey
  if (!$key) {
    $reserved_keys = [
      'form_build_id',
      'form_token',
      'form_id',
      'data',
      'op',
      'destination',
    ];
    $reserved_keys = array_merge($reserved_keys, array_keys($this->entityFieldManager
      ->getBaseFieldDefinitions('webform_submission')));
    $form['#attached']['drupalSettings']['webform_ui']['reserved_keys'] = $reserved_keys;
    $form['properties']['element']['key_warning'] = [
      '#type' => 'webform_message',
      '#message_type' => 'warning',
      '#message_message' => [
        '#markup' => $this
          ->t("Please avoid using the reserved word '@key' as the element's key."),
        '#prefix' => '<div id="webform-ui-reserved-key-warning">',
        '#suffix' => '</div>',
      ],
      '#weight' => -99,
      '#attributes' => [
        'style' => 'display:none',
      ],
    ];
  }

  // Set element key with custom machine name pattern.
  // @see \Drupal\webform\WebformEntityElementsValidator::validateNames
  $machine_name_pattern = $this
    ->config('webform.settings')
    ->get('element.machine_name_pattern') ?: 'a-z0-9_';
  switch ($machine_name_pattern) {
    case 'a-z0-9_':
      $machine_name_requirements = $this
        ->t('lowercase letters, numbers, and underscores');
      break;
    case 'a-zA-Z0-9_':
      $machine_name_requirements = $this
        ->t('letters, numbers, and underscores');
      break;
    case 'a-z0-9_-':
      $machine_name_requirements = $this
        ->t('lowercase letters, numbers, and underscores');
      break;
    case 'a-zA-Z0-9_-':
      $machine_name_requirements = $this
        ->t('letters, numbers, underscores, and dashes');
      break;
  }
  $t_args = [
    '@requirements' => $machine_name_requirements,
  ];
  $form['properties']['element']['key'] = [
    '#type' => 'machine_name',
    '#title' => $this
      ->t('Key'),
    '#description' => $this
      ->t('A unique element key. Can only contain @requirements.', $t_args),
    '#machine_name' => [
      'label' => '<br/>' . $this
        ->t('Key'),
      'exists' => [
        $this,
        'exists',
      ],
      'source' => [
        'title',
      ],
      'replace_pattern' => '[^' . $machine_name_pattern . ']+',
      'error' => $this
        ->t('The element key name must contain only @requirements.', $t_args),
    ],
    '#required' => TRUE,
    '#parents' => [
      'key',
    ],
    '#disabled' => $key ? TRUE : FALSE,
    '#default_value' => $key ?: $this
      ->getDefaultKey(),
    '#weight' => -97,
  ];

  // Remove the key's help text (aka description) once it has been set.
  if ($key) {
    $form['properties']['element']['key']['#description'] = NULL;
  }

  // Use title for key (machine_name).
  if (isset($form['properties']['element']['title'])) {
    $form['properties']['element']['key']['#machine_name']['source'] = [
      'properties',
      'element',
      'title',
    ];
    $form['properties']['element']['title']['#id'] = 'title';
  }

  // Prefix table row child elements with the table row key.
  if ($this
    ->isNew() && ($parent_prefix = $this
    ->getParentKeyPrefix($parent_key))) {
    $form['properties']['element']['key']['#field_prefix'] = $parent_prefix . '_';
    $form['properties']['element']['table_message'] = [
      '#type' => 'webform_message',
      '#message_message' => $this
        ->t("Element keys are automatically prefixed with parent row's key."),
      '#message_type' => 'warning',
      '#message_close' => TRUE,
      '#message_storage' => WebformMessage::STORAGE_SESSION,
      '#weight' => -98,
    ];
  }

  // Set flex.
  // Hide #flex property if parent element is not a 'webform_flexbox'.
  if (isset($form['properties']['flex']) && !$this
    ->isParentElementFlexbox($key, $parent_key)) {
    $form['properties']['flex']['#access'] = FALSE;
  }
  $form['#attached']['library'][] = 'webform_ui/webform_ui';

  // Set actions.
  $form['actions'] = [
    '#type' => 'actions',
  ];
  $form['actions']['submit'] = [
    '#type' => 'submit',
    '#value' => $this
      ->t('Save'),
    '#button_type' => 'primary',
    '#_validate_form' => TRUE,
  ];
  if ($this->operation === 'create' && $this
    ->isAjax() && !$element_plugin instanceof WebformTable && !$element_plugin instanceof WebformTableRow) {
    $form['actions']['save_add_element'] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Save + Add element'),
      '#_validate_form' => TRUE,
    ];
  }

  // Add token links below the form and on every tab.
  $form['token_tree_link'] = $this->tokenManager
    ->buildTreeElement();
  if ($form['token_tree_link']) {
    $form['token_tree_link'] += [
      '#weight' => 101,
    ];
  }
  $form = $this
    ->buildDefaultValueForm($form, $form_state);
  return $this
    ->buildDialogForm($form, $form_state);
}