You are here

public function PathautoSettingsForm::buildForm in Pathauto 8

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 ConfigFormBase::buildForm

File

src/Form/PathautoSettingsForm.php, line 127

Class

PathautoSettingsForm
Configure pathauto settings for this site.

Namespace

Drupal\pathauto\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $config = $this
    ->config('pathauto.settings');
  $form['enabled_entity_types'] = [
    '#type' => 'details',
    '#open' => TRUE,
    '#title' => $this
      ->t('Enabled entity types'),
    '#description' => $this
      ->t('Enable to add a path field and allow to define alias patterns for the given type. Disabled types already define a path field themselves or currently have a pattern.'),
    '#tree' => TRUE,
  ];

  // Get all applicable entity types.
  foreach ($this->entityTypeManager
    ->getDefinitions() as $entity_type_id => $entity_type) {

    // Disable a checkbox if it already exists and if the entity type has
    // patterns currently defined or if it isn't defined by us.
    $patterns_count = $this->entityTypeManager
      ->getStorage('pathauto_pattern')
      ->getQuery()
      ->condition('type', 'canonical_entities:' . $entity_type_id)
      ->count()
      ->execute();
    if (is_subclass_of($entity_type
      ->getClass(), FieldableEntityInterface::class) && $entity_type
      ->hasLinkTemplate('canonical')) {
      $field_definitions = $this->entityFieldManager
        ->getBaseFieldDefinitions($entity_type_id);
      $form['enabled_entity_types'][$entity_type_id] = [
        '#type' => 'checkbox',
        '#title' => $entity_type
          ->getLabel(),
        '#default_value' => isset($field_definitions['path']) || in_array($entity_type_id, $config
          ->get('enabled_entity_types')),
        '#disabled' => isset($field_definitions['path']) && ($field_definitions['path']
          ->getProvider() != 'pathauto' || $patterns_count),
      ];
    }
  }
  $form['verbose'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Verbose'),
    '#default_value' => $config
      ->get('verbose'),
    '#description' => $this
      ->t('Display alias changes (except during bulk updates).'),
  ];
  $form['separator'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Separator'),
    '#size' => 1,
    '#maxlength' => 1,
    '#default_value' => $config
      ->get('separator'),
    '#description' => $this
      ->t('Character used to separate words in titles. This will replace any spaces and punctuation characters. Using a space or + character can cause unexpected results.'),
  ];
  $form['case'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Character case'),
    '#default_value' => $config
      ->get('case'),
    '#description' => $this
      ->t('Convert token values to lowercase.'),
  ];
  $max_length = $this->aliasStorageHelper
    ->getAliasSchemaMaxlength();
  $help_link = '';
  if ($this->moduleHandler
    ->moduleExists('help')) {
    $help_link = ' ' . $this
      ->t('See <a href=":pathauto-help">Pathauto help</a> for details.', [
      ':pathauto-help' => Url::fromRoute('help.page', [
        'name' => 'pathauto',
      ])
        ->toString(),
    ]);
  }
  $form['max_length'] = [
    '#type' => 'number',
    '#title' => $this
      ->t('Maximum alias length'),
    '#size' => 3,
    '#maxlength' => 3,
    '#default_value' => $config
      ->get('max_length'),
    '#min' => 1,
    '#max' => $max_length,
    '#description' => $this
      ->t('Maximum length of aliases to generate. 100 is the recommended length. @max is the maximum possible length.', [
      '@max' => $max_length,
    ]) . $help_link,
  ];
  $form['max_component_length'] = [
    '#type' => 'number',
    '#title' => $this
      ->t('Maximum component length'),
    '#size' => 3,
    '#maxlength' => 3,
    '#default_value' => $config
      ->get('max_component_length'),
    '#min' => 1,
    '#max' => $max_length,
    '#description' => $this
      ->t('Maximum text length of any component in the alias (e.g., [title]). 100 is the recommended length. @max is the maximum possible length.', [
      '@max' => $max_length,
    ]) . $help_link,
  ];
  $description = $this
    ->t('What should Pathauto do when updating an existing content item which already has an alias?');
  if ($this->moduleHandler
    ->moduleExists('redirect')) {
    $description .= ' ' . $this
      ->t('The <a href=":url">Redirect module settings</a> affect whether a redirect is created when an alias is deleted.', [
      ':url' => Url::fromRoute('redirect.settings')
        ->toString(),
    ]);
  }
  else {
    $description .= ' ' . $this
      ->t('Considering installing the <a href=":url">Redirect module</a> to get redirects when your aliases change.', [
      ':url' => 'http://drupal.org/project/redirect',
    ]);
  }
  $form['update_action'] = [
    '#type' => 'radios',
    '#title' => $this
      ->t('Update action'),
    '#default_value' => $config
      ->get('update_action'),
    '#options' => [
      PathautoGeneratorInterface::UPDATE_ACTION_NO_NEW => $this
        ->t('Do nothing. Leave the old alias intact.'),
      PathautoGeneratorInterface::UPDATE_ACTION_LEAVE => $this
        ->t('Create a new alias. Leave the existing alias functioning.'),
      PathautoGeneratorInterface::UPDATE_ACTION_DELETE => $this
        ->t('Create a new alias. Delete the old alias.'),
    ],
    '#description' => $description,
  ];
  $form['transliterate'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Transliterate prior to creating alias'),
    '#default_value' => $config
      ->get('transliterate'),
    '#description' => $this
      ->t('When a pattern includes certain characters (such as those with accents) should Pathauto attempt to transliterate them into the US-ASCII alphabet?'),
  ];
  $form['reduce_ascii'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Reduce strings to letters and numbers'),
    '#default_value' => $config
      ->get('reduce_ascii'),
    '#description' => $this
      ->t('Filters the new alias to only letters and numbers found in the ASCII-96 set.'),
  ];
  $form['ignore_words'] = [
    '#type' => 'textarea',
    '#title' => $this
      ->t('Strings to Remove'),
    '#default_value' => $config
      ->get('ignore_words'),
    '#description' => $this
      ->t('Words to strip out of the URL alias, separated by commas. Do not use this to remove punctuation.'),
  ];
  $form['safe_tokens'] = [
    '#type' => 'textarea',
    '#title' => $this
      ->t('Safe tokens'),
    '#default_value' => implode(', ', $config
      ->get('safe_tokens')),
    '#description' => $this
      ->t('List of tokens that are safe to use in alias patterns and do not need to be cleaned. For example urls, aliases, machine names. Separated with a comma.'),
  ];
  $form['punctuation'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Punctuation'),
    '#open' => FALSE,
    '#tree' => TRUE,
  ];
  $punctuation = $this->aliasCleaner
    ->getPunctuationCharacters();
  foreach ($punctuation as $name => $details) {

    // Use the value from config if it exists.
    if ($config
      ->get('punctuation.' . $name) !== NULL) {
      $details['default'] = $config
        ->get('punctuation.' . $name);
    }
    else {

      // Otherwise use the correct default.
      $details['default'] = $details['value'] == $config
        ->get('separator') ? PathautoGeneratorInterface::PUNCTUATION_REPLACE : PathautoGeneratorInterface::PUNCTUATION_REMOVE;
    }
    $form['punctuation'][$name] = [
      '#type' => 'select',
      '#title' => $details['name'] . ' (<code>' . Html::escape($details['value']) . '</code>)',
      '#default_value' => $details['default'],
      '#options' => [
        PathautoGeneratorInterface::PUNCTUATION_REMOVE => $this
          ->t('Remove'),
        PathautoGeneratorInterface::PUNCTUATION_REPLACE => $this
          ->t('Replace by separator'),
        PathautoGeneratorInterface::PUNCTUATION_DO_NOTHING => $this
          ->t('No action (do not replace)'),
      ],
    ];
  }
  return parent::buildForm($form, $form_state);
}