diff --git a/config/schema/page_manager.schema.yml b/config/schema/page_manager.schema.yml index 1fe3464..9b3a899 100644 --- a/config/schema/page_manager.schema.yml +++ b/config/schema/page_manager.schema.yml @@ -101,6 +101,12 @@ page_manager.block_plugin.*: label: 'Context assignments' sequence: - type: string + css_classes: + type: string + label: 'CSS classes' + css_id: + type: string + label: 'CSS id' # @todo Move to core in https://www.drupal.org/node/2838130. display_variant.plugin.*: diff --git a/page_manager.install b/page_manager.install index 6180cf9..c0148cb 100644 --- a/page_manager.install +++ b/page_manager.install @@ -55,3 +55,26 @@ function page_manager_update_8002() { } } } + +/** + * Add css_classes and css_id to the existing config schema. + */ +function page_manager_update_8003() { + $config_factory = \Drupal::configFactory(); + foreach ($config_factory->listAll('page_manager.page_variant.') as $config_name) { + $config = $config_factory->getEditable($config_name); + $blocks = $config->get('variant_settings.blocks'); + $need_save = FALSE; + foreach ($blocks as $block_id => $block) { + if (!isset($block['css_classes']) && !isset($block['css_id'])) { + $block['css_classes'] = ''; + $block['css_id'] = ''; + $config->set('variant_settings.blocks.' . $block_id, $block); + $need_save = TRUE; + } + } + if ($need_save) { + $config->save(TRUE); + } + } +} diff --git a/page_manager_ui/src/Form/VariantPluginConfigureBlockFormBase.php b/page_manager_ui/src/Form/VariantPluginConfigureBlockFormBase.php index 59de6c6..2b46363 100644 --- a/page_manager_ui/src/Form/VariantPluginConfigureBlockFormBase.php +++ b/page_manager_ui/src/Form/VariantPluginConfigureBlockFormBase.php @@ -142,6 +142,19 @@ abstract class VariantPluginConfigureBlockFormBase extends FormBase { $form['context_mapping'] = $this->addContextAssignmentElement($this->block, $this->getVariantPlugin()->getContexts()); } + $settings = $this->block->getConfiguration(); + $form['css_classes'] = [ + '#title' => $this->t('Css classes'), + '#type' => 'textfield', + '#default_value' => !empty($settings['css_classes']) ? $settings['css_classes'] : NULL, + ]; + + $form['css_id'] = [ + '#title' => $this->t('Css ID'), + '#type' => 'textfield', + '#default_value' => !empty($settings['css_id']) ? $settings['css_id'] : NULL, + ]; + $form['actions']['submit'] = [ '#type' => 'submit', '#value' => $this->submitText(), @@ -180,7 +193,12 @@ abstract class VariantPluginConfigureBlockFormBase extends FormBase { $this->block->setContextMapping($form_state->getValue('context_mapping', [])); } - $this->getVariantPlugin()->updateBlock($this->block->getConfiguration()['uuid'], ['region' => $form_state->getValue('region')]); + $block_settings = [ + 'region' => $form_state->getValue('region'), + 'css_classes' => $form_state->getValue('css_classes'), + 'css_id' => $form_state->getValue('css_id'), + ]; + $this->getVariantPlugin()->updateBlock($this->block->getConfiguration()['uuid'], $block_settings); $cached_values = $this->getTempstore()->get($form_state->get('variant_id')); $cached_values['plugin'] = $this->getVariantPlugin(); diff --git a/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php b/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php index 4b704d0..a8a4173 100644 --- a/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php +++ b/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php @@ -155,6 +155,19 @@ class PageBlockDisplayVariant extends BlockDisplayVariant implements PluginWizar ], ]; + // Add css classes. + $css_classes = !empty($this->configuration['blocks'][$block_id]['css_classes']) ? $this->configuration['blocks'][$block_id]['css_classes'] : ''; + $classes_array = explode(' ', $css_classes); + foreach ($classes_array as $class) { + $block_build['#attributes']['class'][] = Html::cleanCssIdentifier($class); + } + + // Add css id. + $css_id = !empty($this->configuration['blocks'][$block_id]['css_id']) ? $this->configuration['blocks'][$block_id]['css_id'] : ''; + if (!empty($css_id)) { + $block_build['#attributes']['id'] = Html::getId($css_id); + } + // Merge the cacheability metadata of blocks into the page. This helps // to avoid cache redirects if the blocks have more cache contexts than // the page, which the page must respect as well.