Skip to content
Snippets Groups Projects
Verified Commit b7540532 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3401186 by Wim Leers, alexpott: Follow-up for #3382510: Throw...

Issue #3401186 by Wim Leers, alexpott: Follow-up for #3382510: Throw \LogicException when >1 #config_target in the same form targets the same property path
parent 8aa03123
No related branches found
No related tags found
38 merge requests!8528Issue #3456871 by Tim Bozeman: Support NULL services,!8323Fix source code editing and in place front page site studio editing.,!6278Issue #3187770 by godotislate, smustgrave, catch, quietone: Views Rendered...,!54479.5.x SF update,!3878Removed unused condition head title for views,!38582585169-10.1.x,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3668Resolve #3347842 "Deprecate the trusted",!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3546refactored dialog.pcss file,!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3502Issue #3335308: Confusing behavior with FormState::setFormState and FormState::setMethod,!3452Issue #3332701: Refactor Claro's tablesort-indicator stylesheet,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3226Issue #2987537: Custom menu link entity type should not declare "bundle" entity key,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3147Issue #3328457: Replace most substr($a, $i) where $i is negative with str_ends_with(),!3146Issue #3328456: Replace substr($a, 0, $i) with str_starts_with(),!3133core/modules/system/css/components/hidden.module.css,!2964Issue #2865710 : Dependencies from only one instance of a widget are used in display modes,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2614Issue #2981326: Replace non-test usages of \Drupal::logger() with IoC injection,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!877Issue #2708101: Default value for link text is not saved,!844Resolve #3036010 "Updaters",!673Issue #3214208: FinishResponseSubscriber could create duplicate headers,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493
Pipeline #49821 passed
Pipeline: drupal

#49822

    ......@@ -136,6 +136,14 @@ public function storeConfigKeyToFormElementMap(array $element, FormStateInterfac
    $target = ConfigTarget::fromString($target);
    }
    foreach ($target->propertyPaths as $property_path) {
    if (isset($map[$target->configName][$property_path])) {
    throw new \LogicException(sprintf('Two #config_targets both target "%s" in the "%s" config: `%s` and `%s`.',
    $property_path,
    $target->configName,
    '$form[\'' . implode("']['", $map[$target->configName][$property_path]) . '\']',
    '$form[\'' . implode("']['", $element['#array_parents']) . '\']',
    ));
    }
    $map[$target->configName][$property_path] = $element['#array_parents'];
    }
    $form_state->set(static::CONFIG_KEY_TO_FORM_ELEMENT_MAP, $map);
    ......
    ......@@ -3,9 +3,14 @@
    namespace Drupal\Tests\Core\Form;
    use Drupal\Core\Config\Config;
    use Drupal\Core\Config\ConfigFactoryInterface;
    use Drupal\Core\Config\TypedConfigManagerInterface;
    use Drupal\Core\Form\ConfigFormBase;
    use Drupal\Core\Form\ConfigTarget;
    use Drupal\Core\Form\ToConfig;
    use Drupal\Core\Form\FormStateInterface;
    use Drupal\Core\Form\FormState;
    use Drupal\Core\Form\RedundantEditableConfigNamesTrait;
    use Drupal\Tests\UnitTestCase;
    use Prophecy\Argument;
    ......@@ -15,6 +20,45 @@
    */
    class ConfigTargetTest extends UnitTestCase {
    /**
    * @covers \Drupal\Core\Form\ConfigFormBase::storeConfigKeyToFormElementMap
    */
    public function testDuplicateTargetsNotAllowed(): void {
    $form = [
    'test' => [
    '#type' => 'text',
    '#default_value' => 'A test',
    '#config_target' => new ConfigTarget('system.site', 'admin_compact_mode', 'intval', 'boolval'),
    '#name' => 'test',
    '#array_parents' => ['test'],
    ],
    'duplicate' => [
    '#type' => 'text',
    '#config_target' => new ConfigTarget('system.site', 'admin_compact_mode', 'intval', 'boolval'),
    '#name' => 'duplicate',
    '#array_parents' => ['duplicate'],
    ],
    ];
    $test_form = new class(
    $this->prophesize(ConfigFactoryInterface::class)->reveal(),
    $this->prophesize(TypedConfigManagerInterface::class)->reveal(),
    ) extends ConfigFormBase {
    use RedundantEditableConfigNamesTrait;
    public function getFormId() {
    return 'test';
    }
    };
    $form_state = new FormState();
    $test_form->storeConfigKeyToFormElementMap($form['test'], $form_state);
    $this->expectException(\LogicException::class);
    $this->expectExceptionMessage('Two #config_targets both target "admin_compact_mode" in the "system.site" config: `$form[\'test\']` and `$form[\'duplicate\']`.');
    $test_form->storeConfigKeyToFormElementMap($form['duplicate'], $form_state);
    }
    /**
    * @covers ::fromForm
    * @covers ::fromString
    ......
    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