function FilterFormatFormBase::form

Same name in other branches
  1. 9 core/modules/filter/src/FilterFormatFormBase.php \Drupal\filter\FilterFormatFormBase::form()
  2. 8.9.x core/modules/filter/src/FilterFormatFormBase.php \Drupal\filter\FilterFormatFormBase::form()
  3. 10 core/modules/filter/src/FilterFormatFormBase.php \Drupal\filter\FilterFormatFormBase::form()

Overrides EntityForm::form

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 20

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(fn(RoleInterface $role) => Html::escape($role->label()), Role::loadMultiple()),
        '#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 configured 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',
                ],
            ],
        ];
        // Ensure the resulting FilterFormat complies with `type: filter`.
        // @see core.data_types.schema.yml
        // @see \Drupal\filter\FilterFormatFormBase::submitForm()
        $form['filters']['order'][$name]['id'] = [
            '#type' => 'value',
            '#value' => $filter->getPluginId(),
            '#parents' => [
                'filters',
                $name,
                'id',
            ],
        ];
        $form['filters']['order'][$name]['provider'] = [
            '#type' => 'value',
            '#value' => $filter->provider,
            '#parents' => [
                'filters',
                $name,
                'provider',
            ],
        ];
        // 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);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.