diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php index dd6481e..1bef225 100644 --- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php +++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php @@ -310,6 +310,14 @@ public function calculateDependencies() { foreach($plugin_bag as $instance) { $definition = $instance->getPluginDefinition(); $this->addDependency('module', $definition['provider']); + // Plugins can declare additional dependencies in their definition. + if (isset($definition['config_dependencies'])) { + foreach ($definition['config_dependencies'] as $type => $dependencies) { + foreach ($dependencies as $dependency) { + $this->addDependency($type, $dependency); + } + } + } } } return $this->dependencies; diff --git a/core/modules/block/tests/Drupal/block/Tests/BlockConfigEntityUnitTest.php b/core/modules/block/tests/Drupal/block/Tests/BlockConfigEntityUnitTest.php index 98d8d6d..41d29cb 100644 --- a/core/modules/block/tests/Drupal/block/Tests/BlockConfigEntityUnitTest.php +++ b/core/modules/block/tests/Drupal/block/Tests/BlockConfigEntityUnitTest.php @@ -93,9 +93,19 @@ public function testCalculateDependencies() { ->setConstructorArgs(array($values, $this->entityTypeId)) ->setMethods(array('getPluginBag')) ->getMock(); - // Create a configurable plugin that would add a dependency. + + // Create a configurable plugin that would add dependencies. $instance_id = $this->randomName(); - $instance = new TestConfigurablePlugin(array(), $instance_id, array('provider' => 'test')); + $instance_dependency_1 = $this->randomName(10); + $instance_dependency_2 = $this->randomName(11); + $plugin_definition = array( + 'provider' => 'test', + 'config_dependencies' => array( + 'entity' => array($instance_dependency_1), + 'module' => array($instance_dependency_2), + ) + ); + $instance = new TestConfigurablePlugin(array(), $instance_id, $plugin_definition); // Create a plugin bag to contain the instance. $plugin_bag = $this->getMockBuilder('\Drupal\Core\Plugin\DefaultPluginBag') @@ -116,6 +126,8 @@ public function testCalculateDependencies() { $dependencies = $entity->calculateDependencies(); $this->assertContains('test', $dependencies['module']); $this->assertContains('stark', $dependencies['theme']); + $this->assertContains($instance_dependency_1, $dependencies['entity']); + $this->assertContains($instance_dependency_2, $dependencies['module']); } } diff --git a/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php b/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php index c09eb10..9b06eb3 100644 --- a/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php +++ b/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php @@ -52,6 +52,7 @@ public function getDerivativeDefinitions($base_plugin_definition) { foreach ($this->menuStorage->loadMultiple() as $menu => $entity) { $this->derivatives[$menu] = $base_plugin_definition; $this->derivatives[$menu]['admin_label'] = $entity->label(); + $this->derivatives[$menu]['config_dependencies']['entity'] = array($entity->getConfigDependencyName()); } return $this->derivatives; } diff --git a/core/modules/system/lib/Drupal/system/Tests/Block/SystemMenuBlockTest.php b/core/modules/system/lib/Drupal/system/Tests/Block/SystemMenuBlockTest.php new file mode 100644 index 0000000..11af793 --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Tests/Block/SystemMenuBlockTest.php @@ -0,0 +1,66 @@ + 'System menu block test', + 'description' => 'Tests \Drupal\system\Plugin\Block\SystemMenuBlock.', + 'group' => 'System blocks', + ); + } + + public function testSystemMenuBlockConfigDependencies() { + // Add a new custom menu. + $menu_name = $this->randomName(16); + $label = $this->randomName(16); + + $menu = entity_create('menu', array( + 'id' => $menu_name, + 'label' => $label, + 'description' => 'Description text', + )); + $menu->save(); + + $block = entity_create('block', array( + 'plugin' => 'system_menu_block:'. $menu->id(), + 'region' => 'footer', + 'id' => 'machinename', + 'theme' => 'stark', + )); + + $dependencies = $block->calculateDependencies(); + $expected = array( + 'entity' => array( + 'system.menu.' . $menu->id() + ), + 'module' => array( + 'system' + ), + 'theme' => array( + 'stark' + ), + ); + $this->assertIdentical($expected, $dependencies); + } +} diff --git a/core/profiles/minimal/config/block.block.stark_admin.yml b/core/profiles/minimal/config/block.block.stark_admin.yml index 0895e7e..5d5c2c1 100644 --- a/core/profiles/minimal/config/block.block.stark_admin.yml +++ b/core/profiles/minimal/config/block.block.stark_admin.yml @@ -18,6 +18,8 @@ visibility: node_type: types: { } dependencies: + entity: + - system.menu.admin module: - system theme: diff --git a/core/profiles/minimal/config/block.block.stark_tools.yml b/core/profiles/minimal/config/block.block.stark_tools.yml index c9ff31b..36481b3 100644 --- a/core/profiles/minimal/config/block.block.stark_tools.yml +++ b/core/profiles/minimal/config/block.block.stark_tools.yml @@ -18,6 +18,8 @@ visibility: node_type: types: { } dependencies: + entity: + - system.menu.tools module: - system theme: diff --git a/core/profiles/standard/config/block.block.bartik_footer.yml b/core/profiles/standard/config/block.block.bartik_footer.yml index 85451c7..ef96ea9 100644 --- a/core/profiles/standard/config/block.block.bartik_footer.yml +++ b/core/profiles/standard/config/block.block.bartik_footer.yml @@ -20,6 +20,8 @@ visibility: article: '0' page: '0' dependencies: + entity: + - system.menu.footer module: - system theme: diff --git a/core/profiles/standard/config/block.block.bartik_tools.yml b/core/profiles/standard/config/block.block.bartik_tools.yml index 6300b79..12efff1 100644 --- a/core/profiles/standard/config/block.block.bartik_tools.yml +++ b/core/profiles/standard/config/block.block.bartik_tools.yml @@ -20,6 +20,8 @@ visibility: article: '0' page: '0' dependencies: + entity: + - system.menu.tools module: - system theme: