You are here

public function FilterFormatFormBase::form in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/filter/src/FilterFormatFormBase.php \Drupal\filter\FilterFormatFormBase::form()

Gets the actual form array to be built.

Overrides EntityForm::form

See also

\Drupal\Core\Entity\EntityForm::processForm()

\Drupal\Core\Entity\EntityForm::afterBuild()

2 calls to FilterFormatFormBase::form()
FilterFormatAddForm::form in core/modules/filter/src/FilterFormatAddForm.php
Gets the actual form array to be built.
FilterFormatEditForm::form in core/modules/filter/src/FilterFormatEditForm.php
Gets the actual form array to be built.
2 methods override FilterFormatFormBase::form()
FilterFormatAddForm::form in core/modules/filter/src/FilterFormatAddForm.php
Gets the actual form array to be built.
FilterFormatEditForm::form in core/modules/filter/src/FilterFormatEditForm.php
Gets the actual form array to be built.

File

core/modules/filter/src/FilterFormatFormBase.php, line 17

Class

FilterFormatFormBase
Provides a base form for a filter format.

Namespace

Drupal\filter

Code

public function form(array $form, FormStateInterface $form_state) {
  $format = $this->entity;
  $is_fallback = $format
    ->id() == $this
    ->config('filter.settings')
    ->get('fallback_format');
  $form['#tree'] = TRUE;
  $form['#attached']['library'][] = 'filter/drupal.filter.admin';
  $form['name'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Name'),
    '#default_value' => $format
      ->label(),
    '#required' => TRUE,
    '#weight' => -30,
  ];
  $form['format'] = [
    '#type' => 'machine_name',
    '#required' => TRUE,
    '#default_value' => $format
      ->id(),
    '#maxlength' => 255,
    '#machine_name' => [
      'exists' => [
        $this,
        'exists',
      ],
      'source' => [
        'name',
      ],
    ],
    '#disabled' => !$format
      ->isNew(),
    '#weight' => -20,
  ];

  // Add user role access selection.
  $form['roles'] = [
    '#type' => 'checkboxes',
    '#title' => $this
      ->t('Roles'),
    '#options' => array_map('\\Drupal\\Component\\Utility\\Html::escape', user_role_names()),
    '#disabled' => $is_fallback,
    '#weight' => -10,
  ];
  if ($is_fallback) {
    $form['roles']['#description'] = $this
      ->t('All roles for this text format must be enabled and cannot be changed.');
  }
  if (!$format
    ->isNew()) {

    // If editing an existing text format, pre-select its current permissions.
    $form['roles']['#default_value'] = array_keys(filter_get_roles_by_format($format));
  }

  // Create filter plugin instances for all available filters, including both
  // enabled/configured ones as well as new and not yet unconfigured ones.
  $filters = $format
    ->filters();
  foreach ($filters as $filter_id => $filter) {

    // When a filter is missing, it is replaced by the null filter. Remove it
    // here, so that saving the form will remove the missing filter.
    if ($filter instanceof FilterNull) {
      $this
        ->messenger()
        ->addWarning($this
        ->t('The %filter filter is missing, and will be removed once this format is saved.', [
        '%filter' => $filter_id,
      ]));
      $filters
        ->removeInstanceID($filter_id);
    }
  }

  // Filter status.
  $form['filters']['status'] = [
    '#type' => 'item',
    '#title' => $this
      ->t('Enabled filters'),
    '#prefix' => '<div id="filters-status-wrapper">',
    '#suffix' => '</div>',
    // This item is used as a pure wrapping container with heading. Ignore its
    // value, since 'filters' should only contain filter definitions.
    // See https://www.drupal.org/node/1829202.
    '#input' => FALSE,
  ];

  // Filter order (tabledrag).
  $form['filters']['order'] = [
    '#type' => 'table',
    // For filter.admin.js
    '#attributes' => [
      'id' => 'filter-order',
    ],
    '#title' => $this
      ->t('Filter processing order'),
    '#tabledrag' => [
      [
        'action' => 'order',
        'relationship' => 'sibling',
        'group' => 'filter-order-weight',
      ],
    ],
    '#tree' => FALSE,
    '#input' => FALSE,
    '#theme_wrappers' => [
      'form_element',
    ],
  ];

  // Filter settings.
  $form['filter_settings'] = [
    '#type' => 'vertical_tabs',
    '#title' => $this
      ->t('Filter settings'),
  ];
  foreach ($filters as $name => $filter) {
    $form['filters']['status'][$name] = [
      '#type' => 'checkbox',
      '#title' => $filter
        ->getLabel(),
      '#default_value' => $filter->status,
      '#parents' => [
        'filters',
        $name,
        'status',
      ],
      '#description' => $filter
        ->getDescription(),
      '#weight' => $filter->weight,
    ];
    $form['filters']['order'][$name]['#attributes']['class'][] = 'draggable';
    $form['filters']['order'][$name]['#weight'] = $filter->weight;
    $form['filters']['order'][$name]['filter'] = [
      '#markup' => $filter
        ->getLabel(),
    ];
    $form['filters']['order'][$name]['weight'] = [
      '#type' => 'weight',
      '#title' => $this
        ->t('Weight for @title', [
        '@title' => $filter
          ->getLabel(),
      ]),
      '#title_display' => 'invisible',
      '#delta' => 50,
      '#default_value' => $filter->weight,
      '#parents' => [
        'filters',
        $name,
        'weight',
      ],
      '#attributes' => [
        'class' => [
          'filter-order-weight',
        ],
      ],
    ];

    // Retrieve the settings form of the filter plugin. The plugin should not be
    // aware of the text format. Therefore, it only receives a set of minimal
    // base properties to allow advanced implementations to work.
    $settings_form = [
      '#parents' => [
        'filters',
        $name,
        'settings',
      ],
      '#tree' => TRUE,
    ];
    $settings_form = $filter
      ->settingsForm($settings_form, $form_state);
    if (!empty($settings_form)) {
      $form['filters']['settings'][$name] = [
        '#type' => 'details',
        '#title' => $filter
          ->getLabel(),
        '#open' => TRUE,
        '#weight' => $filter->weight,
        '#parents' => [
          'filters',
          $name,
          'settings',
        ],
        '#group' => 'filter_settings',
      ];
      $form['filters']['settings'][$name] += $settings_form;
    }
  }
  return parent::form($form, $form_state);
}