Skip to content
Snippets Groups Projects
Commit 509f9979 authored by Mikael Meulle's avatar Mikael Meulle Committed by Pierre Dureau
Browse files

fixed

parent 1906eb4c
Branches
Tags
No related merge requests found
......@@ -72,9 +72,46 @@ class ComponentForm extends ComponentFormBase {
[$class, 'validateFormElement'],
],
'#theme_wrappers' => ['form_element'],
'#after_build' => [
[$class, 'afterBuild'],
],
];
}
/**
* Alter the element after the form is built.
*
* @param array $element
* The element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*
* @return array
* The altered element.
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public static function afterBuild(array $element, FormStateInterface $form_state) : array {
if ($form_state->isProcessingInput()) {
// For browser-submitted forms, the submitted values do not contain
// values for certain elements (empty multiple select, unchecked
// checkbox). Child elements are processed after the parent element,
// The processed values, stored in '#value', are bubbled up to the
// parent element here and then copied to the form state.
if (isset($element['#value'])) {
if (isset($element['slots']) && isset($element['slots']['#value'])) {
$element['#value']['slots'] = $element['slots']['#value'];
}
if (isset($element['props']) && isset($element['props']['#value'])) {
$element['#value']['props'] = $element['props']['#value'];
}
}
}
// Recopy the value to the form state.
$form_state->setValueForElement($element, $element['#value']);
return $element;
}
/**
* {@inheritdoc}
*/
......@@ -309,7 +346,6 @@ class ComponentForm extends ComponentFormBase {
return;
}
if (isset($element["#component_validation"]) && !$element["#component_validation"]) {
$form_state->setValueForElement($element, $element['#value']);
return;
}
try {
......@@ -326,7 +362,6 @@ class ComponentForm extends ComponentFormBase {
$renderer->executeInRenderContext($context, function () use (&$build, $renderer) {
return $renderer->render($build);
});
$form_state->setValueForElement($element, $element['#value']);
}
}
catch (\Throwable $e) {
......
......@@ -64,9 +64,38 @@ class ComponentPropForm extends ComponentFormBase {
[$class, 'preRenderPropOrSlot'],
],
'#theme_wrappers' => [],
'#after_build' => [
[$class, 'afterBuild'],
],
];
}
/**
* Alter the element after the form is built.
*
* @param array $element
* The element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*
* @return array
* The altered element.
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public static function afterBuild(array $element, FormStateInterface $form_state) : array {
if ($form_state->isProcessingInput()) {
// For browser-submitted forms, the submitted values do not contain
// values for certain elements (empty multiple select, unchecked
// checkbox). Child elements are processed after the parent element,
// The processed values, stored in the form_state, are propagated
// to the '#value' of the element here (parents will process).
$element['#value'] = $form_state->getValue($element['#parents']);
// Values may need to be cleaned if the form evolves.
}
return $element;
}
/**
* Build props forms.
*/
......
......@@ -80,9 +80,60 @@ class ComponentSlotForm extends ComponentFormBase {
],
"#wrap" => TRUE,
"#title_in_component" => NULL,
'#after_build' => [
[$class, 'afterBuild'],
],
];
}
/**
* Alter the element after the form is built.
*
* @param array $element
* The element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*
* @return array
* The altered element.
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public static function afterBuild(array $element, FormStateInterface $form_state) : array {
if ($form_state->isProcessingInput()) {
// For browser-submitted forms, the submitted values do not contain
// values for certain elements (empty multiple select, unchecked
// checkbox). Child elements are processed after the parent element,
// The processed values, stored in the form_state, are propagated
// to the '#value' of the element here (parents will process).
$element['#value'] = $form_state->getValue($element['#parents']);
// Values are cleaned
// similarly to $form_state->cleanValues();
self::cleanValues($element['#value']);
}
return $element;
}
/**
* Clean values.
*
* @param array $value
* Value to clean.
*/
private static function cleanValues(array &$value) : void {
if (isset($value['add_more_button'])) {
unset($value['add_more_button']);
}
if (isset($value['sources'])) {
foreach (Element::children($value['sources']) as $delta) {
$source = &$value['sources'][$delta];
if (isset($source['_remove'])) {
unset($source['_remove']);
}
}
}
}
/**
* Handle the rebuild of the form and operations.
*/
......
......@@ -53,9 +53,41 @@ class ComponentSlotsForm extends ComponentFormBase {
'#process' => [
[$class, 'buildForm'],
],
'#after_build' => [
[$class, 'afterBuild'],
],
];
}
/**
* Alter the element after the form is built.
*
* @param array $element
* The element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*
* @return array
* The altered element.
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public static function afterBuild(array $element, FormStateInterface $form_state) : array {
if ($form_state->isProcessingInput() && isset($element['#value']) && is_array($element['#value'])) {
// For browser-submitted forms, the submitted values do not contain
// values for certain elements (empty multiple select, unchecked
// checkbox). Child elements are processed after the parent element,
// The processed values, stored in '#value', are bubbled up to the
// parent element here.
foreach ($element['#value'] as $slot => &$slot_value) {
if (isset($element[$slot]) && isset($element[$slot]['#value'])) {
$slot_value = $element[$slot]['#value'];
}
}
}
return $element;
}
/**
* Processes slots form element.
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment