diff --git a/core/lib/Drupal/Core/Condition/ConditionPluginBag.php b/core/lib/Drupal/Core/Condition/ConditionPluginBag.php index b15f302..acb0fce 100644 --- a/core/lib/Drupal/Core/Condition/ConditionPluginBag.php +++ b/core/lib/Drupal/Core/Condition/ConditionPluginBag.php @@ -23,4 +23,21 @@ public function &get($instance_id) { return parent::get($instance_id); } + /** + * {@inheritdoc} + */ + public function getConfiguration() { + $configuration = parent::getConfiguration(); + // Remove configuration if it matches the defaults. + foreach ($configuration as $instance_id => $instance_config) { + $default_config = array(); + $default_config['id'] = $instance_id; + $default_config += $this->get($instance_id)->defaultConfiguration(); + if ($default_config === $instance_config) { + unset($configuration[$instance_id]); + } + } + return $configuration; + } + } diff --git a/core/modules/block/block.module b/core/modules/block/block.module index db363dd..a6f8f2c 100644 --- a/core/modules/block/block.module +++ b/core/modules/block/block.module @@ -376,11 +376,10 @@ function template_preprocess_block(&$variables) { function block_user_role_delete($role) { foreach (entity_load_multiple('block') as $block) { /** @var $block \Drupal\block\BlockInterface */ - $visibility_conditions = $block->getPlugin()->getVisibilityConditions(); - $visibility = $visibility_conditions->getConfiguration(); - if (isset($visibility['roles']['roles'][$role->id()])) { - unset($visibility['roles']['roles'][$role->id()]); - $visibility_conditions->setConfiguration($visibility); + $visibility = $block->getVisibility(); + if (isset($visibility['user_role']['roles'][$role->id()])) { + unset($visibility['user_role']['roles'][$role->id()]); + $block->getPlugin()->setVisibilityConfig('user_role', $visibility['user_role']); $block->save(); } } @@ -408,11 +407,10 @@ function block_language_entity_delete(Language $language) { // Remove the block visibility settings for the deleted language. foreach (entity_load_multiple('block') as $block) { /** @var $block \Drupal\block\BlockInterface */ - $visibility_conditions = $block->getPlugin()->getVisibilityConditions(); - $visibility = $visibility_conditions->getConfiguration(); + $visibility = $block->getVisibility(); if (isset($visibility['language']['langcodes'][$language->id()])) { unset($visibility['language']['langcodes'][$language->id()]); - $visibility_conditions->setConfiguration($visibility); + $block->getPlugin()->setVisibilityConfig('language', $visibility['language']); $block->save(); } } diff --git a/core/modules/block/src/BlockBase.php b/core/modules/block/src/BlockBase.php index d4b5ee1..982559b 100644 --- a/core/modules/block/src/BlockBase.php +++ b/core/modules/block/src/BlockBase.php @@ -18,6 +18,7 @@ use Drupal\Core\Cache\Cache; use Drupal\Core\Cache\CacheableInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\node\Entity\Node; use Drupal\user\Entity\User; use Symfony\Cmf\Component\Routing\RouteObjectInterface; @@ -181,16 +182,18 @@ protected function getConditionContexts() { // @todo Use RouteMatch after https://drupal.org/node/2238217. $request = \Drupal::request(); - if ($request->attributes->has(RouteObjectInterface::ROUTE_OBJECT) && $route_contexts = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getOption('parameters')) { - foreach ($route_contexts as $route_context_name => $route_context) { - if ($route_context_name == 'node') { - $context = new Context($route_context); - if ($request->attributes->has($route_context_name)) { - $context->setContextValue($request->attributes->get($route_context_name)); - } - $contexts[$route_context_name] = $context; - } + if ($request->attributes->has(RouteObjectInterface::ROUTE_OBJECT) && ($route_contexts = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getOption('parameters')) && isset($route_contexts['node'])) { + $context = new Context($route_contexts['node']); + if ($request->attributes->has('node')) { + $context->setContextValue($request->attributes->get('node')); } + $contexts['node'] = $context; + } + elseif ($request->attributes->get(RouteObjectInterface::ROUTE_NAME) == 'node.add') { + $node_type = $request->attributes->get('node_type'); + $context = new Context(array('type' => 'entity:node')); + $context->setContextValue(Node::create(array('type' => $node_type->id()))); + $contexts['node'] = $context; } return $contexts; } diff --git a/core/modules/block/src/BlockInterface.php b/core/modules/block/src/BlockInterface.php index de0d9de..fd1544e 100644 --- a/core/modules/block/src/BlockInterface.php +++ b/core/modules/block/src/BlockInterface.php @@ -31,5 +31,6 @@ * The plugin instance for this block. */ public function getPlugin(); + public function getVisibility(); } diff --git a/core/modules/block/src/Entity/Block.php b/core/modules/block/src/Entity/Block.php index d11347a..547b9ff 100644 --- a/core/modules/block/src/Entity/Block.php +++ b/core/modules/block/src/Entity/Block.php @@ -186,4 +186,11 @@ public function getListCacheTags() { return array('theme' => $this->theme); } + /** + * {@inheritdoc} + */ + public function getVisibility() { + return $this->getPlugin()->getVisibilityConditions()->getConfiguration(); + } + } diff --git a/core/modules/block/src/Tests/BlockLanguageTest.php b/core/modules/block/src/Tests/BlockLanguageTest.php index a3a1837..7984345 100644 --- a/core/modules/block/src/Tests/BlockLanguageTest.php +++ b/core/modules/block/src/Tests/BlockLanguageTest.php @@ -100,7 +100,7 @@ public function testLanguageBlockVisibilityLanguageDelete() { $block = $this->drupalPlaceBlock('system_powered_by_block', $edit); // Check that we have the language in config after saving the setting. - $visibility = $block->getPlugin()->getVisibilityConditions()->getConfiguration(); + $visibility = $block->getVisibility(); $language = $visibility['language']['langcodes']['fr']; $this->assertTrue('fr' === $language, 'Language is set in the block configuration.'); @@ -110,7 +110,7 @@ public function testLanguageBlockVisibilityLanguageDelete() { // Check that the language is no longer stored in the configuration after // it is deleted. $block = entity_load('block', $block->id()); - $visibility = $block->getPlugin()->getVisibilityConditions()->getConfiguration(); + $visibility = $block->getVisibility(); $this->assertTrue(empty($visibility['language']['langcodes']['fr']), 'Language is no longer not set in the block configuration after deleting the block.'); } diff --git a/core/modules/language/src/Plugin/Condition/Language.php b/core/modules/language/src/Plugin/Condition/Language.php index ff64464..575065c 100644 --- a/core/modules/language/src/Plugin/Condition/Language.php +++ b/core/modules/language/src/Plugin/Condition/Language.php @@ -8,7 +8,7 @@ namespace Drupal\language\Plugin\Condition; use Drupal\Core\Condition\ConditionPluginBase; -use Drupal\Core\Language\Language as Lang; +use Drupal\Core\Language\LanguageInterface; /** * Provides a 'Language' condition. @@ -32,7 +32,7 @@ public function buildConfigurationForm(array $form, array &$form_state) { $form = parent::buildConfigurationForm($form, $form_state); if (\Drupal::languageManager()->isMultilingual()) { // Fetch languages. - $languages = language_list(Lang::STATE_ALL); + $languages = language_list(LanguageInterface::STATE_ALL); $langcodes_options = array(); foreach ($languages as $language) { $langcodes_options[$language->id] = $language->getName(); @@ -40,15 +40,15 @@ public function buildConfigurationForm(array $form, array &$form_state) { $form['langcodes'] = array( '#type' => 'checkboxes', '#title' => t('Language selection'), - '#default_value' => !empty($this->configuration['langcodes']) ? $this->configuration['langcodes'] : array(), + '#default_value' => $this->configuration['langcodes'], '#options' => $langcodes_options, '#description' => t('Select languages to enforce. If none are selected, all languages will be allowed.'), ); } else { - $form['language']['langcodes'] = array( + $form['langcodes'] = array( '#type' => 'value', - '#value' => !empty($this->configuration['langcodes']) ? $this->configuration['langcodes'] : array() + '#value' => $this->configuration['langcodes'], ); } return $form; @@ -66,7 +66,7 @@ public function submitConfigurationForm(array &$form, array &$form_state) { * {@inheritdoc} */ public function summary() { - $language_list = language_list(Lang::STATE_ALL); + $language_list = language_list(LanguageInterface::STATE_ALL); $selected = $this->configuration['langcodes']; // Reduce the language list to an array of language names. $language_names = array_reduce($language_list, function(&$result, $item) use ($selected) { @@ -105,4 +105,11 @@ public function evaluate() { return !empty($this->configuration['langcodes'][$language->id]); } + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + return array('langcodes' => array()) + parent::defaultConfiguration(); + } + } diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml index e4c269c..46c2e9f 100644 --- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml +++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml @@ -45,9 +45,6 @@ process: region: region theme: theme label: title - 'visibility.path.visibility': visibility - 'visibility.path.pages': pages - 'visibility.role.roles': roles weight: weight settings: plugin: d6_block_settings @@ -55,6 +52,9 @@ process: - @plugin - delta - settings + - visibility + 'settings.visibility.request_path.pages': pages + 'settings.visibility.user_role.roles': roles destination: plugin: entity:block migration_dependencies: diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockSettings.php b/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockSettings.php index a804352..94ea600 100644 --- a/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockSettings.php +++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockSettings.php @@ -24,8 +24,9 @@ class BlockSettings extends ProcessPluginBase { * Set the block configuration. */ public function transform($value, MigrateExecutable $migrate_executable, Row $row, $destination_property) { - list($plugin, $delta, $old_settings) = $value; + list($plugin, $delta, $old_settings, $visibility) = $value; $settings = array(); + $settings['visibility']['request_path']['negate'] = !$visibility; switch ($plugin) { case 'aggregator_feed_block': list(, $id) = explode('-', $delta); diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php index 800e784..313e780 100644 --- a/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php +++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php @@ -75,6 +75,7 @@ public function setUp() { * Test the block settings migration. */ public function testBlockMigration() { + /** @var $blocks \Drupal\block\BlockInterface[] */ $blocks = entity_load_multiple('block'); $this->assertEqual(count($blocks), 11); @@ -83,36 +84,36 @@ public function testBlockMigration() { $this->assertNotNull($test_block_user); $this->assertEqual('left', $test_block_user->get('region')); $this->assertEqual('garland', $test_block_user->get('theme')); - $visibility = $test_block_user->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_user->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(0, $test_block_user->weight); $test_block_user_1 = $blocks['user_1']; $this->assertNotNull($test_block_user_1); $this->assertEqual('left', $test_block_user_1->get('region')); $this->assertEqual('garland', $test_block_user_1->get('theme')); - $visibility = $test_block_user_1->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_user_1->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(0, $test_block_user_1->weight); $test_block_user_2 = $blocks['user_2']; $this->assertNotNull($test_block_user_2); $this->assertEqual('', $test_block_user_2->get('region')); $this->assertEqual('garland', $test_block_user_2->get('theme')); - $visibility = $test_block_user_2->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_user_2->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(-3, $test_block_user_2->weight); $test_block_user_3 = $blocks['user_3']; $this->assertNotNull($test_block_user_3); $this->assertEqual('', $test_block_user_3->get('region')); $this->assertEqual('garland', $test_block_user_3->get('theme')); - $visibility = $test_block_user_3->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_user_3->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(-1, $test_block_user_3->weight); // Check system block @@ -120,9 +121,9 @@ public function testBlockMigration() { $this->assertNotNull($test_block_system); $this->assertEqual('footer', $test_block_system->get('region')); $this->assertEqual('garland', $test_block_system->get('theme')); - $visibility = $test_block_system->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_system->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(-5, $test_block_system->weight); // Check comment block @@ -130,9 +131,9 @@ public function testBlockMigration() { $this->assertNotNull($test_block_comment); $this->assertEqual('', $test_block_comment->get('region')); $this->assertEqual('garland', $test_block_comment->get('theme')); - $visibility = $test_block_comment->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_comment->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(-6, $test_block_comment->weight); // Check menu blocks @@ -140,18 +141,18 @@ public function testBlockMigration() { $this->assertNotNull($test_block_menu); $this->assertEqual('header', $test_block_menu->get('region')); $this->assertEqual('garland', $test_block_menu->get('theme')); - $visibility = $test_block_menu->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_menu->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(-5, $test_block_menu->weight); $test_block_menu_1 = $blocks['menu_1']; $this->assertNotNull($test_block_menu_1); $this->assertEqual('', $test_block_menu_1->get('region')); $this->assertEqual('garland', $test_block_menu_1->get('theme')); - $visibility = $test_block_menu_1->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_menu_1->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(-5, $test_block_menu_1->weight); // Check node block @@ -159,9 +160,9 @@ public function testBlockMigration() { $this->assertNotNull($test_block_node); $this->assertEqual('', $test_block_node->get('region')); $this->assertEqual('garland', $test_block_node->get('theme')); - $visibility = $test_block_node->get('visibility'); - $this->assertEqual(0, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_node->getVisibility(); + $this->assertEqual(TRUE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(-4, $test_block_node->weight); // Check custom blocks @@ -169,18 +170,18 @@ public function testBlockMigration() { $this->assertNotNull($test_block_block); $this->assertEqual('content', $test_block_block->get('region')); $this->assertEqual('garland', $test_block_block->get('theme')); - $visibility = $test_block_block->get('visibility'); - $this->assertEqual(1, $visibility['path']['visibility']); - $this->assertEqual('', $visibility['path']['pages']); + $visibility = $test_block_block->getVisibility(); + $this->assertEqual(FALSE, $visibility['request_path']['negate']); + $this->assertEqual('', $visibility['request_path']['pages']); $this->assertEqual(0, $test_block_block->weight); $test_block_block_1 = $blocks['block_1']; $this->assertNotNull($test_block_block_1); $this->assertEqual('right', $test_block_block_1->get('region')); $this->assertEqual('bluemarine', $test_block_block_1->get('theme')); - $visibility = $test_block_block_1->get('visibility'); - $this->assertEqual(1, $visibility['path']['visibility']); - $this->assertEqual('node', $visibility['path']['pages']); + $visibility = $test_block_block_1->getVisibility(); + $this->assertEqual(FALSE, $visibility['request_path']['negate']); + $this->assertEqual('node', $visibility['request_path']['pages']); $this->assertEqual(-4, $test_block_block_1->weight); } } diff --git a/core/modules/node/src/Plugin/Condition/NodeType.php b/core/modules/node/src/Plugin/Condition/NodeType.php index 95da12b..d2f726b 100644 --- a/core/modules/node/src/Plugin/Condition/NodeType.php +++ b/core/modules/node/src/Plugin/Condition/NodeType.php @@ -37,7 +37,7 @@ public function buildConfigurationForm(array $form, array &$form_state) { '#title' => t('Node types'), '#type' => 'checkboxes', '#options' => $options, - '#default_value' => isset($this->configuration['bundles']) ? $this->configuration['bundles'] : array(), + '#default_value' => $this->configuration['bundles'], ); return $form; } @@ -45,17 +45,6 @@ public function buildConfigurationForm(array $form, array &$form_state) { /** * {@inheritdoc} */ - public function validateConfigurationForm(array &$form, array &$form_state) { - foreach ($form_state['values']['bundles'] as $bundle) { - if (!in_array($bundle, array_keys(node_type_get_types()))) { - form_set_error('bundles', $form_state, t('You have chosen an invalid node bundle, please check your selection and try again.')); - } - } - } - - /** - * {@inheritdoc} - */ public function submitConfigurationForm(array &$form, array &$form_state) { $this->configuration['bundles'] = array_filter($form_state['values']['bundles']); parent::submitConfigurationForm($form, $form_state); @@ -86,4 +75,11 @@ public function evaluate() { return !empty($this->configuration['bundles'][$node->getType()]); } + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + return array('bundles' => array()) + parent::defaultConfiguration(); + } + } diff --git a/core/modules/node/src/Tests/NodeBlockFunctionalTest.php b/core/modules/node/src/Tests/NodeBlockFunctionalTest.php index 148ec23..e806bc9 100644 --- a/core/modules/node/src/Tests/NodeBlockFunctionalTest.php +++ b/core/modules/node/src/Tests/NodeBlockFunctionalTest.php @@ -128,14 +128,14 @@ public function testRecentNodeBlock() { $block = $this->drupalPlaceBlock('system_powered_by_block', array( 'visibility' => array( 'node_type' => array( - 'types' => array( + 'bundles' => array( 'article' => 'article', ), ), ), )); - $visibility = $block->get('visibility'); - $this->assertTrue(isset($visibility['node_type']['types']['article']), 'Visibility settings were saved to configuration'); + $visibility = $block->getVisibility(); + $this->assertTrue(isset($visibility['node_type']['bundles']['article']), 'Visibility settings were saved to configuration'); // Create a page node. $node5 = $this->drupalCreateNode(array('uid' => $this->adminUser->id(), 'type' => 'page')); diff --git a/core/modules/search/src/Tests/SearchBlockTest.php b/core/modules/search/src/Tests/SearchBlockTest.php index d4e45db..311f69a 100644 --- a/core/modules/search/src/Tests/SearchBlockTest.php +++ b/core/modules/search/src/Tests/SearchBlockTest.php @@ -63,9 +63,9 @@ protected function testSearchFormBlock() { $this->assertResponse(200); $this->assertText('Your search yielded no results'); - $visibility = $block->get('visibility'); - $visibility['path']['pages'] = 'search'; - $block->set('visibility', $visibility); + $visibility = $block->getVisibility(); + $visibility['request_path']['pages'] = 'search'; + $block->getPlugin()->setVisibilityConfig('request_path', $visibility['request_path']); $this->submitGetForm('', $terms, t('Search')); $this->assertResponse(200);