Reputation: 626
I want to create an entity reference field in Drupal 8 using my custom module. Like when someone clicks a link on a Drupal page, an entity reference field would be created in the page node type automatically.
Can anyone help me with this?
Upvotes: 12
Views: 14763
Reputation: 780
So I can hopefully find this faster if I need to again...
Create field storage:
if (!$field_storage = FieldStorageConfig::loadByName($entity_type, $field_name)) {
FieldStorageConfig::create([
'field_name' => $field_name,
'entity_type' => $entity_type,
'type' => $type,
'cardinality' => -1,
// Optional to target entity types.
'settings' => [
'target_type' => $entity_target_type, // Ex: node, taxonomy_term.
],
])->save();
}
Create field:
FieldConfig::create([
'field_name' => $field_name,
'entity_type' => $entity_type,
'bundle' => $bundle,
'label' => $label,
'cardinality' => -1,
// Optional to target bundles.
'settings' => [
'handler' => 'default',
'handler_settings' => [
'target_bundles' => [
$vid1,
$vid2,
],
],
],
])->save();
Upvotes: 6
Reputation: 3988
This will create an entity reference field for node
content types with the article
bundle.
$form['node_id'] = array(
'#type' => 'entity_autocomplete',
'#title' => $this->t('Node'),
'#target_type' => 'node',
'#selection_settings' => ['target_bundles' => ['article']],
'#tags' => TRUE,
'#size' => 30,
'#maxlength' => 1024,
);
Note you can change target_type
for other entities like taxonomy_term
.
Upvotes: 3
Reputation: 2364
$node = new stdClass();
$node->title = "YOUR TITLE";
$node->type = "YOUR_NODE_TYPE";
....
$node->field_customer_nid[$node->language][]['target_id'] = $form_state['values']['entity id'];
...
node_submit($node);
node_save($node);
Upvotes: 0
Reputation: 1718
You can get help from https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!Plugin!DataType!EntityReference.php/8
Or you can download sample entity examples too https://www.drupal.org/project/examples
Or you can use my method too which is as below:
Set up module content_entity_example.info.yml
name: Content Entity Example
type: module
description: 'Provides ContentEntityExampleContact entity.'
package: Example modules
core: 8.x
# These modules are required by the tests, must be available at bootstrap time
dependencies:
- options
- entity_reference
- examples
Creating a content entity type in Drupal 8
We will create a 'Contact' entity to add, edit and delete People (Contacts). It is fully fieldable and uses most of the new entity concepts available in Drupal 8.
Routing content_entity_example.routing.yml
# This file brings everything together. Very nifty!
# Route name can be used in sevaral place (links, redirects, local actions etc.)
entity.content_entity_example_contact.canonical:
path: '/content_entity_example_contact/{content_entity_example_contact}'
defaults:
# Calls the view controller, defined in the annotation of the contact entity
_entity_view: 'content_entity_example_contact'
_title: 'Contact Content'
requirements:
# Calls the access controller of the entity, $operation 'view'
_entity_access: 'content_entity_example_contact.view'
entity.content_entity_example_contact.collection:
path: '/content_entity_example_contact/list'
defaults:
# Calls the list controller, defined in the annotation of the contact entity.
_entity_list: 'content_entity_example_contact'
_title: 'Contact List'
requirements:
# Checks for permission directly.
_permission: 'view contact entity'
content_entity_example.contact_add:
path: '/content_entity_example_contact/add'
defaults:
# Calls the form.add controller, defined in the contact entity.
_entity_form: content_entity_example_contact.add
_title: 'Add Contact'
requirements:
_entity_create_access: 'content_entity_example_contact'
entity.content_entity_example_contact.edit_form:
path: '/content_entity_example_contact/{content_entity_example_contact}/edit'
defaults:
# Calls the form.edit controller, defined in the contact entity.
_entity_form: content_entity_example_contact.edit
_title: 'Edit Contact'
requirements:
_entity_access: 'content_entity_example_contact.edit'
entity.content_entity_example_contact.delete_form:
path: '/contact/{content_entity_example_contact}/delete'
defaults:
# Calls the form.delete controller, defined in the contact entity.
_entity_form: content_entity_example_contact.delete
_title: 'Delete Contact'
requirements:
_entity_access: 'content_entity_example_contact.delete'
content_entity_example.contact_settings:
path: 'admin/structure/content_entity_example_contact_settings'
defaults:
_form: '\Drupal\content_entity_example\Form\ContactSettingsForm'
_title: 'Contact Settings'
requirements:
_permission: 'administer contact entity'
The route names for actions defined in the 'link' section of the entity annotation must follow the right pattern. For details please see the Content Entity Class below.
content_entity_example.links.menu.yml
In combination with the routing file, this replaces hook_menu for the module.
# Define the menu links for this module
entity.content_entity_example_contact.collection:
title: 'Content Entity Example: Contacts Listing'
route_name: entity.content_entity_example_contact.collection
description: 'List Contacts'
weight: 10
content_entity_example_contact.admin.structure.settings:
title: Contact Settings
description: 'Configure Contact entity'
route_name: content_entity_example.contact_settings
parent: system.admin_structure
content_entity_example.links.action.yml
# All action links for this module
content_entity_example.contact_add:
# Which route will be called by the link
route_name: content_entity_example.contact_add
title: 'Add Contact'
# Where will the link appear, defined by route name.
appears_on:
- entity.content_entity_example_contact.collection
- entity.content_entity_example_contact.canonical
Upvotes: -2