You are here

function field_default_token_form_field_config_edit_form_alter in Field default token 8

Implements hook_form_FORM_ID_alter() for the field configuration edit form.

File

./field_default_token.module, line 91
Enables to use tokens as field default values.

Code

function field_default_token_form_field_config_edit_form_alter(&$form, FormStateInterface $form_state) {

  /** @var \Drupal\Core\Entity\EntityFormInterface $form_object */
  $form_object = $form_state
    ->getFormObject();

  // See https://www.drupal.org/node/2818877.

  /** @var \Drupal\field\FieldConfigInterface|\Drupal\Core\Field\FieldConfigInterface $field_config */
  $field_config = $form_object
    ->getEntity();

  // \Drupal\Core\Field\FieldItemList::defaultValuesForm() does not display a
  // default value form if there is a default value callback. In case the
  // default value callback is 'field_default_token_default_value_callback'
  // we display the default value form as if there were no callback.
  if (!isset($form['default_value']) && $field_config
    ->getDefaultValueCallback() === 'field_default_token_default_value_callback') {

    // See \Drupal\field_ui\Form\FieldConfigEditForm::form()

    /** @var \Drupal\Core\Entity\FieldableEntityInterface $entity */
    $entity = $form['#entity'];
    $items = $entity
      ->get($field_config
      ->getName());
    $items
      ->getFieldDefinition()
      ->setDefaultValueCallback(NULL);
    if ($element = $items
      ->defaultValuesForm($form, $form_state)) {
      $element = array_merge($element, [
        '#type' => 'details',
        '#title' => t('Default value'),
        '#open' => TRUE,
        '#tree' => TRUE,
        '#description' => t('The default value for this field, used when creating new content.'),
      ]);
      $form['default_value'] = $element;
    }
    $items
      ->getFieldDefinition()
      ->setDefaultValueCallback('field_default_token_default_value_function');
  }

  /** @var \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_plugin_manager */
  $field_type_plugin_manager = \Drupal::service('plugin.manager.field.field_type');
  $field_type = $field_type_plugin_manager
    ->getDefinition($field_config
    ->getType());
  if (is_subclass_of($field_type['class'], OptionsProviderInterface::class)) {
    $default_value = '';
    foreach ($field_config
      ->getDefaultValueLiteral() as $item) {
      foreach ($item as $value) {
        if (is_array($value)) {
          continue;
        }
        if (strpos($value, '[') !== FALSE) {
          $default_value = $value;
        }
      }
    }
    $form['default_value']['default_value_token'] = [
      '#type' => 'textfield',
      '#title' => t('Token for default value'),
      '#description' => t('If set, this token will be used as the field default value instead.'),
      '#maxlength' => 1024,
      '#default_value' => $default_value,
    ];
  }
  if (isset($form['default_value'])) {
    field_default_token_enlarge_max_length($form['default_value']);
    field_default_token_fix_number_validation($form['default_value']);

    // Allow tokens to be field value labels, not just field values.
    if ($field_config
      ->getSetting('allowed_values')) {
      $form['third_party_settings']['field_default_token']['label_token'] = [
        '#type' => 'checkbox',
        '#title' => t('Token for default value contains field value label, not stored key'),
        '#description' => t('If checked, token value must be field value label from allowed values list of key|label pairs.'),
        '#default_value' => $field_config
          ->getThirdPartySetting('field_default_token', 'label_token', FALSE),
      ];
    }
    $target_entity_type = \Drupal::entityTypeManager()
      ->getDefinition($field_config
      ->getTargetEntityTypeId());
    $token_type = $target_entity_type
      ->get('token_type') ?: $target_entity_type
      ->id();
    $form['default_value']['token_tree'] = [
      '#theme' => 'token_tree_link',
      '#token_types' => [
        $token_type,
      ],
      '#weight' => 200,
    ];
  }

  // Replace validator to disable validation of strings with tokens
  // in Field UI forms.
  foreach ($form['#validate'] as &$validator) {
    if ($validator == '::validateForm') {
      $validator = 'field_default_token_field_config_edit_form_validate';
    }
  }
}