Issue #3041659 by tedbow, tim.plunkett, amateescu, plach, xjm, effulgentsia, Wim Leers, webchick: Remove the layout tab from translations because Layout Builder does not support translations yet
parent
73af6069c2
commit
cbf7788676
|
@ -355,3 +355,15 @@ function layout_builder_quickedit_render_field(EntityInterface $entity, $field_n
|
||||||
$quick_edit_integration = \Drupal::classResolver(QuickEditIntegration::class);
|
$quick_edit_integration = \Drupal::classResolver(QuickEditIntegration::class);
|
||||||
return $quick_edit_integration->quickEditRenderField($entity, $field_name, $view_mode_id, $langcode);
|
return $quick_edit_integration->quickEditRenderField($entity, $field_name, $view_mode_id, $langcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_entity_translation_create().
|
||||||
|
*/
|
||||||
|
function layout_builder_entity_translation_create(EntityInterface $translation) {
|
||||||
|
/** @var \Drupal\Core\Entity\FieldableEntityInterface $translation */
|
||||||
|
if ($translation->hasField(OverridesSectionStorage::FIELD_NAME) && $translation->getFieldDefinition(OverridesSectionStorage::FIELD_NAME)->isTranslatable()) {
|
||||||
|
// When creating a new translation do not copy untranslated sections because
|
||||||
|
// per-language layouts are not supported.
|
||||||
|
$translation->set(OverridesSectionStorage::FIELD_NAME, []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -207,6 +207,7 @@ class LayoutBuilderEntityViewDisplay extends BaseEntityViewDisplay implements La
|
||||||
'type' => 'layout_section',
|
'type' => 'layout_section',
|
||||||
'locked' => TRUE,
|
'locked' => TRUE,
|
||||||
]);
|
]);
|
||||||
|
$field_storage->setTranslatable(FALSE);
|
||||||
$field_storage->save();
|
$field_storage->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,6 +216,7 @@ class LayoutBuilderEntityViewDisplay extends BaseEntityViewDisplay implements La
|
||||||
'bundle' => $bundle,
|
'bundle' => $bundle,
|
||||||
'label' => t('Layout'),
|
'label' => t('Layout'),
|
||||||
]);
|
]);
|
||||||
|
$field->setTranslatable(FALSE);
|
||||||
$field->save();
|
$field->save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -397,9 +397,29 @@ class OverridesSectionStorage extends SectionStorageBase implements ContainerFac
|
||||||
|
|
||||||
// Access also depends on the default being enabled.
|
// Access also depends on the default being enabled.
|
||||||
$result = $result->andIf($this->getDefaultSectionStorage()->access($operation, $account, TRUE));
|
$result = $result->andIf($this->getDefaultSectionStorage()->access($operation, $account, TRUE));
|
||||||
|
$result = $this->handleTranslationAccess($result, $operation, $account);
|
||||||
return $return_as_object ? $result : $result->isAllowed();
|
return $return_as_object ? $result : $result->isAllowed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles access checks related to translations.
|
||||||
|
*
|
||||||
|
* @param \Drupal\Core\Access\AccessResult $result
|
||||||
|
* The access result.
|
||||||
|
* @param string $operation
|
||||||
|
* The operation to be performed.
|
||||||
|
* @param \Drupal\Core\Session\AccountInterface $account
|
||||||
|
* The user for which to check access.
|
||||||
|
*
|
||||||
|
* @return \Drupal\Core\Access\AccessResultInterface
|
||||||
|
* The access result.
|
||||||
|
*/
|
||||||
|
protected function handleTranslationAccess(AccessResult $result, $operation, AccountInterface $account) {
|
||||||
|
$entity = $this->getEntity();
|
||||||
|
// Access is always denied on non-default translations.
|
||||||
|
return $result->andIf(AccessResult::allowedIf(!($entity instanceof TranslatableInterface && !$entity->isDefaultTranslation())))->addCacheableDependency($entity);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Drupal\Tests\layout_builder\Functional;
|
|
||||||
|
|
||||||
use Drupal\block_content\Entity\BlockContentType;
|
|
||||||
use Drupal\language\Entity\ConfigurableLanguage;
|
|
||||||
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
|
|
||||||
use Drupal\Tests\BrowserTestBase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests Layout Builder functionality with multiple languages installed.
|
|
||||||
*
|
|
||||||
* @group layout_builder
|
|
||||||
*/
|
|
||||||
class LayoutBuilderMultilingualTest extends BrowserTestBase {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected static $modules = [
|
|
||||||
'layout_builder',
|
|
||||||
'node',
|
|
||||||
'block_content',
|
|
||||||
'content_translation',
|
|
||||||
'locale',
|
|
||||||
];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function setUp() {
|
|
||||||
parent::setUp();
|
|
||||||
|
|
||||||
// There must be more than one block type available to trigger
|
|
||||||
// \Drupal\layout_builder\Controller\ChooseBlockController::inlineBlockList().
|
|
||||||
BlockContentType::create([
|
|
||||||
'id' => 'first_type',
|
|
||||||
'label' => 'First type',
|
|
||||||
])->save();
|
|
||||||
BlockContentType::create([
|
|
||||||
'id' => 'second_type',
|
|
||||||
'label' => 'Second type',
|
|
||||||
])->save();
|
|
||||||
|
|
||||||
// Create a translatable content type with layout overrides enabled.
|
|
||||||
$this->createContentType([
|
|
||||||
'type' => 'bundle_with_section_field',
|
|
||||||
]);
|
|
||||||
$this->container->get('content_translation.manager')->setEnabled('node', 'bundle_with_section_field', TRUE);
|
|
||||||
LayoutBuilderEntityViewDisplay::load('node.bundle_with_section_field.default')
|
|
||||||
->enableLayoutBuilder()
|
|
||||||
->setOverridable()
|
|
||||||
->save();
|
|
||||||
|
|
||||||
// Create a second language.
|
|
||||||
ConfigurableLanguage::createFromLangcode('es')->save();
|
|
||||||
|
|
||||||
// Create a node and translate it.
|
|
||||||
$node = $this->createNode([
|
|
||||||
'type' => 'bundle_with_section_field',
|
|
||||||
'title' => 'The untranslated node title',
|
|
||||||
]);
|
|
||||||
$node->addTranslation('es', [
|
|
||||||
'title' => 'The translated node title',
|
|
||||||
]);
|
|
||||||
$node->save();
|
|
||||||
|
|
||||||
$this->drupalLogin($this->createUser([
|
|
||||||
'configure any layout',
|
|
||||||
'translate interface',
|
|
||||||
'create and edit custom blocks',
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that custom blocks are available for translated entities.
|
|
||||||
*/
|
|
||||||
public function testCustomBlocks() {
|
|
||||||
// Check translated and untranslated entities before translating the string.
|
|
||||||
$this->assertCustomBlocks('node/1/layout');
|
|
||||||
$this->assertCustomBlocks('es/node/1/layout');
|
|
||||||
|
|
||||||
// Translate the 'Inline blocks' string used as a category in
|
|
||||||
// \Drupal\layout_builder\Controller\ChooseBlockController::inlineBlockList().
|
|
||||||
$this->drupalPostForm('admin/config/regional/translate', ['string' => 'Inline blocks'], 'Filter');
|
|
||||||
$this->drupalPostForm(NULL, ['Translated string (Spanish)' => 'Bloques en linea'], 'Save translations');
|
|
||||||
|
|
||||||
// Check translated and untranslated entities after translating the string.
|
|
||||||
$this->assertCustomBlocks('node/1/layout');
|
|
||||||
$this->assertCustomBlocks('es/node/1/layout');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asserts that custom blocks are available.
|
|
||||||
*
|
|
||||||
* @param string $url
|
|
||||||
* The URL for a Layout Builder enabled entity.
|
|
||||||
*/
|
|
||||||
protected function assertCustomBlocks($url) {
|
|
||||||
$page = $this->getSession()->getPage();
|
|
||||||
$assert_session = $this->assertSession();
|
|
||||||
|
|
||||||
$this->drupalGet($url);
|
|
||||||
$page->clickLink('Add Block');
|
|
||||||
$page->clickLink('Create custom block');
|
|
||||||
$assert_session->linkExists('First type');
|
|
||||||
$assert_session->linkExists('Second type');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,218 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\layout_builder\Functional;
|
||||||
|
|
||||||
|
use Drupal\Tests\content_translation\Functional\ContentTranslationTestBase;
|
||||||
|
use Drupal\Core\Entity\Entity\EntityViewDisplay;
|
||||||
|
use Drupal\Core\Url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that the Layout Builder works with translated content.
|
||||||
|
*
|
||||||
|
* @group layout_builder
|
||||||
|
*/
|
||||||
|
class LayoutBuilderTranslationTest extends ContentTranslationTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = [
|
||||||
|
'content_translation',
|
||||||
|
'contextual',
|
||||||
|
'entity_test',
|
||||||
|
'layout_builder',
|
||||||
|
'block',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The entity used for testing.
|
||||||
|
*
|
||||||
|
* @var \Drupal\Core\Entity\EntityInterface
|
||||||
|
*/
|
||||||
|
protected $entity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
$this->setUpViewDisplay();
|
||||||
|
$this->setUpEntities();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that layout overrides work when created after a translation.
|
||||||
|
*/
|
||||||
|
public function testTranslationBeforeLayoutOverride() {
|
||||||
|
$assert_session = $this->assertSession();
|
||||||
|
|
||||||
|
$this->addEntityTranslation();
|
||||||
|
|
||||||
|
$entity_url = $this->entity->toUrl()->toString();
|
||||||
|
$language = \Drupal::languageManager()->getLanguage($this->langcodes[2]);
|
||||||
|
$translated_entity_url = $this->entity->toUrl('canonical', ['language' => $language])->toString();
|
||||||
|
$translated_layout_url = $translated_entity_url . '/layout';
|
||||||
|
|
||||||
|
$this->drupalGet($entity_url);
|
||||||
|
$assert_session->pageTextNotContains('The translated field value');
|
||||||
|
$assert_session->pageTextContains('The untranslated field value');
|
||||||
|
$assert_session->linkExists('Layout');
|
||||||
|
|
||||||
|
$this->drupalGet($translated_entity_url);
|
||||||
|
$assert_session->pageTextNotContains('The untranslated field value');
|
||||||
|
$assert_session->pageTextContains('The translated field value');
|
||||||
|
$assert_session->linkNotExists('Layout');
|
||||||
|
|
||||||
|
$this->drupalGet($translated_layout_url);
|
||||||
|
$assert_session->pageTextContains('Access denied');
|
||||||
|
|
||||||
|
$this->addLayoutOverride();
|
||||||
|
|
||||||
|
$this->drupalGet($entity_url);
|
||||||
|
$assert_session->pageTextNotContains('The translated field value');
|
||||||
|
$assert_session->pageTextContains('The untranslated field value');
|
||||||
|
$assert_session->pageTextContains('Powered by Drupal');
|
||||||
|
|
||||||
|
// Ensure that the layout change propagates to the translated entity.
|
||||||
|
$this->drupalGet($translated_entity_url);
|
||||||
|
$assert_session->pageTextNotContains('The untranslated field value');
|
||||||
|
$assert_session->pageTextContains('The translated field value');
|
||||||
|
$assert_session->pageTextContains('Powered by Drupal');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that layout overrides work when created before a translation.
|
||||||
|
*/
|
||||||
|
public function testLayoutOverrideBeforeTranslation() {
|
||||||
|
$assert_session = $this->assertSession();
|
||||||
|
|
||||||
|
$entity_url = $this->entity->toUrl()->toString();
|
||||||
|
$language = \Drupal::languageManager()->getLanguage($this->langcodes[2]);
|
||||||
|
|
||||||
|
$this->addLayoutOverride();
|
||||||
|
|
||||||
|
$this->drupalGet($entity_url);
|
||||||
|
$assert_session->pageTextNotContains('The translated field value');
|
||||||
|
$assert_session->pageTextContains('The untranslated field value');
|
||||||
|
$assert_session->pageTextContains('Powered by Drupal');
|
||||||
|
$assert_session->linkExists('Layout');
|
||||||
|
|
||||||
|
$this->addEntityTranslation();
|
||||||
|
$translated_entity_url = $this->entity->toUrl('canonical', ['language' => $language])->toString();
|
||||||
|
$translated_layout_url = $translated_entity_url . '/layout';
|
||||||
|
|
||||||
|
$this->drupalGet($entity_url);
|
||||||
|
$assert_session->pageTextNotContains('The translated field value');
|
||||||
|
$assert_session->pageTextContains('The untranslated field value');
|
||||||
|
$assert_session->pageTextContains('Powered by Drupal');
|
||||||
|
$assert_session->linkExists('Layout');
|
||||||
|
|
||||||
|
$this->drupalGet($translated_entity_url);
|
||||||
|
$assert_session->pageTextNotContains('The untranslated field value');
|
||||||
|
$assert_session->pageTextContains('The translated field value');
|
||||||
|
$assert_session->pageTextContains('Powered by Drupal');
|
||||||
|
$assert_session->linkNotExists('Layout');
|
||||||
|
|
||||||
|
$this->drupalGet($translated_layout_url);
|
||||||
|
$assert_session->pageTextContains('Access denied');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getAdministratorPermissions() {
|
||||||
|
$permissions = parent::getAdministratorPermissions();
|
||||||
|
$permissions[] = 'administer entity_test_mul display';
|
||||||
|
return $permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getTranslatorPermissions() {
|
||||||
|
$permissions = parent::getTranslatorPermissions();
|
||||||
|
$permissions[] = 'view test entity translations';
|
||||||
|
$permissions[] = 'view test entity';
|
||||||
|
$permissions[] = 'configure any layout';
|
||||||
|
return $permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup translated entity with layouts.
|
||||||
|
*/
|
||||||
|
protected function setUpEntities() {
|
||||||
|
$this->drupalLogin($this->administrator);
|
||||||
|
|
||||||
|
$field_ui_prefix = 'entity_test_mul/structure/entity_test_mul';
|
||||||
|
// Allow overrides for the layout.
|
||||||
|
$this->drupalPostForm("$field_ui_prefix/display/default", ['layout[enabled]' => TRUE], 'Save');
|
||||||
|
$this->drupalPostForm("$field_ui_prefix/display/default", ['layout[allow_custom]' => TRUE], 'Save');
|
||||||
|
|
||||||
|
// @todo The Layout Builder UI relies on local tasks; fix in
|
||||||
|
// https://www.drupal.org/project/drupal/issues/2917777.
|
||||||
|
$this->drupalPlaceBlock('local_tasks_block');
|
||||||
|
|
||||||
|
// Create a test entity.
|
||||||
|
$id = $this->createEntity([
|
||||||
|
$this->fieldName => [['value' => 'The untranslated field value']],
|
||||||
|
], $this->langcodes[0]);
|
||||||
|
$storage = $this->container->get('entity_type.manager')
|
||||||
|
->getStorage($this->entityTypeId);
|
||||||
|
$storage->resetCache([$id]);
|
||||||
|
$this->entity = $storage->load($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the View Display.
|
||||||
|
*/
|
||||||
|
protected function setUpViewDisplay() {
|
||||||
|
EntityViewDisplay::create([
|
||||||
|
'targetEntityType' => $this->entityTypeId,
|
||||||
|
'bundle' => $this->bundle,
|
||||||
|
'mode' => 'default',
|
||||||
|
'status' => TRUE,
|
||||||
|
])->setComponent($this->fieldName, ['type' => 'string'])->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an entity translation.
|
||||||
|
*/
|
||||||
|
protected function addEntityTranslation() {
|
||||||
|
$user = $this->loggedInUser;
|
||||||
|
$this->drupalLogin($this->translator);
|
||||||
|
$add_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_add", [
|
||||||
|
$this->entityTypeId => $this->entity->id(),
|
||||||
|
'source' => $this->langcodes[0],
|
||||||
|
'target' => $this->langcodes[2],
|
||||||
|
]);
|
||||||
|
$this->drupalPostForm($add_translation_url, [
|
||||||
|
"{$this->fieldName}[0][value]" => 'The translated field value',
|
||||||
|
], 'Save');
|
||||||
|
$this->drupalLogin($user);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a layout override.
|
||||||
|
*/
|
||||||
|
protected function addLayoutOverride() {
|
||||||
|
$assert_session = $this->assertSession();
|
||||||
|
$page = $this->getSession()->getPage();
|
||||||
|
$entity_url = $this->entity->toUrl()->toString();
|
||||||
|
$layout_url = $entity_url . '/layout';
|
||||||
|
$this->drupalGet($layout_url);
|
||||||
|
$assert_session->pageTextNotContains('The translated field value');
|
||||||
|
$assert_session->pageTextContains('The untranslated field value');
|
||||||
|
|
||||||
|
// Adjust the layout.
|
||||||
|
$assert_session->linkExists('Add Block');
|
||||||
|
$this->clickLink('Add Block');
|
||||||
|
$assert_session->linkExists('Powered by Drupal');
|
||||||
|
$this->clickLink('Powered by Drupal');
|
||||||
|
$page->pressButton('Add Block');
|
||||||
|
|
||||||
|
$assert_session->pageTextContains('Powered by Drupal');
|
||||||
|
$assert_session->buttonExists('Save layout');
|
||||||
|
$page->pressButton('Save layout');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
namespace Drupal\Tests\layout_builder\Functional;
|
namespace Drupal\Tests\layout_builder\Functional;
|
||||||
|
|
||||||
use Drupal\language\Entity\ConfigurableLanguage;
|
|
||||||
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
|
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
|
||||||
use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
|
use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
|
||||||
use Drupal\layout_builder\Section;
|
use Drupal\layout_builder\Section;
|
||||||
|
@ -199,50 +198,6 @@ class LayoutSectionTest extends BrowserTestBase {
|
||||||
$this->assertLayoutSection('.layout--onecol', 'Hello test world', '', '', 'UNCACHEABLE');
|
$this->assertLayoutSection('.layout--onecol', 'Hello test world', '', '', 'UNCACHEABLE');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests the multilingual support of the section formatter.
|
|
||||||
*/
|
|
||||||
public function testMultilingualLayoutSectionFormatter() {
|
|
||||||
$this->container->get('module_installer')->install(['content_translation']);
|
|
||||||
$this->rebuildContainer();
|
|
||||||
|
|
||||||
ConfigurableLanguage::createFromLangcode('es')->save();
|
|
||||||
$this->container->get('content_translation.manager')->setEnabled('node', 'bundle_with_section_field', TRUE);
|
|
||||||
|
|
||||||
$entity = $this->createSectionNode([
|
|
||||||
[
|
|
||||||
'section' => new Section('layout_onecol', [], [
|
|
||||||
'baz' => new SectionComponent('baz', 'content', [
|
|
||||||
'id' => 'system_powered_by_block',
|
|
||||||
]),
|
|
||||||
]),
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
$entity->addTranslation('es', [
|
|
||||||
'title' => 'Translated node title',
|
|
||||||
OverridesSectionStorage::FIELD_NAME => [
|
|
||||||
[
|
|
||||||
'section' => new Section('layout_twocol', [], [
|
|
||||||
'foo' => new SectionComponent('foo', 'first', [
|
|
||||||
'id' => 'test_block_instantiation',
|
|
||||||
'display_message' => 'foo text',
|
|
||||||
]),
|
|
||||||
'bar' => new SectionComponent('bar', 'second', [
|
|
||||||
'id' => 'test_block_instantiation',
|
|
||||||
'display_message' => 'bar text',
|
|
||||||
]),
|
|
||||||
]),
|
|
||||||
],
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
$entity->save();
|
|
||||||
|
|
||||||
$this->drupalGet($entity->toUrl('canonical'));
|
|
||||||
$this->assertLayoutSection('.layout--onecol', 'Powered by');
|
|
||||||
$this->drupalGet($entity->toUrl('canonical')->setOption('prefix', 'es/'));
|
|
||||||
$this->assertLayoutSection('.layout--twocol', ['foo text', 'bar text']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensures that the entity title is displayed.
|
* Ensures that the entity title is displayed.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -7,6 +7,7 @@ use Drupal\Core\Plugin\Context\ContextDefinition;
|
||||||
use Drupal\Core\Plugin\Context\EntityContext;
|
use Drupal\Core\Plugin\Context\EntityContext;
|
||||||
use Drupal\entity_test\Entity\EntityTest;
|
use Drupal\entity_test\Entity\EntityTest;
|
||||||
use Drupal\KernelTests\KernelTestBase;
|
use Drupal\KernelTests\KernelTestBase;
|
||||||
|
use Drupal\language\Entity\ConfigurableLanguage;
|
||||||
use Drupal\layout_builder\DefaultsSectionStorageInterface;
|
use Drupal\layout_builder\DefaultsSectionStorageInterface;
|
||||||
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
|
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
|
||||||
use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
|
use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
|
||||||
|
@ -34,6 +35,7 @@ class OverridesSectionStorageTest extends KernelTestBase {
|
||||||
'field',
|
'field',
|
||||||
'system',
|
'system',
|
||||||
'user',
|
'user',
|
||||||
|
'language',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -97,6 +99,20 @@ class OverridesSectionStorageTest extends KernelTestBase {
|
||||||
$this->assertSame($expected, $result);
|
$this->assertSame($expected, $result);
|
||||||
$result = $this->plugin->access('view', $account);
|
$result = $this->plugin->access('view', $account);
|
||||||
$this->assertSame($expected, $result);
|
$this->assertSame($expected, $result);
|
||||||
|
|
||||||
|
// Create a translation.
|
||||||
|
ConfigurableLanguage::createFromLangcode('es')->save();
|
||||||
|
$entity = EntityTest::load($entity->id());
|
||||||
|
$translation = $entity->addTranslation('es');
|
||||||
|
$translation->save();
|
||||||
|
$this->plugin->setContext('entity', EntityContext::fromEntity($translation));
|
||||||
|
|
||||||
|
// Perform the same checks again but with a non default translation which
|
||||||
|
// should always deny access.
|
||||||
|
$result = $this->plugin->access('view');
|
||||||
|
$this->assertSame(FALSE, $result);
|
||||||
|
$result = $this->plugin->access('view', $account);
|
||||||
|
$this->assertSame(FALSE, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\layout_builder\Kernel;
|
||||||
|
|
||||||
|
use Drupal\entity_test\Entity\EntityTest;
|
||||||
|
use Drupal\field\Entity\FieldConfig;
|
||||||
|
use Drupal\field\Entity\FieldStorageConfig;
|
||||||
|
use Drupal\KernelTests\KernelTestBase;
|
||||||
|
use Drupal\language\Entity\ConfigurableLanguage;
|
||||||
|
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
|
||||||
|
use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
|
||||||
|
use Drupal\layout_builder\Section;
|
||||||
|
use Drupal\layout_builder\SectionComponent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests Layout Builder with a translatable layout field.
|
||||||
|
*
|
||||||
|
* @group layout_builder
|
||||||
|
*/
|
||||||
|
class TranslatableFieldTest extends KernelTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $modules = [
|
||||||
|
'layout_discovery',
|
||||||
|
'layout_builder',
|
||||||
|
'entity_test',
|
||||||
|
'field',
|
||||||
|
'system',
|
||||||
|
'user',
|
||||||
|
'language',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->installSchema('system', ['key_value_expire']);
|
||||||
|
$this->installEntitySchema('entity_test');
|
||||||
|
|
||||||
|
// Create a translation.
|
||||||
|
ConfigurableLanguage::createFromLangcode('es')->save();
|
||||||
|
|
||||||
|
LayoutBuilderEntityViewDisplay::create([
|
||||||
|
'targetEntityType' => 'entity_test',
|
||||||
|
'bundle' => 'entity_test',
|
||||||
|
'mode' => 'default',
|
||||||
|
'status' => TRUE,
|
||||||
|
])
|
||||||
|
->enableLayoutBuilder()
|
||||||
|
->setOverridable()
|
||||||
|
->save();
|
||||||
|
|
||||||
|
FieldStorageConfig::loadByName('entity_test', OverridesSectionStorage::FIELD_NAME)
|
||||||
|
->setTranslatable(TRUE)
|
||||||
|
->save();
|
||||||
|
FieldConfig::loadByName('entity_test', 'entity_test', OverridesSectionStorage::FIELD_NAME)
|
||||||
|
->setTranslatable(TRUE)
|
||||||
|
->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that sections on cleared when creating a new translation.
|
||||||
|
*/
|
||||||
|
public function testSectionsClearedOnCreateTranslation() {
|
||||||
|
$section_data = [
|
||||||
|
new Section('layout_default', [], [
|
||||||
|
'first-uuid' => new SectionComponent('first-uuid', 'content', ['id' => 'foo']),
|
||||||
|
]),
|
||||||
|
];
|
||||||
|
$entity = EntityTest::create([OverridesSectionStorage::FIELD_NAME => $section_data]);
|
||||||
|
$entity->save();
|
||||||
|
$this->assertFalse($entity->get(OverridesSectionStorage::FIELD_NAME)->isEmpty());
|
||||||
|
|
||||||
|
$entity = EntityTest::load($entity->id());
|
||||||
|
/** @var \Drupal\entity_test\Entity\EntityTest $translation */
|
||||||
|
$translation = $entity->addTranslation('es', $entity->toArray());
|
||||||
|
|
||||||
|
// Per-language layouts are not supported.
|
||||||
|
$this->assertTrue($translation->get(OverridesSectionStorage::FIELD_NAME)->isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue