Skip to content
Snippets Groups Projects
Commit cd8293e4 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2479377 by dpi, edurenye, tstoeckler, andypost, mgifford, RajabNatshah,...

Issue #2479377 by dpi, edurenye, tstoeckler, andypost, mgifford, RajabNatshah, mglaman, jespermb, hitfactory, meramo, lluvigne, amateescu: content_translation_page_attachments() should check for a canonical link before generating a URL to it
parent 983612d0
No related branches found
No related tags found
No related merge requests found
...@@ -572,10 +572,10 @@ function content_translation_page_attachments(&$page) { ...@@ -572,10 +572,10 @@ function content_translation_page_attachments(&$page) {
} }
$entity = $route_match->getParameter($name); $entity = $route_match->getParameter($name);
if ($entity instanceof ContentEntityInterface) { if ($entity instanceof ContentEntityInterface && $entity->hasLinkTemplate('canonical')) {
// Current route represents a content entity. Build hreflang links. // Current route represents a content entity. Build hreflang links.
foreach ($entity->getTranslationLanguages() as $language) { foreach ($entity->getTranslationLanguages() as $language) {
$url = $entity->urlInfo() $url = $entity->toUrl('canonical')
->setOption('language', $language) ->setOption('language', $language)
->setAbsolute() ->setAbsolute()
->toString(); ->toString();
......
...@@ -10,6 +10,14 @@ ...@@ -10,6 +10,14 @@
* @ContentEntityType( * @ContentEntityType(
* id = "entity_test_translatable_no_skip", * id = "entity_test_translatable_no_skip",
* label = @Translation("Test entity - Translatable check UI"), * label = @Translation("Test entity - Translatable check UI"),
* handlers = {
* "form" = {
* "default" = "Drupal\entity_test\EntityTestForm",
* },
* "route_provider" = {
* "html" = "Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider",
* },
* },
* base_table = "entity_test_mul", * base_table = "entity_test_mul",
* data_table = "entity_test_mul_property_data", * data_table = "entity_test_mul_property_data",
* entity_keys = { * entity_keys = {
...@@ -20,6 +28,10 @@ ...@@ -20,6 +28,10 @@
* "langcode" = "langcode", * "langcode" = "langcode",
* }, * },
* translatable = TRUE, * translatable = TRUE,
* admin_permission = "administer entity_test content",
* links = {
* "edit-form" = "/entity_test_translatable_no_skip/{entity_test_translatable_no_skip}/edit",
* },
* ) * )
*/ */
class EntityTestTranslatableNoUISkip extends EntityTest { class EntityTestTranslatableNoUISkip extends EntityTest {
......
<?php
namespace Drupal\Tests\content_translation\Functional;
use Drupal\Tests\BrowserTestBase;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\entity_test\Entity\EntityTestMul;
use Drupal\content_translation_test\Entity\EntityTestTranslatableNoUISkip;
/**
* Tests whether canonical link tags are present for content entities.
*
* @group content_translation
*/
class ContentTranslationLinkTagTest extends BrowserTestBase {
/**
* {@inheritdoc}
*/
public static $modules = ['entity_test', 'content_translation', 'content_translation_test', 'language'];
/**
* The added languages.
*
* @var string[]
*/
protected $langcodes;
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
// Set up user.
$user = $this->drupalCreateUser([
'view test entity',
'view test entity translations',
'administer entity_test content',
]);
$this->drupalLogin($user);
// Add additional languages.
$this->langcodes = ['it', 'fr'];
foreach ($this->langcodes as $langcode) {
ConfigurableLanguage::createFromLangcode($langcode)->save();
}
// Rebuild the container so that the new languages are picked up by services
// that hold a list of languages.
$this->rebuildContainer();
}
/**
* Create a test entity with translations.
*
* @return \Drupal\Core\Entity\EntityInterface
* An entity with translations.
*/
protected function createTranslatableEntity() {
$entity = EntityTestMul::create(['label' => $this->randomString()]);
// Create translations for non default languages.
foreach ($this->langcodes as $langcode) {
$entity->addTranslation($langcode, ['label' => $this->randomString()]);
}
$entity->save();
return $entity;
}
/**
* Tests alternate link tag found for entity types with canonical links.
*/
public function testCanonicalAlternateTags() {
/** @var \Drupal\Core\Language\LanguageManagerInterface $languageManager */
$languageManager = $this->container->get('language_manager');
/** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager */
$entityTypeManager = $this->container->get('entity_type.manager');
$definition = $entityTypeManager->getDefinition('entity_test_mul');
$this->assertTrue($definition->hasLinkTemplate('canonical'), 'Canonical link template found for entity_test.');
$entity = $this->createTranslatableEntity();
$url_base = $entity->toUrl('canonical')
->setAbsolute();
$langcodes_all = $this->langcodes;
$langcodes_all[] = $languageManager
->getDefaultLanguage()
->getId();
/** @var \Drupal\Core\Url[] $urls */
$urls = array_map(
function ($langcode) use ($url_base, $languageManager) {
$url = clone $url_base;
return $url
->setOption('language', $languageManager->getLanguage($langcode));
},
array_combine($langcodes_all, $langcodes_all)
);
// Ensure link tags for all languages are found on each language variation
// page of an entity.
foreach ($urls as $langcode => $url) {
$this->drupalGet($url);
foreach ($urls as $langcode_alternate => $url_alternate) {
$args = [':href' => $url_alternate->toString(), ':hreflang' => $langcode_alternate];
$links = $this->xpath('head/link[@rel = "alternate" and @href = :href and @hreflang = :hreflang]', $args);
$message = sprintf('The "%s" translation has the correct alternate hreflang link for "%s": %s.', $langcode, $langcode_alternate, $url->toString());
$this->assertTrue(isset($links[0]), $message);
}
}
}
/**
* Tests alternate link tag missing for entity types without canonical links.
*/
public function testCanonicalAlternateTagsMissing() {
/** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager */
$entityTypeManager = $this->container->get('entity_type.manager');
$definition = $entityTypeManager->getDefinition('entity_test_translatable_no_skip');
// Ensure 'canonical' link template does not exist, in case it is added in
// the future.
$this->assertFalse($definition->hasLinkTemplate('canonical'), 'Canonical link template does not exist for entity_test_translatable_no_skip entity.');
$entity = EntityTestTranslatableNoUISkip::create();
$entity->save();
$this->drupalGet($entity->toUrl('edit-form'));
$this->assertSession()->statusCodeEquals(200);
$result = $this->xpath('//link[@rel="alternate" and @hreflang]');
$this->assertFalse($result, 'No alternate link tag found.');
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment