diff --git a/core/lib/Drupal/Core/Entity/ContentEntityFormController.php b/core/lib/Drupal/Core/Entity/ContentEntityFormController.php index 7f613bc..5062444 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityFormController.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityFormController.php @@ -48,12 +48,7 @@ public static function create(ContainerInterface $container) { */ public function form(array $form, array &$form_state) { $entity = $this->entity; - // @todo Exploit the Field API to generate the default widgets for the - // entity fields. - $info = $entity->entityInfo(); - if (!empty($info['fieldable'])) { - field_attach_form($entity, $form, $form_state, $this->getFormLangcode($form_state)); - } + $this->attachWidgets($entity, $form, $form_state); // Add a process callback so we can assign weights and hide extra fields. $form['#process'][] = array($this, 'processForm'); @@ -61,32 +56,49 @@ public function form(array $form, array &$form_state) { return $form; } + public function attachWidgets(EntityInterface $entity, &$form, &$form_state) { + // Set #parents to 'top-level' by default. + $form += array('#parents' => array()); + + // Let each widget generate the form elements. + $form_display = $form_state['form_display']; + foreach ($entity as $name => $items) { + $items->filterEmptyValues(); + if ($widget = $form_display->getRenderer($name)) { + $form += $widget->form($items, $form, $form_state); + } + } + + $form['#entity_type'] = $entity->entityType(); + $form['#bundle'] = $entity->bundle(); + } + /** * {@inheritdoc} */ public function validate(array $form, array &$form_state) { $this->updateFormLangcode($form_state); $entity = $this->buildEntity($form, $form_state); - $entity_type = $entity->entityType(); - $entity_langcode = $entity->language()->id; $violations = array(); - foreach ($entity as $field_name => $field) { - $field_violations = $field->validate(); + foreach ($entity as $name => $items) { + $field_violations = $items->validate(); if (count($field_violations)) { - $violations[$field_name] = $field_violations; + $violations[$name] = $field_violations; } } // Map errors back to form elements. + $form_display = $form_state['form_display']; if ($violations) { foreach ($violations as $field_name => $field_violations) { $field_state = field_form_get_state($form['#parents'], $field_name, $form_state); $field_state['constraint_violations'] = $field_violations; field_form_set_state($form['#parents'], $field_name, $form_state, $field_state); + if ($widget = $form_display->getRenderer($name)) { + $widget->flagErrors($items, $form, $form_state); + } } - - field_invoke_method('flagErrors', _field_invoke_widget_target($form_state['form_display']), $entity, $form, $form_state); } // @todo Remove this. @@ -154,10 +166,14 @@ public function buildEntity(array $form, array &$form_state) { } } - // Invoke field API for copying field values. - if ($info['fieldable']) { - field_attach_extract_form_values($entity, $form, $form_state, array('langcode' => $this->getFormLangcode($form_state))); + // Extract widget values. + $form_display = $form_state['form_display']; + foreach ($entity as $name => $items) { + if ($widget = $form_display->getRenderer($name)) { + $widget->extractFormValues($items, $form, $form_state); + } } + return $entity; } diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php index d53673c..ccb0fdd 100644 --- a/core/modules/node/node.api.php +++ b/core/modules/node/node.api.php @@ -753,9 +753,7 @@ function hook_node_validate(\Drupal\Core\Entity\EntityInterface $node, $form, &$ * "Preview" button, after form values have been copied to the form state's node * object, but before the node is saved or previewed. It is a chance for modules * to adjust the node's properties from what they are simply after a copy from - * $form_state['values']. This hook is intended for adjusting non-field-related - * properties. See hook_field_attach_extract_form_values() for customizing - * field-related properties. + * $form_state['values']. * * @param \Drupal\Core\Entity\EntityInterface $node * The node entity being updated in response to a form submission. diff --git a/core/modules/user/lib/Drupal/user/RegisterFormController.php b/core/modules/user/lib/Drupal/user/RegisterFormController.php index 38612a2..7acaa4a 100644 --- a/core/modules/user/lib/Drupal/user/RegisterFormController.php +++ b/core/modules/user/lib/Drupal/user/RegisterFormController.php @@ -42,9 +42,6 @@ public function form(array $form, array &$form_state) { // Start with the default user account fields. $form = parent::form($form, $form_state, $account); - // Attach field widgets. - field_attach_form($account, $form, $form_state); - if ($admin) { // Redirect back to page which initiated the create request; usually // admin/people/create.