diff --git a/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php b/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php index ce2206bcb10a9ec4f186c7322e661396c7f74aad..f90ecd94d29da606b9fd86676645455a0d82e2d1 100644 --- a/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php +++ b/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php @@ -48,7 +48,7 @@ class ComponentLayout extends LayoutDefault implements ContainerFactoryPluginInt * @param mixed $plugin_definition * The plugin implementation definition. * @param \Drupal\ui_patterns\Resolver\ChainContextEntityResolverInterface $chainContextEntityResolver - * The context helper. + * The context resolver. */ public function __construct( array $configuration, @@ -67,7 +67,7 @@ class ComponentLayout extends LayoutDefault implements ContainerFactoryPluginInt $configuration, $plugin_id, $plugin_definition, - $container->get('ui_patterns.chain_context_entity_resolver') + $container->get('ui_patterns.chain_context_entity_resolver'), ); return $plugin; } @@ -152,12 +152,6 @@ class ComponentLayout extends LayoutDefault implements ContainerFactoryPluginInt return $form; } - /** - * {@inheritdoc} - */ - public function validateConfigurationForm(array &$form, FormStateInterface $form_state) : void { - } - /** * {@inheritdoc} */ diff --git a/src/Element/ComponentForm.php b/src/Element/ComponentForm.php index 89de156be82e3bc4792a0bb9af725fc172c5d587..220bbc0dc964067c376f9c1a86d8756348e93d02 100644 --- a/src/Element/ComponentForm.php +++ b/src/Element/ComponentForm.php @@ -6,6 +6,7 @@ use Drupal\Component\Utility\NestedArray; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\Context\Context; use Drupal\Core\Plugin\Context\ContextDefinition; +use Drupal\Core\Render\RenderContext; /** * Provides a Component form builder element. @@ -116,7 +117,7 @@ class ComponentForm extends ComponentFormBase { $component_selector_form = array_merge(self::buildComponentSelectorForm( $wrapper_id, $component_id - ), ["#ajax_url" => $element["#ajax_url"]]); + ), ["#ajax_url" => $element["#ajax_url"] ?? NULL]); $element["component_id"] = self::expandAjax($component_selector_form); } self::buildComponentForm( @@ -223,7 +224,7 @@ class ComponentForm extends ComponentFormBase { '#component_id' => $component_id, '#source_contexts' => $element['#source_contexts'], '#tag_filter' => $element['#tag_filter'], - '#ajax_url' => $element['#ajax_url'], + '#ajax_url' => $element['#ajax_url'] ?? NULL, '#access' => $element['#render_slots'] ?? TRUE, '#default_value' => [ 'slots' => $element['#default_value']['slots'], @@ -241,7 +242,7 @@ class ComponentForm extends ComponentFormBase { '#component_id' => $component_id, '#source_contexts' => $element['#source_contexts'], '#tag_filter' => $element['#tag_filter'], - '#ajax_url' => $element['#ajax_url'], + '#ajax_url' => $element['#ajax_url'] ?? NULL, '#access' => $element['#render_props'] ?? TRUE, '#default_value' => [ 'props' => $element['#default_value']['props'], @@ -266,9 +267,33 @@ class ComponentForm extends ComponentFormBase { * Form element validation handler. */ public static function validateFormElement(array &$element, FormStateInterface $form_state) : void { - $trigger_element = $form_state->getTriggeringElement(); - if (isset($trigger_element['#ui_patterns']) === FALSE) { - $form_state->setValueForElement($element, $element['#value']); + + try { + $trigger_element = $form_state->getTriggeringElement(); + if (isset($trigger_element['#ui_patterns']) === FALSE) { + $build = [ + '#type' => 'component', + '#component' => $element['#value']['component_id'] ?? $element['#component_id'], + '#ui_patterns' => $element['#value'], + '#source_contexts' => $element['#source_contexts'] ?? [], + ]; + $context = new RenderContext(); + $renderer = \Drupal::service("renderer"); + $renderer->executeInRenderContext($context, function () use (&$build, $renderer) { + return $renderer->render($build); + }); + $form_state->setValueForElement($element, $element['#value']); + } + } + catch (\Throwable $e) { + // If a component_id is we just show the error message instead + // of highlighting the whole form. + if (!empty($element['#component_id'])) { + $form_state->setErrorByName('', $e->getMessage()); + } + else { + $form_state->setError($element['component_id'], $e->getMessage()); + } } }