diff --git a/js/panels_ipe/panels_ipe.js b/js/panels_ipe/panels_ipe.js index 36af774..6fadd3a 100644 --- a/js/panels_ipe/panels_ipe.js +++ b/js/panels_ipe/panels_ipe.js @@ -34,7 +34,7 @@ // Remove our changes and refresh the page. revert_tab.set({loading: true}); $.ajax({ - url: drupalSettings.path.baseUrl + 'admin/panelizer/panels_ipe/' + entity.entity_type_id + '/' + entity.entity_id + '/' + entity.view_mode + '/revert_to_default', + url: drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix + 'admin/panelizer/panels_ipe/' + entity.entity_type_id + '/' + entity.entity_id + '/' + entity.view_mode + '/revert_to_default', data: {}, type: 'POST' }).done(function (data) { diff --git a/src/Controller/PanelizerPanelsIPEController.php b/src/Controller/PanelizerPanelsIPEController.php index 6e14bc2..ea364d6 100644 --- a/src/Controller/PanelizerPanelsIPEController.php +++ b/src/Controller/PanelizerPanelsIPEController.php @@ -6,7 +6,9 @@ use Drupal\Component\Serialization\Json; use Drupal\Core\Access\AccessResult; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\FieldableEntityInterface; +use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\TypedData\TranslatableInterface; use Drupal\panelizer\PanelizerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; @@ -59,6 +61,13 @@ class PanelizerPanelsIPEController extends ControllerBase { * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException */ public function revertToDefault(FieldableEntityInterface $entity, $view_mode) { + $langcode = $this->languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId(); + if ($entity instanceof TranslatableInterface + && $entity->hasTranslation($langcode) + && $entity->language()->getId() !== $langcode) { + $entity = $entity->getTranslation($langcode); + } + // Get the bundle specific default display as a fallback. $settings = $this->panelizer->getPanelizerSettings($entity->getEntityTypeId(), $entity->bundle(), $view_mode); $default = $settings['default']; diff --git a/src/Plugin/PanelsStorage/PanelizerFieldPanelsStorage.php b/src/Plugin/PanelsStorage/PanelizerFieldPanelsStorage.php index ca946f8..bc41b8e 100644 --- a/src/Plugin/PanelsStorage/PanelizerFieldPanelsStorage.php +++ b/src/Plugin/PanelsStorage/PanelizerFieldPanelsStorage.php @@ -6,10 +6,13 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\FieldableEntityInterface; +use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\Context\Context; use Drupal\Core\Plugin\Context\ContextDefinition; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\TypedData\TranslatableInterface; use Drupal\ctools\Context\AutomaticContext; use Drupal\panelizer\Exception\PanelizerException; use Drupal\panelizer\PanelizerInterface; @@ -35,6 +38,13 @@ class PanelizerFieldPanelsStorage extends PanelsStorageBase implements Container protected $panelizer; /** + * The language manager. + * + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + */ + protected $languageManager; + + /** * Constructs a PanelizerDefaultPanelsStorage. * * @param array $configuration @@ -47,10 +57,13 @@ class PanelizerFieldPanelsStorage extends PanelsStorageBase implements Container * The entity type manager. * @param \Drupal\panelizer\PanelizerInterface $panelizer * The Panelizer service. + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * The language manager. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, PanelizerInterface $panelizer) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, PanelizerInterface $panelizer, LanguageManagerInterface $language_manager) { $this->entityTypeManager = $entity_type_manager; $this->panelizer = $panelizer; + $this->languageManager = $language_manager; parent::__construct($configuration, $plugin_id, $plugin_definition); } @@ -63,7 +76,8 @@ class PanelizerFieldPanelsStorage extends PanelsStorageBase implements Container $plugin_id, $plugin_definition, $container->get('entity_type.manager'), - $container->get('panelizer') + $container->get('panelizer'), + $container->get('language_manager') ); } @@ -86,6 +100,13 @@ class PanelizerFieldPanelsStorage extends PanelsStorageBase implements Container $entity = $storage->load($id); } + $langcode = $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId(); + if ($entity instanceof TranslatableInterface + && $entity->hasTranslation($langcode) + && $entity->language()->getId() !== $langcode) { + $entity = $entity->getTranslation($langcode); + } + return $entity; } diff --git a/tests/src/FunctionalJavascript/EditTranslatedContentTest.php b/tests/src/FunctionalJavascript/EditTranslatedContentTest.php new file mode 100644 index 0000000..afc52d9 --- /dev/null +++ b/tests/src/FunctionalJavascript/EditTranslatedContentTest.php @@ -0,0 +1,110 @@ +drupalCreateUser([], NULL, TRUE); + $this->drupalLogin($account); + + // Create the "Basic Page" content type. + $this->drupalCreateContentType([ + 'type' => 'page', + 'name' => 'Basic Page', + ]); + + // Add language. + $this->drupalGet('admin/config/regional/language/add'); + $this->submitForm(['predefined_langcode' => 'hu'], t('Add language')); + + // Enable Panelizer for the "Basic Page" content type. + $this->drupalGet('admin/structure/types/manage/page/display'); + $this->submitForm([ + 'panelizer[enable]' => 1, + 'panelizer[custom]' => 1, + ], t('Save')); + + // Enable content translation for the "Basic Page" content type. + $this->drupalGet('admin/config/regional/content-language'); + $this->submitForm([ + 'entity_types[node]' => TRUE, + 'settings[node][page][translatable]' => TRUE, + ], t('Save configuration')); + + // Create a new Basic Page. + $this->drupalGet('node/add/page'); + $this->submitForm(['title[0][value]' => 'Test Node'], t('Save')); + + // Translate node. + $this->drupalGet('node/1/translations/add/en/hu'); + $this->submitForm(['title[0][value]' => 'Test Node -hu-'], t('Save')); + } + + /** + * Tests editing translated content with Panels IPE. + */ + public function testEditingTranslatedContent() { + // Set the window size to ensure that IPE elements are visible. + $this->getSession()->resizeWindow(1024, 768); + + // Change the layout of translated node. + $this->drupalGet('hu/node/1'); + $this->changeLayout('Columns: 2', 'layout_twocol_bricks'); + $this->clickAndWait('[data-tab-id="save"]'); + + // Assert original node hasn't changed. + $this->drupalGet('node/1'); + $this->assertSession()->elementExists('css', '.layout--onecol'); + $this->assertSession()->elementNotExists('css', '.layout--twocol-bricks'); + + // Assert Revert to Default is working. + $driver = $this->getSession()->getDriver(); + if (!($driver instanceof Selenium2Driver)) { + return; + } + + $this->drupalGet('hu/node/1'); + $this->assertSession()->elementExists('css', '.layout--twocol-bricks'); + $this->assertSession()->elementNotExists('css', '.layout--onecol'); + $this->click('[data-tab-id="revert"]'); + // Wait for alert box to show up. + sleep(1); + $driver->getWebDriverSession()->accept_alert(); + $this->waitForAjaxToFinish(); + $this->assertSession()->elementExists('css', '.layout--onecol'); + $this->assertSession()->elementNotExists('css', '.layout--twocol-bricks'); + } + +} diff --git a/tests/src/Unit/PanelizerFieldPanelsStorageTest.php b/tests/src/Unit/PanelizerFieldPanelsStorageTest.php index 089ddc1..b56694e 100644 --- a/tests/src/Unit/PanelizerFieldPanelsStorageTest.php +++ b/tests/src/Unit/PanelizerFieldPanelsStorageTest.php @@ -6,6 +6,8 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\FieldableEntityInterface; +use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Language\LanguageManager; use Drupal\Core\Session\AccountInterface; use Drupal\ctools\Context\AutomaticContext; use Drupal\panelizer\Exception\PanelizerException; @@ -56,6 +58,13 @@ class PanelizerFieldPanelsStorageTest extends UnitTestCase { $this->panelizer = $this->prophesize(Panelizer::class); + /** @var \Drupal\Core\Language\LanguageInterface|\Prophecy\Prophecy\ProphecyInterface $language */ + $language = $this->prophesize(LanguageInterface::class); + $language->getId()->willReturn('en'); + /** @var \Drupal\Core\Language\LanguageManagerInterface|\Prophecy\Prophecy\ProphecyInterface $language_manager */ + $language_manager = $this->prophesize(LanguageManager::class); + $language_manager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->willReturn($language); + $this->panelsStorage = $this->getMockBuilder(PanelizerFieldPanelsStorage::class) ->setConstructorArgs([ [], @@ -63,6 +72,7 @@ class PanelizerFieldPanelsStorageTest extends UnitTestCase { [], $this->entityTypeManager->reveal(), $this->panelizer->reveal(), + $language_manager->reveal(), ]) ->setMethods(['getEntityContext']) ->getMock();