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

Issue #3488044 by just_like_good_vibes: Fix 'submitted value is not allowed' in component prop form

parent 78aba575
No related branches found
No related tags found
1 merge request!266Issue #3488044 by just_like_good_vibes: Fix 'submitted value is not allowed' in component prop form
Pipeline #345280 passed
......@@ -173,7 +173,6 @@ abstract class DerivableContextSourceBase extends SourcePluginBase {
private function buildDerivableContextSelectorForm(array &$form, FormStateInterface $form_state) : array {
$derivableContexts = $this->listCompatibleDerivableContexts();
$wrapper_id = Html::getId(implode("_", $this->formArrayParents ?? []) . "_derivable_context_selector");
$derivable_context = (string) ($this->getSetting('derivable_context') ?? '');
$options_derivable_contexts = $this->getDerivableContextsOptions($derivableContexts);
$form = [
'#type' => 'container',
......@@ -185,12 +184,12 @@ abstract class DerivableContextSourceBase extends SourcePluginBase {
];
return $form;
}
$derivable_context = $this->getSelectedDerivableContext($form_state, $options_derivable_contexts);
$form["derivable_context"] = [
"#type" => "select",
"#title" => $this->t("Context"),
"#options" => $options_derivable_contexts,
'#default_value' => $derivable_context,
'#ajax' => [
'callback' => [__CLASS__, 'onDerivableContextChange'],
'wrapper' => $wrapper_id,
......@@ -247,6 +246,41 @@ abstract class DerivableContextSourceBase extends SourcePluginBase {
return $form;
}
/**
* Get the selected derivable context and validate it.
*
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
* @param array<string, mixed> $options_derivable_contexts
* The options.
*
* @return string|null
* The selected and validated derivable context.
*/
private function getSelectedDerivableContext(FormStateInterface $form_state, array $options_derivable_contexts) : ?string {
$derivable_context = (string) ($this->getSetting('derivable_context') ?? '');
// Validate the selected derivable context.
if ($derivable_context && !isset($options_derivable_contexts[$derivable_context])) {
// Reset value, or take the first one if only one is available.
$derivable_context = (count($options_derivable_contexts) === 1) ? key($options_derivable_contexts) : NULL;
// Clean up the input if needed
// Covers ComponentPropForm::switchSourceForm() AJAX handler.
if ($form_state->isProcessingInput()) {
$complete_form = $form_state->getCompleteForm();
$prop_form = NestedArray::getValue($complete_form, $this->formArrayParents);
$input = $form_state->getUserInput();
$prop_input = &NestedArray::getValue($input, $prop_form["#parents"]);
if (isset($prop_input["source"])) {
unset($prop_input["source"]);
// Reset the user input, form state values
// will be recomputed by FormBuilder.
$form_state->setUserInput($input);
}
}
}
return $derivable_context;
}
/**
* Get derivable contexts options.
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment