diff --git a/core/modules/field_layout/field_layout.install b/core/modules/field_layout/field_layout.install index 5956bf1095412e89993b8381d7fd96fb0e8e7094..88882d39289dfd17cf266ac155f9b8fa2e5e4fcf 100644 --- a/core/modules/field_layout/field_layout.install +++ b/core/modules/field_layout/field_layout.install @@ -6,6 +6,7 @@ */ use Drupal\Core\Cache\Cache; +use Drupal\Core\Entity\Display\EntityDisplayInterface; use Drupal\Core\Entity\Entity\EntityFormDisplay; use Drupal\Core\Entity\Entity\EntityViewDisplay; use Drupal\field_layout\Display\EntityDisplayWithLayoutInterface; @@ -15,8 +16,10 @@ */ function field_layout_install() { // Ensure each entity display has a layout. - $entity_save = function (EntityDisplayWithLayoutInterface $entity) { - $entity->ensureLayout()->save(); + $entity_save = function (EntityDisplayInterface $entity) { + if ($entity instanceof EntityDisplayWithLayoutInterface) { + $entity->ensureLayout()->save(); + } }; array_map($entity_save, EntityViewDisplay::loadMultiple()); array_map($entity_save, EntityFormDisplay::loadMultiple()); @@ -31,8 +34,10 @@ function field_layout_install() { function field_layout_uninstall() { // Reset each entity display to use the one-column layout to best approximate // the absence of layouts. - $entity_save = function (EntityDisplayWithLayoutInterface $entity) { - $entity->setLayoutId('layout_onecol')->save(); + $entity_save = function (EntityDisplayInterface $entity) { + if ($entity instanceof EntityDisplayWithLayoutInterface) { + $entity->setLayoutId('layout_onecol')->save(); + } }; array_map($entity_save, EntityViewDisplay::loadMultiple()); array_map($entity_save, EntityFormDisplay::loadMultiple()); diff --git a/core/modules/field_layout/tests/src/Kernel/FieldLayoutUninstallTest.php b/core/modules/field_layout/tests/src/Kernel/FieldLayoutUninstallTest.php new file mode 100644 index 0000000000000000000000000000000000000000..387e6b235bb0a34416d3e42cf444e284431a9d81 --- /dev/null +++ b/core/modules/field_layout/tests/src/Kernel/FieldLayoutUninstallTest.php @@ -0,0 +1,29 @@ +<?php + +namespace Drupal\Tests\field_layout\Kernel; + +use Drupal\Tests\layout_builder\Kernel\LayoutBuilderCompatibilityTestBase; + +/** + * @group field_layout + */ +class FieldLayoutUninstallTest extends LayoutBuilderCompatibilityTestBase { + + /** + * Ensures field layout can be uninstalled with layout builder enabled. + */ + public function testFieldLayoutUninstall() { + // Setup user schema so user hook uninstall hook doesn't break. + $this->installSchema('user', 'users_data'); + + // Setup layout builder and same displays. + $this->installLayoutBuilder(); + + // Ensure install hook can handle displays without a layout. + $this->container->get('module_installer')->install(['field_layout']); + + // Ensure uninstall hook can handle displays without a layout. + $this->container->get('module_installer')->uninstall(['field_layout']); + } + +}