Skip to content
Snippets Groups Projects
Commit db2804b5 authored by catch's avatar catch
Browse files

Issue #3504368 by godotislate, dpagini, smustgrave: Removing field from LB...

Issue #3504368 by godotislate, dpagini, smustgrave: Removing field from LB content type edits associated roles

(cherry picked from commit 0fac8cc7)
parent 8a5dd952
No related branches found
No related tags found
4 merge requests!12227Issue #3181946 by jonmcl, mglaman,!12079Issue #3523476 by matthiasm11: Add empty check on operator,!12024Fix: DocBlock comment for return value of Drupal\Core\Database\Connection::transactionManager(),!11974Draft: Issue #3495165 by catch, joeyroth, berdir, texas-bronius: Better warning...
Pipeline #481766 passed with warnings
Pipeline: drupal

#481773

    ...@@ -294,17 +294,21 @@ public function findConfigEntityDependenciesAsEntities($type, array $names, ?Con ...@@ -294,17 +294,21 @@ public function findConfigEntityDependenciesAsEntities($type, array $names, ?Con
    // a UUID key. // a UUID key.
    if ($entity_type_id) { if ($entity_type_id) {
    $id = substr($config_name, strlen($definitions[$entity_type_id]->getConfigPrefix()) + 1); $id = substr($config_name, strlen($definitions[$entity_type_id]->getConfigPrefix()) + 1);
    $entities[$entity_type_id][] = $id; $entities[$entity_type_id][$config_name] = $id;
    } }
    } }
    $entities_to_return = []; // Align the order of entities returned to the dependency order by first
    // populating the keys in the same order.
    $entities_to_return = array_fill_keys(array_keys($dependencies), NULL);
    foreach ($entities as $entity_type_id => $entities_to_load) { foreach ($entities as $entity_type_id => $entities_to_load) {
    $storage = $this->entityTypeManager->getStorage($entity_type_id); $storage = $this->entityTypeManager->getStorage($entity_type_id);
    // Remove the keys since there are potential ID clashes from different $loaded_entities = $storage->loadMultiple($entities_to_load);
    // configuration entity types. foreach ($loaded_entities as $loaded_entity) {
    $entities_to_return[] = array_values($storage->loadMultiple($entities_to_load)); $entities_to_return[$loaded_entity->getConfigDependencyName()] = $loaded_entity;
    } }
    return array_merge(...$entities_to_return); }
    // Return entities list with NULL entries removed.
    return array_filter($entities_to_return);
    } }
    /** /**
    ......
    permission_callbacks:
    - \Drupal\config_test\ConfigTestPermissions::configTestPermissions
    <?php
    declare(strict_types=1);
    namespace Drupal\config_test;
    use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
    use Drupal\Core\Entity\EntityTypeManagerInterface;
    use Drupal\Core\StringTranslation\StringTranslationTrait;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    /**
    * Provide dynamic permissions for testing permission dependencies on config.
    */
    class ConfigTestPermissions implements ContainerInjectionInterface {
    use StringTranslationTrait;
    public function __construct(protected EntityTypeManagerInterface $entityTypeManager) {}
    /**
    * {@inheritdoc}
    */
    public static function create(ContainerInterface $container): static {
    return new static(
    $container->get('entity_type.manager'),
    );
    }
    /**
    * Permissions callback.
    *
    * @return array
    * The list of permissions.
    */
    public function configTestPermissions(): array {
    /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface[] $entities */
    $entities = $this->entityTypeManager->getStorage('config_test')->loadMultiple();
    $permissions = [];
    foreach ($entities as $entity) {
    $config_name = $entity->getConfigDependencyName();
    $permissions["permission with $config_name dependency"] = [
    'title' => $this->t('Permission with a dependency on config test entity %id', [
    '%id' => $entity->id(),
    ]),
    'dependencies' => [$entity->getConfigDependencyKey() => [$config_name]],
    ];
    }
    return $permissions;
    }
    }
    ...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
    use Drupal\entity_test\Entity\EntityTest; use Drupal\entity_test\Entity\EntityTest;
    use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
    use Drupal\user\Entity\Role;
    /** /**
    * Tests for configuration dependencies. * Tests for configuration dependencies.
    ...@@ -640,6 +641,57 @@ public function testContentEntityDelete(): void { ...@@ -640,6 +641,57 @@ public function testContentEntityDelete(): void {
    $this->assertEmpty($config_entities['unchanged'], 'No dependencies of the content entity will be unchanged.'); $this->assertEmpty($config_entities['unchanged'], 'No dependencies of the content entity will be unchanged.');
    } }
    /**
    * Tests that config dependency ordering.
    */
    public function testDependencyOrder(): void {
    $storage = $this->container->get('entity_type.manager')->getStorage('config_test');
    // Test dependencies between modules.
    $entity1 = $storage->create(['id' => 'entity1']);
    $entity1->save();
    // Create additional entities to test dependencies on config entities.
    $entity2 = $storage->create(['id' => 'entity2', 'dependencies' => ['enforced' => ['config' => [$entity1->getConfigDependencyName()]]]]);
    $entity2->save();
    $entity3 = $storage->create(['id' => 'entity3', 'dependencies' => ['enforced' => ['config' => [$entity1->getConfigDependencyName()]]]]);
    $entity3->save();
    // Include a role entity to test ordering when dependencies have multiple
    // entity types.
    $role = Role::create([
    'id' => 'test_role',
    'label' => 'Test role',
    // This adds an implicit dependency on $entity 2, and hence also $entity1,
    // to the role.
    'permissions' => ["permission with {$entity2->getConfigDependencyName()} dependency"],
    ]);
    $role->save();
    $entity4 = $storage->create([
    'id' => 'entity4',
    'dependencies' => [
    'enforced' => [
    'config' => [
    // Add dependencies to $entity3 and the role so that the $entity4
    // should be last to be processed when handling dependency removal.
    // The role should be processed after $entity1 and $entity2, but
    // before $entity4.
    $entity3->getConfigDependencyName(),
    $role->getConfigDependencyName(),
    ],
    ],
    ],
    ]);
    $entity4->save();
    // Create scenario where entity1 is deleted, but all the config_test
    // entities depending on entity1 are fixed instead of being deleted. This
    // means that entity2 is not deleted, so the role should not lose the
    // permission depending on entity2.
    \Drupal::state()->set('config_test.fix_dependencies', ['config_test.dynamic.entity1']);
    $entity1->delete();
    $role = Role::load('test_role');
    $this->assertNotNull($role);
    $this->assertTrue($role->hasPermission("permission with {$entity2->getConfigDependencyName()} dependency"));
    }
    /** /**
    * Gets a list of identifiers from an array of configuration entities. * Gets a list of identifiers from an array of configuration entities.
    * *
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment