View source
<?php
namespace Drupal\Tests\field\Functional\EntityReference;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\field\Entity\FieldConfig;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
use Drupal\taxonomy\Entity\Vocabulary;
use Drupal\node\Entity\Node;
use Drupal\field\Entity\FieldStorageConfig;
class EntityReferenceAutoCreateTest extends BrowserTestBase {
use EntityReferenceTestTrait;
public static $modules = [
'node',
'taxonomy',
'entity_test',
];
protected $defaultTheme = 'stark';
protected $referencingType;
protected $referencedType;
protected function setUp() {
parent::setUp();
$referencing = $this
->drupalCreateContentType();
$this->referencingType = $referencing
->id();
$referenced = $this
->drupalCreateContentType();
$this->referencedType = $referenced
->id();
FieldStorageConfig::create([
'field_name' => 'test_field',
'entity_type' => 'node',
'translatable' => FALSE,
'entity_types' => [],
'settings' => [
'target_type' => 'node',
],
'type' => 'entity_reference',
'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
])
->save();
FieldConfig::create([
'label' => 'Entity reference field',
'field_name' => 'test_field',
'entity_type' => 'node',
'bundle' => $referencing
->id(),
'settings' => [
'handler' => 'default',
'handler_settings' => [
'target_bundles' => [
$referenced
->id(),
],
'auto_create' => TRUE,
],
],
])
->save();
$display_repository = \Drupal::service('entity_display.repository');
$display_repository
->getViewDisplay('node', $referencing
->id())
->setComponent('test_field')
->save();
$display_repository
->getFormDisplay('node', $referencing
->id(), 'default')
->setComponent('test_field', [
'type' => 'entity_reference_autocomplete',
])
->save();
$account = $this
->drupalCreateUser([
'access content',
"create {$this->referencingType} content",
]);
$this
->drupalLogin($account);
}
public function testAutoCreate() {
$this
->drupalGet('node/add/' . $this->referencingType);
$this
->assertFieldByXPath('//input[@id="edit-test-field-0-target-id" and contains(@class, "form-autocomplete")]', NULL, 'The autocomplete input element appears.');
$new_title = $this
->randomMachineName();
$base_query = \Drupal::entityQuery('node');
$base_query
->condition('type', $this->referencedType)
->condition('title', $new_title);
$query = clone $base_query;
$result = $query
->execute();
$this
->assertEmpty($result, 'Referenced node does not exist yet.');
$edit = [
'title[0][value]' => $this
->randomMachineName(),
'test_field[0][target_id]' => $new_title,
];
$this
->drupalPostForm("node/add/{$this->referencingType}", $edit, 'Save');
$query = clone $base_query;
$result = $query
->execute();
$this
->assertNotEmpty($result, 'Referenced node was created.');
$referenced_nid = key($result);
$referenced_node = Node::load($referenced_nid);
$result = \Drupal::entityQuery('node')
->condition('type', $this->referencingType)
->execute();
$referencing_nid = key($result);
$referencing_node = Node::load($referencing_nid);
$this
->assertEqual($referenced_nid, $referencing_node->test_field->target_id, 'Newly created node is referenced from the referencing node.');
$this
->drupalGet('node/' . $referencing_node
->id());
$this
->assertText($referencing_node
->label(), 'Referencing node label found.');
$this
->assertText($referenced_node
->label(), 'Referenced node label found.');
}
public function testMultipleTargetBundles() {
$vocabularies = [];
for ($i = 0; $i < 2; $i++) {
$vid = mb_strtolower($this
->randomMachineName());
$vocabularies[$i] = Vocabulary::create([
'name' => $this
->randomMachineName(),
'vid' => $vid,
]);
$vocabularies[$i]
->save();
}
$field_name = mb_strtolower($this
->randomMachineName());
$handler_settings = [
'target_bundles' => [
$vocabularies[0]
->id() => $vocabularies[0]
->id(),
$vocabularies[1]
->id() => $vocabularies[1]
->id(),
],
'auto_create' => TRUE,
'auto_create_bundle' => $vocabularies[1]
->id(),
];
$this
->createEntityReferenceField('node', $this->referencingType, $field_name, $this
->randomString(), 'taxonomy_term', 'default', $handler_settings);
\Drupal::service('entity_display.repository')
->getFormDisplay('node', $this->referencingType)
->setComponent($field_name, [
'type' => 'entity_reference_autocomplete',
])
->save();
$term_name = $this
->randomString();
$edit = [
$field_name . '[0][target_id]' => $term_name,
'title[0][value]' => $this
->randomString(),
];
$this
->drupalPostForm('node/add/' . $this->referencingType, $edit, 'Save');
$term = taxonomy_term_load_multiple_by_name($term_name);
$term = reset($term);
$this
->assertEqual($vocabularies[1]
->id(), $term
->bundle());
$field_config = FieldConfig::loadByName('node', $this->referencingType, $field_name);
$handler_settings = $field_config
->getSetting('handler_settings');
$handler_settings['auto_create_bundle'] = $vocabularies[0]
->id();
$field_config
->setSetting('handler_settings', $handler_settings);
$field_config
->save();
$term_name = $this
->randomString();
$edit = [
$field_name . '[0][target_id]' => $term_name,
'title[0][value]' => $this
->randomString(),
];
$this
->drupalPostForm('node/add/' . $this->referencingType, $edit, 'Save');
$term = taxonomy_term_load_multiple_by_name($term_name);
$term = reset($term);
$this
->assertEqual($vocabularies[0]
->id(), $term
->bundle());
}
public function testNoBundles() {
$account = $this
->drupalCreateUser([
'access content',
"create {$this->referencingType} content",
'administer entity_test content',
]);
$this
->drupalLogin($account);
$field_name = mb_strtolower($this
->randomMachineName());
$handler_settings = [
'auto_create' => TRUE,
];
$this
->createEntityReferenceField('node', $this->referencingType, $field_name, $this
->randomString(), 'entity_test_no_bundle_with_label', 'default', $handler_settings);
\Drupal::service('entity_display.repository')
->getFormDisplay('node', $this->referencingType)
->setComponent($field_name, [
'type' => 'entity_reference_autocomplete',
])
->save();
$node_title = $this
->randomMachineName();
$name = $this
->randomMachineName();
$edit = [
$field_name . '[0][target_id]' => $name,
'title[0][value]' => $node_title,
];
$this
->drupalPostForm('node/add/' . $this->referencingType, $edit, 'Save');
$result = \Drupal::entityQuery('entity_test_no_bundle_with_label')
->condition('name', $name)
->execute();
$this
->assertNotEmpty($result, 'Referenced entity was created.');
$referenced_id = key($result);
$result = \Drupal::entityQuery('node')
->condition('type', $this->referencingType)
->execute();
$this
->assertCount(1, $result);
$referencing_nid = key($result);
$referencing_node = Node::load($referencing_nid);
$this
->assertEqual($referenced_id, $referencing_node->{$field_name}->target_id, 'Newly created node is referenced from the referencing entity.');
}
}