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';
}
}
}