diff --git a/core/modules/layout_builder/config/schema/layout_builder.schema.yml b/core/modules/layout_builder/config/schema/layout_builder.schema.yml index 862c90ecbe..f657f0ecc3 100644 --- a/core/modules/layout_builder/config/schema/layout_builder.schema.yml +++ b/core/modules/layout_builder/config/schema/layout_builder.schema.yml @@ -66,6 +66,12 @@ inline_block: block_serialized: type: string label: 'Serialized block' + type: + type: string + label: 'Block type' + uuid: + type: string + label: 'Block UUID' block.settings.inline_block:*: type: inline_block diff --git a/core/modules/layout_builder/layout_builder.services.yml b/core/modules/layout_builder/layout_builder.services.yml index bce1734e71..9c1d3b70f3 100644 --- a/core/modules/layout_builder/layout_builder.services.yml +++ b/core/modules/layout_builder/layout_builder.services.yml @@ -56,3 +56,14 @@ services: arguments: ['@layout_builder.tempstore_repository', '@messenger'] tags: - { name: event_subscriber } + layout_builder.normalizer.entity_display: + class: Drupal\layout_builder\Normalizer\LayoutEntityDisplayNormalizer + tags: + # Priority must be higher than serializer.normalizer.config_entity. + - { name: normalizer, priority: 1 } + arguments: ['@entity_type.manager', '@entity_type.repository', '@entity_field.manager'] + layout_builder.normalizer.section_data: + class: Drupal\layout_builder\Normalizer\SectionDataNormalizer + tags: + # Priority must be higher than serializer.normalizer.typed_data. + - { name: normalizer, priority: 1 } diff --git a/core/modules/layout_builder/src/Element/LayoutBuilder.php b/core/modules/layout_builder/src/Element/LayoutBuilder.php index 8bf656475b..c2bc75c6e6 100644 --- a/core/modules/layout_builder/src/Element/LayoutBuilder.php +++ b/core/modules/layout_builder/src/Element/LayoutBuilder.php @@ -52,7 +52,7 @@ class LayoutBuilder extends RenderElement implements ContainerFactoryPluginInter * The messenger service. This is no longer used and will be removed in * drupal:10.0.0. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, $event_dispatcher, $messenger = NULL) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, EventDispatcherInterface $event_dispatcher, $messenger = NULL) { parent::__construct($configuration, $plugin_id, $plugin_definition); if (!($event_dispatcher instanceof EventDispatcherInterface)) { @@ -182,7 +182,10 @@ protected function buildAddSectionLink(SectionStorageInterface $section_storage, $title = $this->t('Add section <span class="visually-hidden">at start of layout</span>'); } else { - $title = $this->t('Add section <span class="visually-hidden">between @first and @second</span>', ['@first' => $delta, '@second' => $delta + 1]); + $title = $this->t('Add section <span class="visually-hidden">between @first and @second</span>', [ + '@first' => $delta, + '@second' => $delta + 1, + ]); } } @@ -272,7 +275,10 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s $build[$region]['layout_builder_add_block']['link'] = [ '#type' => 'link', // Add one to the current delta since it is zero-indexed. - '#title' => $this->t('Add block <span class="visually-hidden">in @section, @region region</span>', ['@section' => $section_label, '@region' => $region_labels[$region]]), + '#title' => $this->t('Add block <span class="visually-hidden">in @section, @region region</span>', [ + '@section' => $section_label, + '@region' => $region_labels[$region], + ]), '#url' => Url::fromRoute('layout_builder.choose_block', [ 'section_storage_type' => $storage_type, diff --git a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php index 6094889664..8ccb121ad9 100644 --- a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php +++ b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php @@ -351,7 +351,11 @@ public function label() { $bundle_info = \Drupal::service('entity_type.bundle.info')->getBundleInfo($this->getTargetEntityTypeId()); $bundle_label = $bundle_info[$this->getTargetBundle()]['label']; $target_entity_type = $this->entityTypeManager()->getDefinition($this->getTargetEntityTypeId()); - return new TranslatableMarkup('@bundle @label', ['@bundle' => $bundle_label, '@label' => $target_entity_type->getPluralLabel()]); + return new TranslatableMarkup('@bundle @label', + [ + '@bundle' => $bundle_label, + '@label' => $target_entity_type->getPluralLabel(), + ]); } /** @@ -536,7 +540,10 @@ private function getSectionComponentForFieldName($field_name) { foreach ($this->getSections() as $section) { foreach ($section->getComponents() as $component) { $plugin = $component->getPlugin(); - if ($plugin instanceof DerivativeInspectionInterface && in_array($plugin->getBaseId(), ['field_block', 'extra_field_block'], TRUE)) { + if ($plugin instanceof DerivativeInspectionInterface && in_array($plugin->getBaseId(), + [ + 'field_block', 'extra_field_block', + ], TRUE)) { // FieldBlock derivative IDs are in the format // [entity_type]:[bundle]:[field]. list(, , $field_block_field_name) = explode(PluginBase::DERIVATIVE_SEPARATOR, $plugin->getDerivativeId()); diff --git a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php index d9218b5387..26a8eec8bd 100644 --- a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php +++ b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php @@ -47,7 +47,9 @@ public function __construct(AccountInterface $current_user) { * {@inheritdoc} */ public static function getSubscribedEvents() { - $events[LayoutBuilderEvents::SECTION_COMPONENT_BUILD_RENDER_ARRAY] = ['onBuildRender', 100]; + $events[LayoutBuilderEvents::SECTION_COMPONENT_BUILD_RENDER_ARRAY] = [ + 'onBuildRender', 100, + ]; return $events; } diff --git a/core/modules/layout_builder/src/EventSubscriber/PrepareLayout.php b/core/modules/layout_builder/src/EventSubscriber/PrepareLayout.php index e335b87ab8..3dae574751 100644 --- a/core/modules/layout_builder/src/EventSubscriber/PrepareLayout.php +++ b/core/modules/layout_builder/src/EventSubscriber/PrepareLayout.php @@ -11,8 +11,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** - * An event subscriber to prepare section storage via the - * \Drupal\layout_builder\Event\PrepareLayoutEvent. + * An event subscriber to prepare section storage via PrepareLayoutEvent. * * @see \Drupal\layout_builder\Event\PrepareLayoutEvent * @see \Drupal\layout_builder\Element\LayoutBuilder::prepareLayout() diff --git a/core/modules/layout_builder/src/Field/LayoutSectionItemList.php b/core/modules/layout_builder/src/Field/LayoutSectionItemList.php index 9870bc41b3..6337a9af2e 100644 --- a/core/modules/layout_builder/src/Field/LayoutSectionItemList.php +++ b/core/modules/layout_builder/src/Field/LayoutSectionItemList.php @@ -101,7 +101,10 @@ public function equals(FieldItemListInterface $list_to_compare) { * @ingroup layout_builder_access */ public function defaultAccess($operation = 'view', AccountInterface $account = NULL) { - // @todo Allow access in https://www.drupal.org/node/2942975. + if ($operation === 'view') { + return parent::defaultAccess($operation, $account); + } + return AccessResult::forbidden(); } diff --git a/core/modules/layout_builder/src/Form/MoveBlockForm.php b/core/modules/layout_builder/src/Form/MoveBlockForm.php index d051de47e8..abcf28c11f 100644 --- a/core/modules/layout_builder/src/Form/MoveBlockForm.php +++ b/core/modules/layout_builder/src/Form/MoveBlockForm.php @@ -155,7 +155,11 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt ]; $current_section = $sections[$selected_delta]; - $aria_label = $this->t('Blocks in Section: @section, Region: @region', ['@section' => $selected_delta + 1, '@region' => $selected_region]); + $aria_label = $this->t('Blocks in Section: @section, Region: @region', + [ + '@section' => $selected_delta + 1, + '@region' => $selected_region, + ]); $form['components_wrapper']['components'] = [ '#type' => 'table', diff --git a/core/modules/layout_builder/src/InlineBlockUsage.php b/core/modules/layout_builder/src/InlineBlockUsage.php index ab94d4c535..46c073af73 100644 --- a/core/modules/layout_builder/src/InlineBlockUsage.php +++ b/core/modules/layout_builder/src/InlineBlockUsage.php @@ -80,7 +80,10 @@ public function deleteUsage(array $block_content_ids) { public function getUsage($block_content_id) { $query = $this->database->select('inline_block_usage'); $query->condition('block_content_id', $block_content_id); - $query->fields('inline_block_usage', ['layout_entity_id', 'layout_entity_type']); + $query->fields('inline_block_usage', + [ + 'layout_entity_id', 'layout_entity_type', + ]); $query->range(0, 1); return $query->execute()->fetchObject(); } diff --git a/core/modules/layout_builder/src/LayoutBuilderServiceProvider.php b/core/modules/layout_builder/src/LayoutBuilderServiceProvider.php index f0b078c48e..d5db01dbff 100644 --- a/core/modules/layout_builder/src/LayoutBuilderServiceProvider.php +++ b/core/modules/layout_builder/src/LayoutBuilderServiceProvider.php @@ -5,8 +5,6 @@ use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\DependencyInjection\ServiceProviderInterface; use Drupal\layout_builder\EventSubscriber\SetInlineBlockDependency; -use Drupal\layout_builder\Normalizer\LayoutEntityDisplayNormalizer; -use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; @@ -40,14 +38,6 @@ public function register(ContainerBuilder $container) { $definition->setPublic(TRUE); $container->setDefinition('layout_builder.get_block_dependency_subscriber', $definition); } - if (isset($modules['serialization'])) { - $definition = (new ChildDefinition('serializer.normalizer.config_entity')) - ->setClass(LayoutEntityDisplayNormalizer::class) - // Ensure that this normalizer takes precedence for Layout Builder data - // over the generic serializer.normalizer.config_entity. - ->addTag('normalizer', ['priority' => 5]); - $container->setDefinition('layout_builder.normalizer.layout_entity_display', $definition); - } } } diff --git a/core/modules/layout_builder/src/Normalizer/LayoutEntityDisplayNormalizer.php b/core/modules/layout_builder/src/Normalizer/LayoutEntityDisplayNormalizer.php index 886304fa29..720767e1a4 100644 --- a/core/modules/layout_builder/src/Normalizer/LayoutEntityDisplayNormalizer.php +++ b/core/modules/layout_builder/src/Normalizer/LayoutEntityDisplayNormalizer.php @@ -3,6 +3,7 @@ namespace Drupal\layout_builder\Normalizer; use Drupal\layout_builder\Entity\LayoutEntityDisplayInterface; +use Drupal\layout_builder\Section; use Drupal\serialization\Normalizer\ConfigEntityNormalizer; /** @@ -21,13 +22,26 @@ class LayoutEntityDisplayNormalizer extends ConfigEntityNormalizer { /** * {@inheritdoc} */ - protected static function getDataWithoutInternals(array $data) { - $data = parent::getDataWithoutInternals($data); - // Do not expose the actual layout sections in normalization. - // @todo Determine what to expose here in - // https://www.drupal.org/node/2942975. - unset($data['third_party_settings']['layout_builder']['sections']); + public function normalize($object, $format = NULL, array $context = []) { + $data = static::getDataWithoutInternals($object->toArray()); + if (!empty($data['third_party_settings']['layout_builder']['sections'])) { + $sections = &$data['third_party_settings']['layout_builder']['sections']; + $sections = array_map(static function (Section $section) { + return $section->toArray(); + }, $sections); + } return $data; } + /** + * {@inheritdoc} + */ + public function denormalize($data, $class, $format = NULL, array $context = []) { + if (!empty($data['third_party_settings']['layout_builder']['sections'])) { + $sections = &$data['third_party_settings']['layout_builder']['sections']; + $sections = array_map([Section::class, 'fromArray'], $sections); + } + return parent::denormalize(static::getDataWithoutInternals($data), $class, $format, $context); + } + } diff --git a/core/modules/layout_builder/src/Plugin/Block/FieldBlock.php b/core/modules/layout_builder/src/Plugin/Block/FieldBlock.php index 80d9b97315..02d27d3a03 100644 --- a/core/modules/layout_builder/src/Plugin/Block/FieldBlock.php +++ b/core/modules/layout_builder/src/Plugin/Block/FieldBlock.php @@ -167,7 +167,11 @@ public function build() { } catch (\Exception $e) { $build = []; - $this->logger->warning('The field "%field" failed to render with the error of "%error".', ['%field' => $this->fieldName, '%error' => $e->getMessage()]); + $this->logger->warning('The field "%field" failed to render with the error of "%error".', + [ + '%field' => $this->fieldName, + '%error' => $e->getMessage(), + ]); } CacheableMetadata::createFromRenderArray($build)->addCacheableDependency($this)->applyTo($build); return $build; diff --git a/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php b/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php index 9f347174d3..160ce058d3 100644 --- a/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php +++ b/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php @@ -239,6 +239,10 @@ protected function getEntity() { 'reusable' => FALSE, ]); } + if (!isset($this->blockContent) && isset($this->configuration['type']) && isset($this->configuration['uuid'])) { + $entity = $this->entityTypeManager->getStorage('block_content')->loadByProperties(['uuid' => $this->configuration['uuid']]); + $this->blockContent = is_array($entity) ? array_pop($entity) : $entity; + } if ($this->blockContent instanceof RefinableDependentAccessInterface && $dependee = $this->getAccessDependency()) { $this->blockContent->setAccessDependency($dependee); } @@ -291,6 +295,8 @@ public function saveBlockContent($new_revision = FALSE, $duplicate_block = FALSE $block->save(); $this->configuration['block_revision_id'] = $block->getRevisionId(); $this->configuration['block_serialized'] = NULL; + $this->configuration['type'] = $block->bundle(); + $this->configuration['uuid'] = $block->uuid(); } } diff --git a/core/modules/layout_builder/src/Plugin/DataType/SectionData.php b/core/modules/layout_builder/src/Plugin/DataType/SectionData.php index 8783904d49..4352bae88c 100644 --- a/core/modules/layout_builder/src/Plugin/DataType/SectionData.php +++ b/core/modules/layout_builder/src/Plugin/DataType/SectionData.php @@ -30,8 +30,18 @@ class SectionData extends TypedData { * {@inheritdoc} */ public function setValue($value, $notify = TRUE) { + + if ($value && is_array($value)) { + $value = Section::fromArray($value); + } + if ($value && !$value instanceof Section) { - throw new \InvalidArgumentException(sprintf('Value assigned to "%s" is not a valid section', $this->getName())); + if (isset($value->value) && !$value->value instanceof Section) { + throw new \InvalidArgumentException(sprintf('Value assigned to "%s" is not a valid section', $this->getName())); + } + else { + parent::setValue($value->value, $notify); + } } parent::setValue($value, $notify); } diff --git a/core/modules/layout_builder/src/Section.php b/core/modules/layout_builder/src/Section.php index cd27437cb2..2a170d7012 100644 --- a/core/modules/layout_builder/src/Section.php +++ b/core/modules/layout_builder/src/Section.php @@ -344,9 +344,9 @@ public function toArray() { return [ 'layout_id' => $this->getLayoutId(), 'layout_settings' => $this->getLayoutSettings(), - 'components' => array_map(function (SectionComponent $component) { + 'components' => array_values(array_map(function (SectionComponent $component) { return $component->toArray(); - }, $this->getComponents()), + }, $this->getComponents())), 'third_party_settings' => $this->thirdPartySettings, ]; } diff --git a/core/modules/layout_builder/src/SectionStorageInterface.php b/core/modules/layout_builder/src/SectionStorageInterface.php index 35b3a9c87b..8cd7b5d38d 100644 --- a/core/modules/layout_builder/src/SectionStorageInterface.php +++ b/core/modules/layout_builder/src/SectionStorageInterface.php @@ -136,7 +136,9 @@ public function save(); public function isApplicable(RefinableCacheableDependencyInterface $cacheability); /** - * Overrides \Drupal\Component\Plugin\PluginInspectionInterface::getPluginDefinition(). + * Overrides PluginInspectionInterface::getPluginDefinition(). + * + * @see \Drupal\Component\Plugin\PluginInspectionInterface::getPluginDefinition() * * @return \Drupal\layout_builder\SectionStorage\SectionStorageDefinition * The section storage definition. diff --git a/core/modules/layout_builder/tests/modules/layout_builder_decoration_test/src/Controller/LayoutBuilderDecorationTestHtmlEntityFormController.php b/core/modules/layout_builder/tests/modules/layout_builder_decoration_test/src/Controller/LayoutBuilderDecorationTestHtmlEntityFormController.php index 7922024334..9d57e70dcf 100644 --- a/core/modules/layout_builder/tests/modules/layout_builder_decoration_test/src/Controller/LayoutBuilderDecorationTestHtmlEntityFormController.php +++ b/core/modules/layout_builder/tests/modules/layout_builder_decoration_test/src/Controller/LayoutBuilderDecorationTestHtmlEntityFormController.php @@ -7,7 +7,7 @@ use Symfony\Component\HttpFoundation\Request; /** - * Overrides the entity form controller service for layout builder decoration test. + * Overrides entity form controller service for layout builder decoration test. */ class LayoutBuilderDecorationTestHtmlEntityFormController extends FormController { diff --git a/core/modules/layout_builder/tests/modules/layout_builder_element_test/src/EventSubscriber/TestPrepareLayout.php b/core/modules/layout_builder/tests/modules/layout_builder_element_test/src/EventSubscriber/TestPrepareLayout.php index cec4af43bb..c33f193bec 100644 --- a/core/modules/layout_builder/tests/modules/layout_builder_element_test/src/EventSubscriber/TestPrepareLayout.php +++ b/core/modules/layout_builder/tests/modules/layout_builder_element_test/src/EventSubscriber/TestPrepareLayout.php @@ -12,8 +12,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** - * An event subscriber to test altering section storage via the - * \Drupal\layout_builder\Event\PrepareLayoutEvent. + * An event subscriber to test altering section storage via PrepareLayoutEvent. * * @see \Drupal\layout_builder\Event\PrepareLayoutEvent * @see \Drupal\layout_builder\Element\LayoutBuilder::prepareLayout() @@ -54,9 +53,15 @@ public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore */ public static function getSubscribedEvents() { // Act before core's layout builder subscriber. - $events[LayoutBuilderEvents::PREPARE_LAYOUT][] = ['onBeforePrepareLayout', 20]; + $events[LayoutBuilderEvents::PREPARE_LAYOUT][] = [ + 'onBeforePrepareLayout', + 20, + ]; // Act after core's layout builder subscriber. - $events[LayoutBuilderEvents::PREPARE_LAYOUT][] = ['onAfterPrepareLayout', -10]; + $events[LayoutBuilderEvents::PREPARE_LAYOUT][] = [ + 'onAfterPrepareLayout', + -10, + ]; return $events; } diff --git a/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Layout/LayoutBuilderTestPlugin.php b/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Layout/LayoutBuilderTestPlugin.php index de0ee7d079..9d25c36839 100644 --- a/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Layout/LayoutBuilderTestPlugin.php +++ b/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Layout/LayoutBuilderTestPlugin.php @@ -5,6 +5,8 @@ use Drupal\Core\Layout\LayoutDefault; /** + * Layout Builder Test plugin. + * * @Layout( * id = "layout_builder_test_plugin", * label = @Translation("Layout Builder Test Plugin"), diff --git a/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonAnonTest.php b/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonAnonTest.php index 95c66ddb09..1334a08ea9 100644 --- a/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonAnonTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonAnonTest.php @@ -6,6 +6,8 @@ use Drupal\Tests\rest\Functional\AnonResourceTestTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayHalJsonAnonTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest.php b/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest.php index 6721bfaa02..f92408a157 100644 --- a/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest.php @@ -2,14 +2,16 @@ namespace Drupal\Tests\layout_builder\Functional\Hal; -use Drupal\FunctionalTests\Hal\EntityViewDisplayHalJsonAnonTest; +use Drupal\Tests\layout_builder\Functional\Rest\LayoutBuilderEntityViewDisplayResourceTestBase; use Drupal\Tests\rest\Functional\BasicAuthResourceTestTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest. + * * @group layout_builder * @group rest */ -class LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest extends EntityViewDisplayHalJsonAnonTest { +class LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest extends LayoutBuilderEntityViewDisplayResourceTestBase { use BasicAuthResourceTestTrait; @@ -23,4 +25,9 @@ class LayoutBuilderEntityViewDisplayHalJsonBasicAuthTest extends EntityViewDispl */ protected static $auth = 'basic_auth'; + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + } diff --git a/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonCookieTest.php b/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonCookieTest.php index ad272d297e..4190821fc5 100644 --- a/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonCookieTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Hal/LayoutBuilderEntityViewDisplayHalJsonCookieTest.php @@ -5,6 +5,8 @@ use Drupal\Tests\rest\Functional\CookieResourceTestTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayHalJsonCookieTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderAccessTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderAccessTest.php index 2f92dbee69..10e218e4af 100644 --- a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderAccessTest.php +++ b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderAccessTest.php @@ -56,8 +56,6 @@ protected function setUp(): void { /** * Tests Layout Builder access for an entity type that has bundles. * - * @dataProvider providerTestAccessWithBundles - * * @param array $permissions * An array of permissions to grant to the user. * @param bool $default_access @@ -68,6 +66,8 @@ protected function setUp(): void { * Whether access is expected for an editable override. * @param array $permission_dependencies * An array of expected permission dependencies. + * + * @dataProvider providerTestAccessWithBundles */ public function testAccessWithBundles(array $permissions, $default_access, $non_editable_access, $editable_access, array $permission_dependencies) { $permissions[] = 'edit own bundle_with_section_field content'; diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonAnonTest.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonAnonTest.php index 316c1f8916..ea6493fefc 100644 --- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonAnonTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonAnonTest.php @@ -5,6 +5,8 @@ use Drupal\Tests\rest\Functional\AnonResourceTestTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayJsonAnonTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonBasicAuthTest.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonBasicAuthTest.php index 099e31ace0..470fd5b34c 100644 --- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonBasicAuthTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonBasicAuthTest.php @@ -5,6 +5,8 @@ use Drupal\Tests\rest\Functional\BasicAuthResourceTestTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayJsonBasicAuthTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonCookieTest.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonCookieTest.php index de311a7325..8ccebcc091 100644 --- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonCookieTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayJsonCookieTest.php @@ -5,6 +5,8 @@ use Drupal\Tests\rest\Functional\CookieResourceTestTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayJsonCookieTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php index 7d28bda963..ac8a4400b5 100644 --- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php +++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php @@ -36,9 +36,37 @@ protected function getExpectedNormalizedEntity() { $expected = parent::getExpectedNormalizedEntity(); array_unshift($expected['dependencies']['module'], 'layout_builder'); $expected['hidden'][OverridesSectionStorage::FIELD_NAME] = TRUE; + /** @var \Drupal\layout_builder\Section[] $sections */ + $sections = $this->entity->getThirdPartySetting('layout_builder', 'sections'); + $components = $sections[0]->getComponents(); + $component = array_pop($components); $expected['third_party_settings']['layout_builder'] = [ 'enabled' => TRUE, 'allow_custom' => TRUE, + 'sections' => [ + [ + 'layout_id' => 'layout_onecol', + 'layout_settings' => [ + 'label' => '', + ], + 'components' => [ + [ + 'uuid' => $component->getUuid(), + 'region' => 'content', + 'configuration' => [ + 'label_display' => '0', + 'context_mapping' => [ + 'entity' => 'layout_builder.entity', + ], + 'id' => 'extra_field_block:node:camelids:links', + ], + 'weight' => 0, + 'additional' => [], + ], + ], + 'third_party_settings' => [], + ], + ], ]; return $expected; } diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlAnonTest.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlAnonTest.php index 63d3ba0663..779cf321a3 100644 --- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlAnonTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlAnonTest.php @@ -6,6 +6,8 @@ use Drupal\Tests\rest\Functional\EntityResource\XmlEntityNormalizationQuirksTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayXmlAnonTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlBasicAuthTest.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlBasicAuthTest.php index 751e8ad3c5..92768dadf9 100644 --- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlBasicAuthTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlBasicAuthTest.php @@ -6,6 +6,8 @@ use Drupal\Tests\rest\Functional\EntityResource\XmlEntityNormalizationQuirksTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayXmlBasicAuthTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlCookieTest.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlCookieTest.php index fef266ca49..a908febf50 100644 --- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlCookieTest.php +++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayXmlCookieTest.php @@ -6,6 +6,8 @@ use Drupal\Tests\rest\Functional\EntityResource\XmlEntityNormalizationQuirksTrait; /** + * Provides a class LayoutBuilderEntityViewDisplayXmlCookieTest. + * * @group layout_builder * @group rest */ diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFilterTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFilterTest.php index d50e1fa400..5034b6e929 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFilterTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFilterTest.php @@ -81,7 +81,10 @@ public function testBlockFilter() { // Get the Content Fields category, which will be closed before filtering. $contentFieldsCategory = $page->find('named', ['content', 'Content fields']); // Link that belongs to the Content Fields category, to verify collapse. - $promoteToFrontPageLink = $page->find('named', ['content', 'Promoted to front page']); + $promoteToFrontPageLink = $page->find('named', [ + 'content', + 'Promoted to front page', + ]); // Test that front page link is visible until Content Fields collapsed. $this->assertTrue($promoteToFrontPageLink->isVisible()); $contentFieldsCategory->click(); diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFormMessagesTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFormMessagesTest.php index 4fccd1c842..b0cc0c6e61 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFormMessagesTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/BlockFormMessagesTest.php @@ -44,7 +44,7 @@ protected function setUp(): void { */ public function testValidationMessage() { // @todo Work out why this fixes random fails in this test. - // https://www.drupal.org/project/drupal/issues/3055982 + // https://www.drupal.org/project/drupal/issues/3055982 $this->getSession()->resizeWindow(800, 1000); $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/ContentPreviewToggleTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/ContentPreviewToggleTest.php index 01b76696c5..d96525f6f3 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/ContentPreviewToggleTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/ContentPreviewToggleTest.php @@ -94,7 +94,10 @@ public function testContentPreviewToggle() { $this->assertContextualLinks(); // Confirm repositioning blocks works with content preview disabled. - $this->assertOrderInPage([$links_field_placeholder_label, $body_field_placeholder_label]); + $this->assertOrderInPage([ + $links_field_placeholder_label, + $body_field_placeholder_label, + ]); $region_content = '.layout__region--content'; $links_block = "[data-layout-content-preview-placeholder-label='$links_field_placeholder_label']"; @@ -110,7 +113,10 @@ public function testContentPreviewToggle() { $assert_session->pageTextNotContains($content_preview_body_text); // Check that drag successfully repositioned blocks. - $this->assertOrderInPage([$body_field_placeholder_label, $links_field_placeholder_label]); + $this->assertOrderInPage([ + $body_field_placeholder_label, + $links_field_placeholder_label, + ]); // Check if block position maintained after enabling content preview. $this->assertTrue($page->hasUncheckedField('layout-builder-content-preview')); @@ -118,7 +124,10 @@ public function testContentPreviewToggle() { $this->assertNotEmpty($assert_session->waitForText($content_preview_body_text)); $assert_session->pageTextContains($content_preview_body_text); $this->assertNotEmpty($assert_session->waitForText('Placeholder for the "Links" field')); - $this->assertOrderInPage([$content_preview_body_text, 'Placeholder for the "Links" field']); + $this->assertOrderInPage([ + $content_preview_body_text, + 'Placeholder for the "Links" field', + ]); } /** diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php index bbcd3cf512..3c6fe1f76c 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php @@ -209,7 +209,10 @@ public function testInlineBlocksRevisioning() { ])); // Enable layout builder and overrides. $this->drupalGet(static::FIELD_UI_PREFIX . '/display/default'); - $this->submitForm(['layout[enabled]' => TRUE, 'layout[allow_custom]' => TRUE], 'Save'); + $this->submitForm([ + 'layout[enabled]' => TRUE, + 'layout[allow_custom]' => TRUE, + ], 'Save'); $this->drupalGet('node/1/layout'); // Add an inline block. @@ -271,7 +274,10 @@ public function testInlineBlocksRevisioningIntegrity() { 'create and edit custom blocks', ])); $this->drupalGet(static::FIELD_UI_PREFIX . '/display/default'); - $this->submitForm(['layout[enabled]' => TRUE, 'layout[allow_custom]' => TRUE], 'Save'); + $this->submitForm([ + 'layout[enabled]' => TRUE, + 'layout[allow_custom]' => TRUE, + ], 'Save'); $block_1_locator = static::INLINE_BLOCK_LOCATOR; $block_2_locator = sprintf('%s + %s', static::INLINE_BLOCK_LOCATOR, static::INLINE_BLOCK_LOCATOR); @@ -486,7 +492,10 @@ public function testAccess() { // Enable layout builder and overrides. $this->drupalGet(static::FIELD_UI_PREFIX . '/display/default'); - $this->submitForm(['layout[enabled]' => TRUE, 'layout[allow_custom]' => TRUE], 'Save'); + $this->submitForm([ + 'layout[enabled]' => TRUE, + 'layout[allow_custom]' => TRUE, + ], 'Save'); // Ensure we have 2 copies of the block in node overrides. $this->drupalGet('node/1/layout'); @@ -536,7 +545,10 @@ public function testAddWorkFlow() { // Enable layout builder and overrides. $this->drupalGet(static::FIELD_UI_PREFIX . '/display/default'); - $this->submitForm(['layout[enabled]' => TRUE, 'layout[allow_custom]' => TRUE], 'Save'); + $this->submitForm([ + 'layout[enabled]' => TRUE, + 'layout[allow_custom]' => TRUE, + ], 'Save'); $layout_default_path = 'admin/structure/types/manage/bundle_with_section_field/display/default/layout'; $this->drupalGet($layout_default_path); diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTestBase.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTestBase.php index dbf68d6179..75f2e539ca 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTestBase.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTestBase.php @@ -49,7 +49,10 @@ protected function setUp() { $this->drupalPlaceBlock('local_tasks_block'); - $this->createContentType(['type' => 'bundle_with_section_field', 'new_revision' => TRUE]); + $this->createContentType([ + 'type' => 'bundle_with_section_field', + 'new_revision' => TRUE, + ]); $this->createNode([ 'type' => 'bundle_with_section_field', 'title' => 'The node title', diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php index 1562216da5..2e04d11a1e 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php @@ -157,7 +157,10 @@ public function testLayoutBuilderUi() { $assert_session->linkExists('Add section'); $this->clickLink('Add section'); - $this->assertNotEmpty($assert_session->waitForElementVisible('named', ['link', 'Two column'])); + $this->assertNotEmpty($assert_session->waitForElementVisible('named', [ + 'link', + 'Two column', + ])); $this->clickLink('Two column'); $assert_session->waitForElementVisible('named', ['button', 'Add section']); @@ -293,7 +296,10 @@ public function testConfigurableLayoutSections() { // Add another section. $assert_session->linkExists('Add section'); $this->clickLink('Add section'); - $assert_session->waitForElementVisible('named', ['link', 'Layout plugin (with settings)']); + $assert_session->waitForElementVisible('named', [ + 'link', + 'Layout plugin (with settings)', + ]); $assert_session->elementExists('css', '#drupal-off-canvas'); $assert_session->linkExists('Layout plugin (with settings)'); @@ -309,7 +315,10 @@ public function testConfigurableLayoutSections() { // Ensure validation error is displayed for ConfigureSectionForm. $assert_session->linkExists('Add section'); $this->clickLink('Add section'); - $assert_session->waitForElementVisible('named', ['link', 'Layout plugin (with settings)']); + $assert_session->waitForElementVisible('named', [ + 'link', + 'Layout plugin (with settings)', + ]); $this->clickLink('Layout plugin (with settings)'); $this->assertOffCanvasFormAfterWait('layout_builder_configure_section'); $page->fillField('layout_settings[setting_1]', 'Test Validation Error Message'); @@ -466,7 +475,10 @@ private function openAddBlockForm($block_title) { $assert_session->linkExists('Add block'); $this->clickLink('Add block'); $assert_session->assertWaitOnAjaxRequest(); - $this->assertNotEmpty($assert_session->waitForElementVisible('named', ['link', $block_title])); + $this->assertNotEmpty($assert_session->waitForElementVisible('named', [ + 'link', + $block_title, + ])); $this->clickLink($block_title); $this->assertOffCanvasFormAfterWait('layout_builder_add_block'); } @@ -481,7 +493,10 @@ private function assertOffCanvasFormAfterWait($expected_form_id) { $this->assertSession()->assertWaitOnAjaxRequest(); $off_canvas = $this->assertSession()->waitForElementVisible('css', '#drupal-off-canvas'); $this->assertNotNull($off_canvas); - $form_id_element = $off_canvas->find('hidden_field_selector', ['hidden_field', 'form_id']); + $form_id_element = $off_canvas->find('hidden_field_selector', [ + 'hidden_field', + 'form_id', + ]); // Ensure the form ID has the correct value and that the form is visible. $this->assertNotEmpty($form_id_element); $this->assertSame($expected_form_id, $form_id_element->getValue()); diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php index 6523bd6367..0d20caaab9 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php @@ -22,6 +22,9 @@ class LayoutBuilderUiTest extends WebDriverTestBase { */ const FIELD_UI_PREFIX = 'admin/structure/types/manage/bundle_with_section_field'; + /** + * {@inheritdoc} + */ protected static $modules = [ 'layout_builder', 'block', diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/MoveBlockFormTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/MoveBlockFormTest.php index 3b857b10e5..1d47867c2b 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/MoveBlockFormTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/MoveBlockFormTest.php @@ -100,7 +100,10 @@ public function testMoveBlock() { // Reorder body field in current region. $this->openBodyMoveForm(1, 'content', ['Links', 'Body (current)']); - $this->moveBlockWithKeyboard('up', 'Body (current)', ['Body (current)*', 'Links']); + $this->moveBlockWithKeyboard('up', 'Body (current)', [ + 'Body (current)*', + 'Links', + ]); $page->pressButton('Move'); $expected_block_order = [ '.block-field-blocknodebundle-with-section-fieldbody', @@ -115,7 +118,10 @@ public function testMoveBlock() { $this->openBodyMoveForm(1, 'content', ['Body (current)', 'Links']); $page->selectFieldOption('Region', '0:first'); $this->assertBlockTable(['Powered by Drupal', 'Body (current)']); - $this->moveBlockWithKeyboard('up', 'Body', ['Body (current)*', 'Powered by Drupal']); + $this->moveBlockWithKeyboard('up', 'Body', [ + 'Body (current)*', + 'Powered by Drupal', + ]); $page->pressButton('Move'); $expected_block_order = [ '.block-field-blocknodebundle-with-section-fieldbody', @@ -241,7 +247,10 @@ protected function openBodyMoveForm($delta, $region, array $initial_blocks) { $body_field_locator = "[data-layout-delta=\"$delta\"] [data-region=\"$region\"] .block-field-blocknodebundle-with-section-fieldbody"; $this->clickContextualLink($body_field_locator, 'Move'); $assert_session->assertWaitOnAjaxRequest(); - $this->assertNotEmpty($assert_session->waitForElementVisible('named', ['select', 'Region'])); + $this->assertNotEmpty($assert_session->waitForElementVisible('named', [ + 'select', + 'Region', + ])); $assert_session->fieldValueEquals('Region', "$delta:$region"); $this->assertBlockTable($initial_blocks); } diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/TestMultiWidthLayoutsTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/TestMultiWidthLayoutsTest.php index 2fd7cd7a78..2b2fdc2a66 100644 --- a/core/modules/layout_builder/tests/src/FunctionalJavascript/TestMultiWidthLayoutsTest.php +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/TestMultiWidthLayoutsTest.php @@ -18,6 +18,9 @@ class TestMultiWidthLayoutsTest extends WebDriverTestBase { */ const FIELD_UI_PREFIX = 'admin/structure/types/manage/bundle_with_section_field'; + /** + * {@inheritdoc} + */ protected static $modules = [ 'layout_builder', 'block', diff --git a/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderElementTest.php b/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderElementTest.php index 6bcf83e7f3..e27cc073f0 100644 --- a/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderElementTest.php +++ b/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderElementTest.php @@ -18,6 +18,8 @@ class LayoutBuilderElementTest extends KernelTestBase { /** + * Tests TestStore Deprecation Notice. + * * @group legacy */ public function testConstructorTempStoreDeprecation() { @@ -33,6 +35,8 @@ public function testConstructorTempStoreDeprecation() { } /** + * Tests Messenger Deprecation Notice. + * * @group legacy */ public function testConstructorMessengerDeprecation() { diff --git a/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderEntityViewDisplayTest.php b/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderEntityViewDisplayTest.php index 3d4d2052ec..513fe93fb2 100644 --- a/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderEntityViewDisplayTest.php +++ b/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderEntityViewDisplayTest.php @@ -37,11 +37,16 @@ protected function getSectionList(array $section_data) { */ public function testInvalidConfiguration() { $this->expectException(SchemaIncompleteException::class); - $this->sectionList->getSection(0)->getComponent('first-uuid')->setConfiguration(['id' => 'foo', 'bar' => 'baz']); + $this->sectionStorage->getSection(0)->getComponent('first-uuid')->setConfiguration([ + 'id' => 'foo', + 'bar' => 'baz', + ]); $this->sectionList->save(); } /** + * Check Layout Builder Enabled or not. + * * @dataProvider providerTestIsLayoutBuilderEnabled */ public function testIsLayoutBuilderEnabled($expected, $view_mode, $enabled) { @@ -69,13 +74,17 @@ public function providerTestIsLayoutBuilderEnabled() { $data['default disabled'] = [FALSE, 'default', FALSE]; $data['full enabled'] = [TRUE, 'full', TRUE]; $data['full disabled'] = [FALSE, 'full', FALSE]; - $data['_custom enabled'] = [FALSE, '_custom', TRUE]; - $data['_custom disabled'] = [FALSE, '_custom', FALSE]; + $data['_custom enabled'] = [ + FALSE, '_custom', TRUE, + ]; + $data['_custom disabled'] = [ + FALSE, '_custom', FALSE, + ]; return $data; } /** - * Tests that setting overridable enables Layout Builder only when TRUE. + * Setting overridable enables Layout Builder only when set to TRUE. */ public function testSetOverridable() { // Disable Layout Builder. @@ -85,9 +94,11 @@ public function testSetOverridable() { $this->sectionList->setOverridable(); $this->assertTrue($this->sectionList->isLayoutBuilderEnabled()); - // Ensure Layout Builder is still enabled after setting Overridable to FALSE. + // Ensure Layout Builder is still enabled + // after setting Overridable to FALSE. $this->sectionList->setOverridable(FALSE); - $this->assertTrue($this->sectionList->isLayoutBuilderEnabled()); + $this->assertEquals($this->sectionStorage->isLayoutBuilderEnabled(), + TRUE); } } diff --git a/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php b/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php index ef67ae87ac..3542b98c71 100644 --- a/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php +++ b/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php @@ -160,10 +160,16 @@ public function providerTestAccess() { FALSE, TRUE, $section_data, ['configure editable entity_test entity_test layout overrides'], ]; $data['enabled, no data, bundle edit overrides, edit access'] = [ - TRUE, TRUE, [], ['configure editable entity_test entity_test layout overrides', 'administer entity_test content'], + TRUE, TRUE, [], [ + 'configure editable entity_test entity_test layout overrides', + 'administer entity_test content', + ], ]; $data['enabled, data, bundle edit overrides, edit access'] = [ - TRUE, TRUE, $section_data, ['configure editable entity_test entity_test layout overrides', 'administer entity_test content'], + TRUE, TRUE, $section_data, [ + 'configure editable entity_test entity_test layout overrides', + 'administer entity_test content', + ], ]; return $data; } diff --git a/core/modules/layout_builder/tests/src/Kernel/SectionListTraitTest.php b/core/modules/layout_builder/tests/src/Kernel/SectionListTraitTest.php index 723947c5a2..9dd17d1cfd 100644 --- a/core/modules/layout_builder/tests/src/Kernel/SectionListTraitTest.php +++ b/core/modules/layout_builder/tests/src/Kernel/SectionListTraitTest.php @@ -31,6 +31,11 @@ public function testAddBlankSection() { } +/** + * Defines the interface for an object that stores layout section list. + * + * @see \Drupal\layout_builder\SectionListInterface + */ class TestSectionList implements SectionListInterface { use SectionListTrait { diff --git a/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php b/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php index cbd92bf279..0d2fe42b7c 100644 --- a/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php +++ b/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php @@ -477,12 +477,12 @@ public function testOnBuildRenderEmptyBuildWithCacheTags() { $expected_build = []; $expected_cache = $expected_build + [ - '#cache' => [ - 'contexts' => [], - 'tags' => ['empty_build_cache_test', 'test'], - 'max-age' => -1, - ], - ]; + '#cache' => [ + 'contexts' => [], + 'tags' => ['empty_build_cache_test', 'test'], + 'max-age' => -1, + ], + ]; $subscriber->onBuildRender($event); $result = $event->getBuild(); diff --git a/core/modules/layout_builder/tests/src/Unit/SectionTest.php b/core/modules/layout_builder/tests/src/Unit/SectionTest.php index 2e21947de9..316b108cfa 100644 --- a/core/modules/layout_builder/tests/src/Unit/SectionTest.php +++ b/core/modules/layout_builder/tests/src/Unit/SectionTest.php @@ -38,7 +38,10 @@ protected function setUp(): void { (new SectionComponent('first-uuid', 'ordered-region', ['id' => 'first-block-id']))->setWeight(2), ], [ - 'bad_judgement' => ['blink_speed' => 'fast', 'spin_direction' => 'clockwise'], + 'bad_judgement' => [ + 'blink_speed' => 'fast', + 'spin_direction' => 'clockwise', + ], 'hunt_and_peck' => ['delay' => '300ms'], ] ); diff --git a/core/modules/layout_builder/tests/src/Unit/SectionDataNormalizerTest.php b/core/modules/layout_builder/tests/src/Unit/SectionDataNormalizerTest.php new file mode 100644 index 0000000000..be271dd4f3 --- /dev/null +++ b/core/modules/layout_builder/tests/src/Unit/SectionDataNormalizerTest.php @@ -0,0 +1,95 @@ +<?php + +namespace Drupal\Tests\layout_builder\Unit; + +use Drupal\Core\Field\FieldItemInterface; +use Drupal\Core\TypedData\DataDefinitionInterface; +use Drupal\layout_builder\Normalizer\SectionDataNormalizer; +use Drupal\layout_builder\Plugin\DataType\SectionData; +use Drupal\layout_builder\Section; +use Drupal\Tests\UnitTestCase; + +/** + * @coversDefaultClass \Drupal\layout_builder\Normalizer\SectionDataNormalizer + * @group layout_builder + */ +class SectionDataNormalizerTest extends UnitTestCase { + + /** + * The normalizer. + * + * @var \Drupal\layout_builder\Normalizer\SectionDataNormalizer + */ + protected $normalizer; + + /** + * {@inheritdoc} + */ + protected function setUp(): void { + parent::setUp(); + $this->normalizer = new SectionDataNormalizer(); + } + + /** + * @covers ::supportsNormalization + */ + public function testSupportsNormalization() { + $section_data = $this->prophesize(SectionData::class); + $this->assertTrue($this->normalizer->supportsNormalization($section_data->reveal())); + } + + /** + * @covers ::supportsDenormalization + */ + public function testSupportsDenormalization() { + $this->assertTrue($this->normalizer->supportsDenormalization([], SectionData::class)); + } + + /** + * Tests the normalize function. + * + * @covers ::normalize + */ + public function testNormalize() { + $data = ['foo']; + $section_data = $this->prophesize(SectionData::class); + $section = $this->prophesize(Section::class); + $section->toArray() + ->willReturn($data); + $section_data->getValue() + ->willReturn($section); + $this->assertArrayEquals($data, $this->normalizer->normalize($section_data->reveal())); + } + + /** + * Tests the denormalize function. + * + * @covers ::denormalize + */ + public function testDenormalize() { + $data = [ + 'layout_id' => $this->randomMachineName(), + 'layout_settings' => [ + 'label' => $this->randomMachineName(), + ], + 'components' => [], + 'third_party_settings' => [], + ]; + $target_instance = $this->prophesize(FieldItemInterface::class); + $target_instance->getDataDefinition() + ->willReturn($this->prophesize(DataDefinitionInterface::class)); + $context = [ + 'target_instance' => [ + $target_instance, + ], + ]; + /** @var \Drupal\layout_builder\Section $section_data */ + $section_data = $this->normalizer->denormalize($data, SectionData::class, $context); + $this->assertEquals($data['layout_id'], $section_data->getLayoutId()); + $this->assertEquals($data['components'], $section_data->getComponents()); + foreach ($section_data->getThirdPartyProviders() as $provider) { + $this->assertEquals($data['third_party_settings'], $section_data->getThirdPartySettings($provider)); + } + } + +} diff --git a/core/modules/layout_builder/src/Normalizer/SectionDataNormalizer.php b/core/modules/layout_builder/src/Normalizer/SectionDataNormalizer.php new file mode 100644 index 0000000000..5674439586 --- /dev/null +++ b/core/modules/layout_builder/src/Normalizer/SectionDataNormalizer.php @@ -0,0 +1,34 @@ +<?php + +namespace Drupal\layout_builder\Normalizer; + +use Drupal\layout_builder\Plugin\DataType\SectionData; +use Drupal\layout_builder\Section; +use Drupal\serialization\Normalizer\TypedDataNormalizer; +use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; + +/** + * Normalizes section data. + */ +class SectionDataNormalizer extends TypedDataNormalizer implements DenormalizerInterface { + + /** + * {@inheritdoc} + */ + protected $supportedInterfaceOrClass = SectionData::class; + + /** + * {@inheritdoc} + */ + public function normalize($object, $format = NULL, array $context = []) { + return $object->getValue()->toArray(); + } + + /** + * {@inheritdoc} + */ + public function denormalize($data, $class, $format = NULL, array $context = []) { + return Section::fromArray($data); + } + +}