X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Ffield_ui%2Fsrc%2FForm%2FFieldStorageConfigEditForm.php;h=6ec88c9788d6d85d179962b642b0e8ce720a3696;hb=1c1cb0980bfa6caf0c24cce671b6bb541dc87583;hp=a0c1294d9da15cc6e823bbd11b2fa98f0103bb9d;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website diff --git a/web/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php b/web/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php index a0c1294d9..6ec88c978 100644 --- a/web/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php +++ b/web/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php @@ -12,6 +12,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Provides a form for the "field storage" edit page. + * + * @internal */ class FieldStorageConfigEditForm extends EntityForm { @@ -82,52 +84,79 @@ class FieldStorageConfigEditForm extends EntityForm { $ids = (object) [ 'entity_type' => $form_state->get('entity_type_id'), 'bundle' => $form_state->get('bundle'), - 'entity_id' => NULL + 'entity_id' => NULL, ]; $entity = _field_create_entity_from_ids($ids); $items = $entity->get($this->entity->getName()); $item = $items->first() ?: $items->appendItem(); $form['settings'] += $item->storageSettingsForm($form, $form_state, $this->entity->hasData()); - // Build the configurable field values. - $cardinality = $this->entity->getCardinality(); - $form['cardinality_container'] = [ + // Add the cardinality sub-form. + $form['cardinality_container'] = $this->getCardinalityForm(); + + return $form; + } + + /** + * Builds the cardinality form. + * + * @return array + * The cardinality form render array. + */ + protected function getCardinalityForm() { + $form = [ // Reset #parents so the additional container does not appear. '#parents' => [], '#type' => 'fieldset', '#title' => $this->t('Allowed number of values'), - '#attributes' => ['class' => [ - 'container-inline', - 'fieldgroup', - 'form-composite' - ]], - ]; - $form['cardinality_container']['cardinality'] = [ - '#type' => 'select', - '#title' => $this->t('Allowed number of values'), - '#title_display' => 'invisible', - '#options' => [ - 'number' => $this->t('Limited'), - FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED => $this->t('Unlimited'), + '#attributes' => [ + 'class' => [ + 'container-inline', + 'fieldgroup', + 'form-composite', + ], ], - '#default_value' => ($cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) ? FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED : 'number', ]; - $form['cardinality_container']['cardinality_number'] = [ - '#type' => 'number', - '#default_value' => $cardinality != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ? $cardinality : 1, - '#min' => 1, - '#title' => $this->t('Limit'), - '#title_display' => 'invisible', - '#size' => 2, - '#states' => [ - 'visible' => [ - ':input[name="cardinality"]' => ['value' => 'number'], + + if ($enforced_cardinality = $this->getEnforcedCardinality()) { + if ($enforced_cardinality === FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) { + $markup = $this->t("This field cardinality is set to unlimited and cannot be configured."); + } + else { + $markup = $this->t("This field cardinality is set to @cardinality and cannot be configured.", ['@cardinality' => $enforced_cardinality]); + } + $form['cardinality'] = ['#markup' => $markup]; + } + else { + $form['#element_validate'][] = '::validateCardinality'; + $cardinality = $this->entity->getCardinality(); + $form['cardinality'] = [ + '#type' => 'select', + '#title' => $this->t('Allowed number of values'), + '#title_display' => 'invisible', + '#options' => [ + 'number' => $this->t('Limited'), + FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED => $this->t('Unlimited'), ], - 'disabled' => [ - ':input[name="cardinality"]' => ['value' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED], + '#default_value' => ($cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) ? FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED : 'number', + ]; + $form['cardinality_number'] = [ + '#type' => 'number', + '#default_value' => $cardinality != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ? $cardinality : 1, + '#min' => 1, + '#title' => $this->t('Limit'), + '#title_display' => 'invisible', + '#size' => 2, + '#states' => [ + 'visible' => [ + ':input[name="cardinality"]' => ['value' => 'number'], + ], + 'disabled' => [ + ':input[name="cardinality"]' => ['value' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED], + ], ], - ], - ]; + ]; + } return $form; } @@ -143,16 +172,19 @@ class FieldStorageConfigEditForm extends EntityForm { } /** - * {@inheritdoc} + * Validates the cardinality. + * + * @param array $element + * The cardinality form render array. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state. */ - public function validateForm(array &$form, FormStateInterface $form_state) { - parent::validateForm($form, $form_state); - + public function validateCardinality(array &$element, FormStateInterface $form_state) { $field_storage_definitions = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions($this->entity->getTargetEntityTypeId()); // Validate field cardinality. if ($form_state->getValue('cardinality') === 'number' && !$form_state->getValue('cardinality_number')) { - $form_state->setErrorByName('cardinality_number', $this->t('Number of values is required.')); + $form_state->setError($element['cardinality_number'], $this->t('Number of values is required.')); } // If a specific cardinality is used, validate that there are no entities // with a higher delta. @@ -166,7 +198,7 @@ class FieldStorageConfigEditForm extends EntityForm { ->count() ->execute(); if ($entities_with_higher_delta) { - $form_state->setErrorByName('cardinality_number', $this->formatPlural($entities_with_higher_delta, 'There is @count entity with @delta or more values in this field.', 'There are @count entities with @delta or more values in this field.', ['@delta' => $form_state->getValue('cardinality') + 1])); + $form_state->setError($element['cardinality_number'], $this->formatPlural($entities_with_higher_delta, 'There is @count entity with @delta or more values in this field.', 'There are @count entities with @delta or more values in this field.', ['@delta' => $form_state->getValue('cardinality') + 1])); } } } @@ -176,7 +208,7 @@ class FieldStorageConfigEditForm extends EntityForm { */ public function buildEntity(array $form, FormStateInterface $form_state) { // Save field cardinality. - if ($form_state->getValue('cardinality') === 'number' && $form_state->getValue('cardinality_number')) { + if (!$this->getEnforcedCardinality() && $form_state->getValue('cardinality') === 'number' && $form_state->getValue('cardinality_number')) { $form_state->setValue('cardinality', $form_state->getValue('cardinality_number')); } @@ -190,7 +222,7 @@ class FieldStorageConfigEditForm extends EntityForm { $field_label = $form_state->get('field_config')->label(); try { $this->entity->save(); - drupal_set_message($this->t('Updated field %label field settings.', ['%label' => $field_label])); + $this->messenger()->addStatus($this->t('Updated field %label field settings.', ['%label' => $field_label])); $request = $this->getRequest(); if (($destinations = $request->query->get('destinations')) && $next_destination = FieldUI::getNextDestination($destinations)) { $request->query->remove('destinations'); @@ -201,8 +233,23 @@ class FieldStorageConfigEditForm extends EntityForm { } } catch (\Exception $e) { - drupal_set_message($this->t('Attempt to update field %label failed: %message.', ['%label' => $field_label, '%message' => $e->getMessage()]), 'error'); + $this->messenger()->addStatus($this->t('Attempt to update field %label failed: %message.', ['%label' => $field_label, '%message' => $e->getMessage()])); } } + /** + * Returns the cardinality enforced by the field type. + * + * Some field types choose to enforce a fixed cardinality. This method + * returns that cardinality or NULL if no cardinality has been enforced. + * + * @return int|null + */ + protected function getEnforcedCardinality() { + /** @var \Drupal\Core\Field\FieldTypePluginManager $field_type_manager */ + $field_type_manager = \Drupal::service('plugin.manager.field.field_type'); + $definition = $field_type_manager->getDefinition($this->entity->getType()); + return isset($definition['cardinality']) ? $definition['cardinality'] : NULL; + } + }