class EntityReferenceFieldTranslatedReferenceViewTest

Same name and namespace in other branches
  1. 11.x core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldTranslatedReferenceViewTest.php \Drupal\Tests\field\Functional\EntityReference\EntityReferenceFieldTranslatedReferenceViewTest
  2. 10 core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldTranslatedReferenceViewTest.php \Drupal\Tests\field\Functional\EntityReference\EntityReferenceFieldTranslatedReferenceViewTest
  3. 8.9.x core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldTranslatedReferenceViewTest.php \Drupal\Tests\field\Functional\EntityReference\EntityReferenceFieldTranslatedReferenceViewTest

Tests the translation of entity reference field display on nodes.

@group entity_reference

Hierarchy

Expanded class hierarchy of EntityReferenceFieldTranslatedReferenceViewTest

File

core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldTranslatedReferenceViewTest.php, line 16

Namespace

Drupal\Tests\field\Functional\EntityReference
View source
class EntityReferenceFieldTranslatedReferenceViewTest extends BrowserTestBase {
  
  /**
   * Flag indicating whether the field is translatable.
   *
   * @var bool
   */
  protected $translatable = TRUE;
  
  /**
   * The langcode of the source language.
   *
   * @var string
   */
  protected $baseLangcode = 'en';
  
  /**
   * Target langcode for translation.
   *
   * @var string
   */
  protected $translateToLangcode = 'hu';
  
  /**
   * The test entity type name.
   *
   * @var string
   */
  protected $testEntityTypeName = 'node';
  
  /**
   * Entity type which have the entity reference field.
   *
   * @var \Drupal\node\Entity\NodeType
   */
  protected $referrerType;
  
  /**
   * Entity type which can be referenced.
   *
   * @var \Drupal\node\Entity\NodeType
   */
  protected $referencedType;
  
  /**
   * The referrer entity.
   *
   * @var \Drupal\node\Entity\Node
   */
  protected $referrerEntity;
  
  /**
   * The entity to refer.
   *
   * @var \Drupal\node\Entity\Node
   */
  protected $referencedEntityWithoutTranslation;
  
  /**
   * The entity to refer.
   *
   * @var \Drupal\node\Entity\Node
   */
  protected $referencedEntityWithTranslation;
  
  /**
   * The machine name of the entity reference field.
   *
   * @var string
   */
  protected $referenceFieldName = 'test_reference_field';
  
  /**
   * The label of the untranslated referenced entity, used in assertions.
   *
   * @var string
   */
  protected $labelOfNotTranslatedReference;
  
  /**
   * The original label of the referenced entity, used in assertions.
   *
   * @var string
   */
  protected $originalLabel;
  
  /**
   * The translated label of the referenced entity, used in assertions.
   *
   * @var string
   */
  protected $translatedLabel;
  
  /**
   * A user with permission to edit the referrer entity.
   *
   * @var \Drupal\user\UserInterface
   */
  protected $webUser;
  
  /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = [
    'language',
    'content_translation',
    'node',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->labelOfNotTranslatedReference = $this->randomMachineName();
    $this->originalLabel = $this->randomMachineName();
    $this->translatedLabel = $this->randomMachineName();
    $this->setUpLanguages();
    // We setup languages, so we need to ensure that the language manager
    // and language path processor is updated.
    $this->rebuildContainer();
    $this->setUpContentTypes();
    $this->enableTranslation();
    $this->setUpEntityReferenceField();
    $this->createContent();
    $this->webUser = $this->drupalCreateUser([
      'edit any ' . $this->referrerType
        ->id() . ' content',
    ]);
  }
  
  /**
   * Tests if the entity is displayed in an entity reference field.
   */
  public function testEntityReferenceDisplay() {
    // Create a translated referrer entity.
    $this->referrerEntity = $this->createReferrerEntity();
    $this->assertEntityReferenceDisplay();
    $this->assertEntityReferenceFormDisplay();
    // Disable translation for referrer content type.
    $this->drupalLogin($this->rootUser);
    $this->drupalGet('admin/config/regional/content-language');
    $this->submitForm([
      'settings[node][referrer][translatable]' => FALSE,
    ], 'Save configuration');
    $this->drupalLogout();
    // Create a referrer entity without translation.
    $this->referrerEntity = $this->createReferrerEntity(FALSE);
    $this->assertEntityReferenceDisplay();
    $this->assertEntityReferenceFormDisplay();
  }
  
  /**
   * Assert entity reference display.
   *
   * @internal
   */
  protected function assertEntityReferenceDisplay() : void {
    $url = $this->referrerEntity
      ->toUrl();
    $translation_url = $this->referrerEntity
      ->toUrl('canonical', [
      'language' => ConfigurableLanguage::load($this->translateToLangcode),
    ]);
    $this->drupalGet($url);
    $this->assertSession()
      ->pageTextContains($this->labelOfNotTranslatedReference);
    $this->assertSession()
      ->pageTextContains($this->originalLabel);
    $this->assertSession()
      ->pageTextNotContains($this->translatedLabel);
    $this->drupalGet($translation_url);
    $this->assertSession()
      ->pageTextContains($this->labelOfNotTranslatedReference);
    $this->assertSession()
      ->pageTextNotContains($this->originalLabel);
    $this->assertSession()
      ->pageTextContains($this->translatedLabel);
  }
  
  /**
   * Assert entity reference form display.
   *
   * @internal
   */
  protected function assertEntityReferenceFormDisplay() : void {
    $this->drupalLogin($this->webUser);
    $url = $this->referrerEntity
      ->toUrl('edit-form');
    $translation_url = $this->referrerEntity
      ->toUrl('edit-form', [
      'language' => ConfigurableLanguage::load($this->translateToLangcode),
    ]);
    $this->drupalGet($url);
    $this->assertSession()
      ->fieldValueEquals('test_reference_field[0][target_id]', $this->originalLabel . ' (1)');
    $this->assertSession()
      ->fieldValueEquals('test_reference_field[1][target_id]', $this->labelOfNotTranslatedReference . ' (2)');
    $this->drupalGet($translation_url);
    $this->assertSession()
      ->fieldValueEquals('test_reference_field[0][target_id]', $this->translatedLabel . ' (1)');
    $this->assertSession()
      ->fieldValueEquals('test_reference_field[1][target_id]', $this->labelOfNotTranslatedReference . ' (2)');
    $this->drupalLogout();
  }
  
  /**
   * Adds additional languages.
   */
  protected function setUpLanguages() {
    ConfigurableLanguage::createFromLangcode($this->translateToLangcode)
      ->save();
  }
  
  /**
   * Creates a test subject contents, with translation.
   */
  protected function createContent() {
    $this->referencedEntityWithTranslation = $this->createReferencedEntityWithTranslation();
    $this->referencedEntityWithoutTranslation = $this->createNotTranslatedReferencedEntity();
  }
  
  /**
   * Enables translations where it needed.
   */
  protected function enableTranslation() {
    // Enable translation for the entity types and ensure the change is picked
    // up.
    \Drupal::service('content_translation.manager')->setEnabled($this->testEntityTypeName, $this->referrerType
      ->id(), TRUE);
    \Drupal::service('content_translation.manager')->setEnabled($this->testEntityTypeName, $this->referencedType
      ->id(), TRUE);
  }
  
  /**
   * Adds term reference field for the article content type.
   */
  protected function setUpEntityReferenceField() {
    FieldStorageConfig::create([
      'field_name' => $this->referenceFieldName,
      'entity_type' => $this->testEntityTypeName,
      'type' => 'entity_reference',
      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
      'translatable' => $this->translatable,
      'settings' => [
        'allowed_values' => [
          [
            'target_type' => $this->testEntityTypeName,
          ],
        ],
      ],
    ])
      ->save();
    FieldConfig::create([
      'field_name' => $this->referenceFieldName,
      'bundle' => $this->referrerType
        ->id(),
      'entity_type' => $this->testEntityTypeName,
    ])
      ->save();
    /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository */
    $display_repository = \Drupal::service('entity_display.repository');
    $display_repository->getFormDisplay($this->testEntityTypeName, $this->referrerType
      ->id())
      ->setComponent($this->referenceFieldName, [
      'type' => 'entity_reference_autocomplete',
    ])
      ->save();
    $display_repository->getViewDisplay($this->testEntityTypeName, $this->referrerType
      ->id())
      ->setComponent($this->referenceFieldName, [
      'type' => 'entity_reference_label',
    ])
      ->save();
  }
  
  /**
   * Create content types.
   */
  protected function setUpContentTypes() {
    $this->referrerType = $this->drupalCreateContentType([
      'type' => 'referrer',
      'name' => 'Referrer',
    ]);
    $this->referencedType = $this->drupalCreateContentType([
      'type' => 'referenced_page',
      'name' => 'Referenced Page',
    ]);
  }
  
  /**
   * Create a referenced entity with a translation.
   */
  protected function createReferencedEntityWithTranslation() {
    /** @var \Drupal\node\Entity\Node $node */
    $node = \Drupal::entityTypeManager()->getStorage($this->testEntityTypeName)
      ->create([
      'title' => $this->originalLabel,
      'type' => $this->referencedType
        ->id(),
      'description' => [
        'value' => $this->randomMachineName(),
        'format' => 'basic_html',
      ],
      'langcode' => $this->baseLangcode,
    ]);
    $node->save();
    $node->addTranslation($this->translateToLangcode, [
      'title' => $this->translatedLabel,
    ]);
    $node->save();
    return $node;
  }
  
  /**
   * Create the referenced entity.
   */
  protected function createNotTranslatedReferencedEntity() {
    /** @var \Drupal\node\Entity\Node $node */
    $node = \Drupal::entityTypeManager()->getStorage($this->testEntityTypeName)
      ->create([
      'title' => $this->labelOfNotTranslatedReference,
      'type' => $this->referencedType
        ->id(),
      'description' => [
        'value' => $this->randomMachineName(),
        'format' => 'basic_html',
      ],
      'langcode' => $this->baseLangcode,
    ]);
    $node->save();
    return $node;
  }
  
  /**
   * Create the referrer entity.
   */
  protected function createReferrerEntity($translatable = TRUE) {
    /** @var \Drupal\node\Entity\Node $node */
    $node = \Drupal::entityTypeManager()->getStorage($this->testEntityTypeName)
      ->create([
      'title' => $this->randomMachineName(),
      'type' => $this->referrerType
        ->id(),
      'description' => [
        'value' => $this->randomMachineName(),
        'format' => 'basic_html',
      ],
      $this->referenceFieldName => [
        [
          'target_id' => $this->referencedEntityWithTranslation
            ->id(),
        ],
        [
          'target_id' => $this->referencedEntityWithoutTranslation
            ->id(),
        ],
      ],
      'langcode' => $this->baseLangcode,
    ]);
    if ($translatable) {
      $node->addTranslation($this->translateToLangcode, $node->toArray());
    }
    $node->save();
    return $node;
  }

}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.