Issue #2154701 by pfrenssen, Gábor Hojtsy, swentel: Regression: Contextual links broken, tabs erroneously added after enabling content translation module.

8.0.x
webchick 2014-01-10 12:26:01 -08:00
parent 9c4cd8d8e0
commit 7a221e58b1
2 changed files with 158 additions and 16 deletions

View File

@ -8,9 +8,9 @@
namespace Drupal\content_translation\Plugin\Derivative;
use Drupal\Component\Plugin\Derivative\DerivativeBase;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\content_translation\ContentTranslationManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
@ -21,20 +21,20 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
class ContentTranslationContextualLinks extends DerivativeBase implements ContainerDerivativeInterface {
/**
* The entity manager.
* The content translation manager.
*
* @var \Drupal\Core\Entity\EntityManagerInterface
* @var \Drupal\content_translation\ContentTranslationManagerInterface
*/
protected $entityManager;
protected $contentTranslationManager;
/**
* Constructs a new ContentTranslationContextualLinks.
*
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* The entity manager.
* @param \Drupal\content_translation\ContentTranslationManagerInterface $content_translation_manager
* The content translation manager.
*/
public function __construct(EntityManagerInterface $entity_manager) {
$this->entityManager = $entity_manager;
public function __construct(ContentTranslationManagerInterface $content_translation_manager) {
$this->contentTranslationManager = $content_translation_manager;
}
/**
@ -42,7 +42,7 @@ class ContentTranslationContextualLinks extends DerivativeBase implements Contai
*/
public static function create(ContainerInterface $container, $base_plugin_id) {
return new static(
$container->get('entity.manager')
$container->get('content_translation.manager')
);
}
@ -50,13 +50,11 @@ class ContentTranslationContextualLinks extends DerivativeBase implements Contai
* {@inheritdoc}
*/
public function getDerivativeDefinitions(array $base_plugin_definition) {
// Create contextual links for all possible entity types.
foreach ($this->entityManager->getDefinitions() as $entity_type => $entity_info) {
if ($entity_info->isTranslatable()) {
$this->derivatives[$entity_type]['title'] = t('Translate');
$this->derivatives[$entity_type]['route_name'] = $entity_info->getLinkTemplate('drupal:content-translation-overview');
$this->derivatives[$entity_type]['group'] = $entity_type;
}
// Create contextual links for translatable entity types.
foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type => $entity_info) {
$this->derivatives[$entity_type]['title'] = t('Translate');
$this->derivatives[$entity_type]['route_name'] = $entity_info->getLinkTemplate('drupal:content-translation-overview');
$this->derivatives[$entity_type]['group'] = $entity_type;
}
return parent::getDerivativeDefinitions($base_plugin_definition);
}

View File

@ -0,0 +1,144 @@
<?php
/**
* @file
* Contains \Drupal\content_translation\Tests\ContentTranslationContextualLinksTest.
*/
namespace Drupal\content_translation\Tests;
use Drupal\Component\Utility\Json;
use Drupal\node\Entity\NodeType;
use Drupal\simpletest\WebTestBase;
/**
* Tests that contextual links are available for content translation.
*/
class ContentTranslationContextualLinksTest extends WebTestBase {
/**
* The bundle being tested.
*
* @var string
*/
protected $bundle;
/**
* The content type being tested.
*
* @var NodeType
*/
protected $contentType;
/**
* The 'translator' user to use during testing.
*
* @var \Drupal\user\UserInterface
*/
protected $translator;
/**
* Modules to enable.
*
* @var array
*/
public static $modules = array('content_translation', 'contextual', 'node');
/**
* The profile to install as a basis for testing.
*
* @var string
*/
protected $profile = 'testing';
public static function getInfo() {
return array(
'name' => 'Content translation contextual links',
'description' => 'Tests contextual links for content translation.',
'group' => 'Content Translation UI',
);
}
function setUp() {
parent::setUp();
// Create a content type.
$this->bundle = $this->randomName();
$this->contentType = $this->drupalCreateContentType(array('type' => $this->bundle));
// Create a translator user.
$permissions = array(
'access contextual links',
'administer nodes',
"edit any $this->bundle content",
'translate any entity',
);
$this->translator = $this->drupalCreateUser($permissions);
}
/**
* Tests that a contextual link is available for translating a node.
*/
public function testContentTranslationContextualLinks() {
// Create a node.
$title = $this->randomString();
$this->drupalCreateNode(array('type' => $this->bundle, 'title' => $title));
$node = $this->drupalGetNodeByTitle($title);
// Check that the translate link appears on the node page.
$this->drupalLogin($this->translator);
$translate_link = 'node/' . $node->id() . '/translations';
$response = $this->renderContextualLinks(array('node:node=1:'), 'node/' . $node->id());
$this->assertResponse(200);
$json = Json::decode($response);
$this->drupalSetContent($json['node:node=1:']);
$this->assertLinkByHref($translate_link, 0, 'The contextual link to translate the node is shown.');
// Check that the link leads to the translate page.
$this->drupalGet($translate_link);
$this->assertRaw(t('Translations of %label', array('%label' => $node->label())), 'The contextual link leads to the translate page.');
}
/**
* Get server-rendered contextual links for the given contextual link ids.
*
* Copied from \Drupal\contextual\Tests\ContextualDynamicContextTest::renderContextualLinks().
*
* @param array $ids
* An array of contextual link ids.
* @param string $current_path
* The Drupal path for the page for which the contextual links are rendered.
*
* @return string
* The response body.
*/
protected function renderContextualLinks($ids, $current_path) {
// Build POST values.
$post = array();
for ($i = 0; $i < count($ids); $i++) {
$post['ids[' . $i . ']'] = $ids[$i];
}
// Serialize POST values.
foreach ($post as $key => $value) {
// Encode according to application/x-www-form-urlencoded
// Both names and values needs to be urlencoded, according to
// http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
$post[$key] = urlencode($key) . '=' . urlencode($value);
}
$post = implode('&', $post);
// Perform HTTP request.
return $this->curlExec(array(
CURLOPT_URL => url('contextual/render', array('absolute' => TRUE, 'query' => array('destination' => $current_path))),
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $post,
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
'Content-Type: application/x-www-form-urlencoded',
),
));
}
}