NodeFieldMultilingualTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace Drupal\Tests\node\Functional;
  3. use Drupal\field\Entity\FieldStorageConfig;
  4. use Drupal\language\Entity\ConfigurableLanguage;
  5. use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
  6. use Drupal\Core\Language\LanguageInterface;
  7. use Drupal\Tests\BrowserTestBase;
  8. /**
  9. * Tests multilingual support for fields.
  10. *
  11. * @group node
  12. */
  13. class NodeFieldMultilingualTest extends BrowserTestBase {
  14. /**
  15. * Modules to enable.
  16. *
  17. * @var array
  18. */
  19. public static $modules = ['node', 'language'];
  20. protected function setUp() {
  21. parent::setUp();
  22. // Create Basic page node type.
  23. $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
  24. // Setup users.
  25. $admin_user = $this->drupalCreateUser(['administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content']);
  26. $this->drupalLogin($admin_user);
  27. // Add a new language.
  28. ConfigurableLanguage::createFromLangcode('it')->save();
  29. // Enable URL language detection and selection.
  30. $edit = ['language_interface[enabled][language-url]' => '1'];
  31. $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
  32. // Set "Basic page" content type to use multilingual support.
  33. $edit = [
  34. 'language_configuration[language_alterable]' => TRUE,
  35. ];
  36. $this->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
  37. $this->assertRaw(t('The content type %type has been updated.', ['%type' => 'Basic page']), 'Basic page content type has been updated.');
  38. // Make node body translatable.
  39. $field_storage = FieldStorageConfig::loadByName('node', 'body');
  40. $field_storage->setTranslatable(TRUE);
  41. $field_storage->save();
  42. }
  43. /**
  44. * Tests whether field languages are correctly set through the node form.
  45. */
  46. public function testMultilingualNodeForm() {
  47. // Create "Basic page" content.
  48. $langcode = language_get_default_langcode('node', 'page');
  49. $title_key = 'title[0][value]';
  50. $title_value = $this->randomMachineName(8);
  51. $body_key = 'body[0][value]';
  52. $body_value = $this->randomMachineName(16);
  53. // Create node to edit.
  54. $edit = [];
  55. $edit[$title_key] = $title_value;
  56. $edit[$body_key] = $body_value;
  57. $this->drupalPostForm('node/add/page', $edit, t('Save'));
  58. // Check that the node exists in the database.
  59. $node = $this->drupalGetNodeByTitle($edit[$title_key]);
  60. $this->assertTrue($node, 'Node found in database.');
  61. $this->assertTrue($node->language()->getId() == $langcode && $node->body->value == $body_value, 'Field language correctly set.');
  62. // Change node language.
  63. $langcode = 'it';
  64. $this->drupalGet("node/{$node->id()}/edit");
  65. $edit = [
  66. $title_key => $this->randomMachineName(8),
  67. 'langcode[0][value]' => $langcode,
  68. ];
  69. $this->drupalPostForm(NULL, $edit, t('Save'));
  70. $node = $this->drupalGetNodeByTitle($edit[$title_key], TRUE);
  71. $this->assertTrue($node, 'Node found in database.');
  72. $this->assertTrue($node->language()->getId() == $langcode && $node->body->value == $body_value, 'Field language correctly changed.');
  73. // Enable content language URL detection.
  74. $this->container->get('language_negotiator')->saveConfiguration(LanguageInterface::TYPE_CONTENT, [LanguageNegotiationUrl::METHOD_ID => 0]);
  75. // Test multilingual field language fallback logic.
  76. $this->drupalGet("it/node/{$node->id()}");
  77. $this->assertRaw($body_value, 'Body correctly displayed using Italian as requested language');
  78. $this->drupalGet("node/{$node->id()}");
  79. $this->assertRaw($body_value, 'Body correctly displayed using English as requested language');
  80. }
  81. /**
  82. * Tests multilingual field display settings.
  83. */
  84. public function testMultilingualDisplaySettings() {
  85. // Create "Basic page" content.
  86. $title_key = 'title[0][value]';
  87. $title_value = $this->randomMachineName(8);
  88. $body_key = 'body[0][value]';
  89. $body_value = $this->randomMachineName(16);
  90. // Create node to edit.
  91. $edit = [];
  92. $edit[$title_key] = $title_value;
  93. $edit[$body_key] = $body_value;
  94. $this->drupalPostForm('node/add/page', $edit, t('Save'));
  95. // Check that the node exists in the database.
  96. $node = $this->drupalGetNodeByTitle($edit[$title_key]);
  97. $this->assertTrue($node, 'Node found in database.');
  98. // Check if node body is showed.
  99. $this->drupalGet('node/' . $node->id());
  100. $body = $this->xpath('//article[contains(concat(" ", normalize-space(@class), " "), :node-class)]//div[contains(concat(" ", normalize-space(@class), " "), :content-class)]/descendant::p', [
  101. ':node-class' => ' node ',
  102. ':content-class' => 'node__content',
  103. ]);
  104. $this->assertEqual($body[0]->getText(), $node->body->value, 'Node body found.');
  105. }
  106. }