diff --git a/core/modules/jsonapi/src/Normalizer/ResourceObjectNormalizer.php b/core/modules/jsonapi/src/Normalizer/ResourceObjectNormalizer.php index 73ed4c917fa847cef6e3f59d69aa118664d50097..44da232a7172dd80f7f384aef32cc6fc7dc4b756 100644 --- a/core/modules/jsonapi/src/Normalizer/ResourceObjectNormalizer.php +++ b/core/modules/jsonapi/src/Normalizer/ResourceObjectNormalizer.php @@ -192,7 +192,7 @@ protected function serializeField($field, array $context, $format) { // @todo Replace this workaround after https://www.drupal.org/node/3043245 // or remove the need for this in https://www.drupal.org/node/2942975. // See \Drupal\layout_builder\Normalizer\LayoutEntityDisplayNormalizer. - if ($context['resource_object']->getResourceType()->getDeserializationTargetClass() === 'Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay' && $context['resource_object']->getField('third_party_settings') === $field) { + if (is_a($context['resource_object']->getResourceType()->getDeserializationTargetClass(), 'Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay', TRUE) && $context['resource_object']->getField('third_party_settings') === $field) { unset($field['layout_builder']['sections']); } diff --git a/core/modules/layout_builder/layout_builder.module b/core/modules/layout_builder/layout_builder.module index 6e8d0a25f93a20a25303b4cfbb3f6f1f63c55a8f..1646139aa7bf8aed43d3d91c698a6311746a7215 100644 --- a/core/modules/layout_builder/layout_builder.module +++ b/core/modules/layout_builder/layout_builder.module @@ -26,7 +26,6 @@ use Drupal\Core\Session\AccountInterface; use Drupal\Core\Access\AccessResult; use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage; -use Drupal\layout_builder\QuickEditIntegration; /** * Implements hook_help(). @@ -162,12 +161,6 @@ function layout_builder_entity_view_alter(array &$build, EntityInterface $entity if ($display instanceof LayoutBuilderEntityViewDisplay && strpos($route_name, 'layout_builder.') === 0) { unset($build['#contextual_links']); } - - if (\Drupal::moduleHandler()->moduleExists('quickedit')) { - /** @var \Drupal\layout_builder\QuickEditIntegration $quick_edit_integration */ - $quick_edit_integration = \Drupal::classResolver(QuickEditIntegration::class); - $quick_edit_integration->entityViewAlter($build, $entity, $display); - } } /** @@ -351,15 +344,6 @@ function layout_builder_system_breadcrumb_alter(Breadcrumb &$breadcrumb, RouteMa } } -/** - * Implements hook_quickedit_render_field(). - */ -function layout_builder_quickedit_render_field(EntityInterface $entity, $field_name, $view_mode_id, $langcode) { - /** @var \Drupal\layout_builder\QuickEditIntegration $quick_edit_integration */ - $quick_edit_integration = \Drupal::classResolver(QuickEditIntegration::class); - return $quick_edit_integration->quickEditRenderField($entity, $field_name, $view_mode_id, $langcode); -} - /** * Implements hook_entity_translation_create(). */ diff --git a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php index d543fe1619557edbaf532c41c700706515218e93..c63b96ff01d50d12991ae7f893fbd07436fed4fc 100644 --- a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php +++ b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php @@ -18,7 +18,6 @@ use Drupal\field\Entity\FieldStorageConfig; use Drupal\layout_builder\LayoutEntityHelperTrait; use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage; -use Drupal\layout_builder\QuickEditIntegration; use Drupal\layout_builder\Section; use Drupal\layout_builder\SectionComponent; use Drupal\layout_builder\SectionListTrait; @@ -473,7 +472,7 @@ private function sectionStorageManager() { * {@inheritdoc} */ public function getComponent($name) { - if ($this->isLayoutBuilderEnabled() && $section_component = $this->getQuickEditSectionComponent() ?: $this->getSectionComponentForFieldName($name)) { + if ($this->isLayoutBuilderEnabled() && $section_component = $this->getSectionComponentForFieldName($name)) { $plugin = $section_component->getPlugin(); if ($plugin instanceof ConfigurableInterface) { $configuration = $plugin->getConfiguration(); @@ -485,43 +484,6 @@ public function getComponent($name) { return parent::getComponent($name); } - /** - * Returns the Quick Edit formatter settings. - * - * @return \Drupal\layout_builder\SectionComponent|null - * The section component if it is available. - * - * @see \Drupal\layout_builder\QuickEditIntegration::entityViewAlter() - * @see \Drupal\quickedit\MetadataGenerator::generateFieldMetadata() - */ - private function getQuickEditSectionComponent() { - // To determine the Quick Edit view_mode ID we need an originalMode set. - if ($original_mode = $this->getOriginalMode()) { - $parts = explode('-', $original_mode); - // The Quick Edit view mode ID is created by - // \Drupal\layout_builder\QuickEditIntegration::entityViewAlter() - // concatenating together the information we need to retrieve the Layout - // Builder component. It follows the structure prescribed by the - // documentation of hook_quickedit_render_field(). - if (count($parts) === 6 && $parts[0] === 'layout_builder') { - [, $delta, $component_uuid, $entity_id] = QuickEditIntegration::deconstructViewModeId($original_mode); - $entity = $this->entityTypeManager()->getStorage($this->getTargetEntityTypeId())->load($entity_id); - $sections = $this->getEntitySections($entity); - if (isset($sections[$delta])) { - $component = $sections[$delta]->getComponent($component_uuid); - $plugin = $component->getPlugin(); - // We only care about FieldBlock because these are only components - // that provide Quick Edit integration: Quick Edit enables in-place - // editing of fields of entities, not of anything else. - if ($plugin instanceof DerivativeInspectionInterface && $plugin->getBaseId() === 'field_block') { - return $component; - } - } - } - } - return NULL; - } - /** * Gets the component for a given field name if any. * diff --git a/core/modules/quickedit/quickedit.module b/core/modules/quickedit/quickedit.module index 028fe20143516ecaf3741e6e330fa5fe03d42f1d..5ea1e24b593e1e120cd1428cc0756ac3fc8129a1 100644 --- a/core/modules/quickedit/quickedit.module +++ b/core/modules/quickedit/quickedit.module @@ -16,6 +16,9 @@ use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Entity\RevisionableInterface; use Drupal\Core\Routing\RouteMatchInterface; +use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay; +use Drupal\quickedit\Entity\QuickEditLayoutBuilderEntityViewDisplay; +use Drupal\quickedit\LayoutBuilderIntegration; /** * Implements hook_help(). @@ -174,10 +177,28 @@ function quickedit_preprocess_field(&$variables) { } } +/** + * Implements hook_entity_type_alter(). + */ +function quickedit_entity_type_alter(array &$entity_types) { + if (\Drupal::moduleHandler()->moduleExists('layout_builder')) { + /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */ + if ($entity_types['entity_view_display']->getClass() === LayoutBuilderEntityViewDisplay::class) { + $entity_types['entity_view_display']->setClass(QuickEditLayoutBuilderEntityViewDisplay::class); + } + } +} + /** * Implements hook_entity_view_alter(). */ function quickedit_entity_view_alter(&$build, EntityInterface $entity, EntityViewDisplayInterface $display) { + if (\Drupal::moduleHandler()->moduleExists('layout_builder')) { + /** @var \Drupal\quickedit\LayoutBuilderIntegration $layout_builder_integration */ + $layout_builder_integration = \Drupal::classResolver(LayoutBuilderIntegration::class); + $layout_builder_integration->entityViewAlter($build, $entity, $display); + } + if (isset($build['#embed'])) { return; } @@ -189,3 +210,12 @@ function quickedit_entity_view_alter(&$build, EntityInterface $entity, EntityVie $build['#attributes']['data-quickedit-entity-id'] = $entity->getEntityTypeId() . '/' . $entity->id(); } + +/** + * Implements hook_quickedit_render_field(). + */ +function layout_builder_quickedit_render_field(EntityInterface $entity, $field_name, $view_mode_id, $langcode) { + /** @var \Drupal\quickedit\LayoutBuilderIntegration $layout_builder_integration */ + $layout_builder_integration = \Drupal::classResolver(LayoutBuilderIntegration::class); + return $layout_builder_integration->quickEditRenderField($entity, $field_name, $view_mode_id, $langcode); +} diff --git a/core/modules/quickedit/src/Entity/QuickEditLayoutBuilderEntityViewDisplay.php b/core/modules/quickedit/src/Entity/QuickEditLayoutBuilderEntityViewDisplay.php new file mode 100644 index 0000000000000000000000000000000000000000..3dd4eb9b106271d1c3a80b81c20d59bc262b262b --- /dev/null +++ b/core/modules/quickedit/src/Entity/QuickEditLayoutBuilderEntityViewDisplay.php @@ -0,0 +1,68 @@ +<?php + +namespace Drupal\quickedit\Entity; + +use Drupal\Component\Plugin\ConfigurableInterface; +use Drupal\Component\Plugin\DerivativeInspectionInterface; +use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay; +use Drupal\quickedit\LayoutBuilderIntegration; + +/** + * Provides an entity view display entity that has a layout with quickedit. + */ +class QuickEditLayoutBuilderEntityViewDisplay extends LayoutBuilderEntityViewDisplay { + + /** + * {@inheritdoc} + */ + public function getComponent($name) { + if ($this->isLayoutBuilderEnabled() && $section_component = $this->getQuickEditSectionComponent()) { + $plugin = $section_component->getPlugin(); + if ($plugin instanceof ConfigurableInterface) { + $configuration = $plugin->getConfiguration(); + if (isset($configuration['formatter'])) { + return $configuration['formatter']; + } + } + } + return parent::getComponent($name); + } + + /** + * Returns the Quick Edit formatter settings. + * + * @return \Drupal\layout_builder\SectionComponent|null + * The section component if it is available. + * + * @see \Drupal\quickedit\LayoutBuilderIntegration::entityViewAlter() + * @see \Drupal\quickedit\MetadataGenerator::generateFieldMetadata() + */ + private function getQuickEditSectionComponent() { + // To determine the Quick Edit view_mode ID we need an originalMode set. + if ($original_mode = $this->getOriginalMode()) { + $parts = explode('-', $original_mode); + // The Quick Edit view mode ID is created by + // \Drupal\quickedit\LayoutBuilderIntegration::entityViewAlter() + // concatenating together the information we need to retrieve the Layout + // Builder component. It follows the structure prescribed by the + // documentation of hook_quickedit_render_field(). + if (count($parts) === 6 && $parts[0] === 'layout_builder') { + [, $delta, $component_uuid, $entity_id] = LayoutBuilderIntegration::deconstructViewModeId($original_mode); + $entity = $this->entityTypeManager()->getStorage($this->getTargetEntityTypeId())->load($entity_id); + $sections = $this->getEntitySections($entity); + if (isset($sections[$delta])) { + $component = $sections[$delta]->getComponent($component_uuid); + $plugin = $component->getPlugin(); + // We only care about FieldBlock because these are only components + // that provide Quick Edit integration: Quick Edit enables in-place + // editing of fields of entities, not of anything else. + if ($plugin instanceof DerivativeInspectionInterface && $plugin->getBaseId() === 'field_block') { + return $component; + } + } + } + } + return NULL; + } + +} diff --git a/core/modules/layout_builder/src/QuickEditIntegration.php b/core/modules/quickedit/src/LayoutBuilderIntegration.php similarity index 96% rename from core/modules/layout_builder/src/QuickEditIntegration.php rename to core/modules/quickedit/src/LayoutBuilderIntegration.php index c087f90971f5e7759bd0ff91c1a10317685391f3..49e229b98540c4cd7f4a8bf5ee03cbbeb24e3d83 100644 --- a/core/modules/layout_builder/src/QuickEditIntegration.php +++ b/core/modules/quickedit/src/LayoutBuilderIntegration.php @@ -1,6 +1,6 @@ <?php -namespace Drupal\layout_builder; +namespace Drupal\quickedit; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Cache\CacheableMetadata; @@ -19,12 +19,12 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * Helper methods for Quick Edit module integration. + * Helper methods for Layout Builder module integration. * * @internal * This is an internal utility class wrapping hook implementations. */ -class QuickEditIntegration implements ContainerInjectionInterface { +class LayoutBuilderIntegration implements ContainerInjectionInterface { use LoggerChannelTrait; @@ -50,7 +50,7 @@ class QuickEditIntegration implements ContainerInjectionInterface { protected $entityTypeManager; /** - * Constructs a new QuickEditIntegration object. + * Constructs a new LayoutBuilderIntegration object. * * @param \Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface $section_storage_manager * The section storage manager. @@ -77,7 +77,7 @@ public static function create(ContainerInterface $container) { } /** - * Alters the entity view build for Quick Edit compatibility. + * Alters the entity view build for Layout Builder compatibility. * * When rendering fields outside of normal view modes, Quick Edit requires * that modules identify themselves with a view mode ID in the format @@ -191,7 +191,7 @@ public function entityViewAlter(array &$build, EntityInterface $entity, EntityVi * @return string * The Quick Edit view mode ID. * - * @see \Drupal\layout_builder\QuickEditIntegration::deconstructViewModeId() + * @see \Drupal\quickedit\LayoutBuilderIntegration::deconstructViewModeId() */ private static function getViewModeId(EntityInterface $entity, EntityViewDisplayInterface $display, $delta, $component_uuid, $sections_hash) { return implode('-', [ @@ -216,7 +216,7 @@ private static function getViewModeId(EntityInterface $entity, EntityViewDisplay * An array containing the entity view mode ID, the delta, the component * UUID, and the entity ID. * - * @see \Drupal\layout_builder\QuickEditIntegration::getViewModeId() + * @see \Drupal\quickedit\LayoutBuilderIntegration::getViewModeId() */ public static function deconstructViewModeId($quick_edit_view_mode_id) { [, $entity_view_mode_id, $delta, $component_uuid, $entity_id] = explode('-', $quick_edit_view_mode_id, 7); diff --git a/core/modules/quickedit/tests/src/Functional/Jsonapi/QuickEditLayoutBuilderEntityViewDisplayTest.php b/core/modules/quickedit/tests/src/Functional/Jsonapi/QuickEditLayoutBuilderEntityViewDisplayTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0e1509b2a73b10afbc34c188ad65219de619035e --- /dev/null +++ b/core/modules/quickedit/tests/src/Functional/Jsonapi/QuickEditLayoutBuilderEntityViewDisplayTest.php @@ -0,0 +1,21 @@ +<?php + +namespace Drupal\Tests\quickedit\Functional\Jsonapi; + +use Drupal\Tests\layout_builder\Functional\Jsonapi\LayoutBuilderEntityViewDisplayTest; + +/** + * JSON:API integration test for the "EntityViewDisplay" config entity type. + * + * @group jsonapi + * @group layout_builder + * @group quickedit + */ +class QuickEditLayoutBuilderEntityViewDisplayTest extends LayoutBuilderEntityViewDisplayTest { + + /** + * {@inheritdoc} + */ + protected static $modules = ['quickedit']; + +} diff --git a/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonAnonTest.php b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonAnonTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c138148ae92558b19827dcd9b0160c4a6cf03298 --- /dev/null +++ b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonAnonTest.php @@ -0,0 +1,19 @@ +<?php + +namespace Drupal\Tests\quickedit\Functional\Rest; + +use Drupal\Tests\layout_builder\Functional\Rest\LayoutBuilderEntityViewDisplayJsonAnonTest; + +/** + * @group quickedit + * @group layout_builder + * @group rest + */ +class QuickEditLayoutBuilderEntityViewDisplayJsonAnonTest extends LayoutBuilderEntityViewDisplayJsonAnonTest { + + /** + * {@inheritdoc} + */ + protected static $modules = ['quickedit']; + +} diff --git a/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonBasicAuthTest.php b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonBasicAuthTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a3acf46eead6f7ea403aa04351585031697f7b7a --- /dev/null +++ b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonBasicAuthTest.php @@ -0,0 +1,19 @@ +<?php + +namespace Drupal\Tests\quickedit\Functional\Rest; + +use Drupal\Tests\layout_builder\Functional\Rest\LayoutBuilderEntityViewDisplayJsonBasicAuthTest; + +/** + * @group quickedit + * @group layout_builder + * @group rest + */ +class QuickEditLayoutBuilderEntityViewDisplayJsonBasicAuthTest extends LayoutBuilderEntityViewDisplayJsonBasicAuthTest { + + /** + * {@inheritdoc} + */ + protected static $modules = ['quickedit']; + +} diff --git a/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonCookieTest.php b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonCookieTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ffd07b021d4061e166cf9c103145fefd322549d4 --- /dev/null +++ b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayJsonCookieTest.php @@ -0,0 +1,19 @@ +<?php + +namespace Drupal\Tests\quickedit\Functional\Rest; + +use Drupal\Tests\layout_builder\Functional\Rest\LayoutBuilderEntityViewDisplayJsonCookieTest; + +/** + * @group quickedit + * @group layout_builder + * @group rest + */ +class QuickEditLayoutBuilderEntityViewDisplayJsonCookieTest extends LayoutBuilderEntityViewDisplayJsonCookieTest { + + /** + * {@inheritdoc} + */ + protected static $modules = ['quickedit']; + +} diff --git a/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlAnonTest.php b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlAnonTest.php new file mode 100644 index 0000000000000000000000000000000000000000..87c6a72639f0e5b22a657d7286765056dd37bba2 --- /dev/null +++ b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlAnonTest.php @@ -0,0 +1,19 @@ +<?php + +namespace Drupal\Tests\quickedit\Functional\Rest; + +use Drupal\Tests\layout_builder\Functional\Rest\LayoutBuilderEntityViewDisplayXmlAnonTest; + +/** + * @group quickedit + * @group layout_builder + * @group rest + */ +class QuickEditLayoutBuilderEntityViewDisplayXmlAnonTest extends LayoutBuilderEntityViewDisplayXmlAnonTest { + + /** + * {@inheritdoc} + */ + protected static $modules = ['quickedit']; + +} diff --git a/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlBasicAuthTest.php b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlBasicAuthTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8640666302a51e72e9807ac439d4d2217f43d2eb --- /dev/null +++ b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlBasicAuthTest.php @@ -0,0 +1,19 @@ +<?php + +namespace Drupal\Tests\quickedit\Functional\Rest; + +use Drupal\Tests\layout_builder\Functional\Rest\LayoutBuilderEntityViewDisplayXmlBasicAuthTest; + +/** + * @group quickedit + * @group layout_builder + * @group rest + */ +class QuickEditLayoutBuilderEntityViewDisplayXmlBasicAuthTest extends LayoutBuilderEntityViewDisplayXmlBasicAuthTest { + + /** + * {@inheritdoc} + */ + protected static $modules = ['quickedit']; + +} diff --git a/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlCookieTest.php b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlCookieTest.php new file mode 100644 index 0000000000000000000000000000000000000000..699efe177ecf8f8badc5d0c0c7e7e0e375b7396b --- /dev/null +++ b/core/modules/quickedit/tests/src/Functional/Rest/QuickEditLayoutBuilderEntityViewDisplayXmlCookieTest.php @@ -0,0 +1,19 @@ +<?php + +namespace Drupal\Tests\quickedit\Functional\Rest; + +use Drupal\Tests\layout_builder\Functional\Rest\LayoutBuilderEntityViewDisplayXmlCookieTest; + +/** + * @group quickedit + * @group layout_builder + * @group rest + */ +class QuickEditLayoutBuilderEntityViewDisplayXmlCookieTest extends LayoutBuilderEntityViewDisplayXmlCookieTest { + + /** + * {@inheritdoc} + */ + protected static $modules = ['quickedit']; + +} diff --git a/core/modules/quickedit/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php b/core/modules/quickedit/tests/src/FunctionalJavascript/LayoutBuilderIntegrationTest.php similarity index 99% rename from core/modules/quickedit/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php rename to core/modules/quickedit/tests/src/FunctionalJavascript/LayoutBuilderIntegrationTest.php index a15bb9ac5b978851c5a1911778e9abf19dbc741c..7bc4e2a4ef70d8872d4b6ac66ddc104ece5cec96 100644 --- a/core/modules/quickedit/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php +++ b/core/modules/quickedit/tests/src/FunctionalJavascript/LayoutBuilderIntegrationTest.php @@ -14,7 +14,7 @@ /** * @group quickedit */ -class QuickEditIntegrationTest extends QuickEditJavascriptTestBase { +class LayoutBuilderIntegrationTest extends QuickEditJavascriptTestBase { use EntityReferenceTestTrait;