class Contact

Same name in other branches
  1. 3.x modules/content_entity_example/src/Entity/Contact.php \Drupal\content_entity_example\Entity\Contact
  2. 4.0.x modules/content_entity_example/src/Entity/Contact.php \Drupal\content_entity_example\Entity\Contact

Defines the ContentEntityExample entity.

This is the main definition of the entity type. From it, an EntityType object is derived. The most important properties in this example are listed below.

id: The unique identifier of this entity type. It follows the pattern 'moduleName_xyz' to avoid naming conflicts.

label: Human readable name of the entity type.

handlers: Handler classes are used for different tasks. You can use standard handlers provided by Drupal or build your own, most probably derived from the ones provided by Drupal. In detail:

  • view_builder: we use the standard controller to view an instance. It is called when a route lists an '_entity_view' default for the entity type. You can see this in the entity.content_entity_example_contact.canonical route in the content_entity_example.routing.yml file. The view can be manipulated by using the standard Drupal tools in the settings.
  • list_builder: We derive our own list builder class from EntityListBuilder to control the presentation. If there is a view available for this entity from the views module, it overrides the list builder if the "collection" key in the links array in the Entity annotation below is changed to the path of the View. In this case the entity collection route will give the view path.
  • form: We derive our own forms to add functionality like additional fields, redirects etc. These forms are used when the route specifies an '_entity_form' or '_entity_create_access' for the entity type. Depending on the suffix (.add/.default/.delete) of the '_entity_form' default in the route, the form specified in the annotation is used. The suffix then also becomes the $operation parameter to the access handler. We use the '.default' suffix for all operations that are not 'delete'.
  • access: Our own access controller, where we determine access rights based on permissions.

More properties:

  • base_table: Define the name of the table used to store the data. Make sure it is unique. The schema is automatically determined from the BaseFieldDefinitions below. The table is automatically created during installation.
  • entity_keys: How to access the fields. Specify fields from baseFieldDefinitions() which can be used as keys.
  • links: Provide links to do standard tasks. The 'edit-form' and 'delete-form' links are added to the list built by the entityListController. They will show up as action buttons in an additional column.
  • field_ui_base_route: The route name used by Field UI to attach its management pages. Field UI module will attach its Manage Fields, Manage Display, and Manage Form Display tabs to this route.

There are many more properties to be used in an entity type definition. For a complete overview, please refer to the '\Drupal\Core\Entity\EntityType' class definition.

The following construct is the actual definition of the entity type which is read and cached. Don't forget to clear cache after changes.

@ContentEntityType( id = "content_entity_example_contact", label = @Translation("Contact entity"), handlers = { "view_builder" = "Drupal\Core\Entity\EntityViewBuilder", "list_builder" = "Drupal\content_entity_example\Entity\Controller\ContactListBuilder", "form" = { "default" = "Drupal\content_entity_example\Form\ContactForm", "delete" = "Drupal\content_entity_example\Form\ContactDeleteForm", }, "access" = "Drupal\content_entity_example\ContactAccessControlHandler", }, list_cache_contexts = { "user" }, base_table = "contact", admin_permission = "administer contact entity", entity_keys = { "id" = "id", "label" = "name", "uuid" = "uuid" }, links = { "canonical" = "/content_entity_example_contact/{content_entity_example_contact}", "edit-form" = "/content_entity_example_contact/{content_entity_example_contact}/edit", "delete-form" = "/contact/{content_entity_example_contact}/delete", "collection" = "/content_entity_example_contact/list" }, field_ui_base_route = "content_entity_example.contact_settings", )

The 'links' above are defined by their path. For core to find the corresponding route, the route name must follow the correct pattern:

entity..

Example: 'entity.content_entity_example_contact.canonical'.

See the routing file at content_entity_example.routing.yml for the corresponding implementation.

The Contact class defines methods and fields for the contact entity.

Being derived from the ContentEntityBase class, we can override the methods we want. In our case we want to provide access to the standard fields about creation and changed time stamps.

Our interface (see ContactInterface) also exposes the EntityOwnerInterface. This allows us to provide methods for setting and providing ownership information.

The most important part is the definitions of the field properties for this entity type. These are of the same type as fields added through the GUI, but they can by changed in code. In the definition we can define if the user with the rights privileges can influence the presentation (view, edit) of each field.

The class also uses the EntityChangedTrait trait which allows it to record timestamps of save operations.

Hierarchy

Expanded class hierarchy of Contact

Related topics

2 files declare their use of Contact
ContactTest.php in content_entity_example/tests/src/Kernel/ContactTest.php
ContentEntityExampleTest.php in content_entity_example/tests/src/Functional/ContentEntityExampleTest.php

File

content_entity_example/src/Entity/Contact.php, line 138

Namespace

Drupal\content_entity_example\Entity
View source
class Contact extends ContentEntityBase implements ContactInterface {
    use EntityChangedTrait;
    
    /**
     * {@inheritdoc}
     *
     * When a new entity instance is added, set the user_id entity reference to
     * the current user as the creator of the instance.
     */
    public static function preCreate(EntityStorageInterface $storage_controller, array &$values) {
        parent::preCreate($storage_controller, $values);
        $values += [
            'user_id' => \Drupal::currentUser()->id(),
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    public function getOwner() {
        return $this->get('user_id')->entity;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getOwnerId() {
        return $this->get('user_id')->target_id;
    }
    
    /**
     * {@inheritdoc}
     */
    public function setOwnerId($uid) {
        $this->set('user_id', $uid);
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function setOwner(UserInterface $account) {
        $this->set('user_id', $account->id());
        return $this;
    }
    
    /**
     * {@inheritdoc}
     *
     * Define the field properties here.
     *
     * Field name, type and size determine the table structure.
     *
     * In addition, we can define how the field and its content can be manipulated
     * in the GUI. The behaviour of the widgets used can be determined here.
     */
    public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
        // Standard field, used as unique if primary index.
        $fields['id'] = BaseFieldDefinition::create('integer')->setLabel(t('ID'))
            ->setDescription(t('The ID of the Contact entity.'))
            ->setReadOnly(TRUE);
        // Standard field, unique outside of the scope of the current project.
        $fields['uuid'] = BaseFieldDefinition::create('uuid')->setLabel(t('UUID'))
            ->setDescription(t('The UUID of the Contact entity.'))
            ->setReadOnly(TRUE);
        // Name field for the contact.
        // We set display options for the view as well as the form.
        // Users with correct privileges can change the view and edit configuration.
        $fields['name'] = BaseFieldDefinition::create('string')->setLabel(t('Name'))
            ->setDescription(t('The name of the Contact entity.'))
            ->setSettings([
            'max_length' => 255,
            'text_processing' => 0,
        ])
            ->setDefaultValue(NULL)
            ->setDisplayOptions('view', [
            'label' => 'above',
            'type' => 'string',
            'weight' => -6,
        ])
            ->setDisplayOptions('form', [
            'type' => 'string_textfield',
            'weight' => -6,
        ])
            ->setDisplayConfigurable('form', TRUE)
            ->setDisplayConfigurable('view', TRUE);
        $fields['first_name'] = BaseFieldDefinition::create('string')->setLabel(t('First Name'))
            ->setDescription(t('The first name of the Contact entity.'))
            ->setSettings([
            'max_length' => 255,
            'text_processing' => 0,
        ])
            ->setDefaultValue(NULL)
            ->setDisplayOptions('view', [
            'label' => 'above',
            'type' => 'string',
            'weight' => -5,
        ])
            ->setDisplayOptions('form', [
            'type' => 'string_textfield',
            'weight' => -5,
        ])
            ->setDisplayConfigurable('form', TRUE)
            ->setDisplayConfigurable('view', TRUE);
        // Owner field of the contact.
        // Entity reference field, holds the reference to the user object.
        // The view shows the user name field of the user.
        // The form presents a auto complete field for the user name.
        $fields['user_id'] = BaseFieldDefinition::create('entity_reference')->setLabel(t('User Name'))
            ->setDescription(t('The Name of the associated user.'))
            ->setSetting('target_type', 'user')
            ->setSetting('handler', 'default')
            ->setDisplayOptions('view', [
            'label' => 'above',
            'type' => 'author',
            'weight' => -3,
        ])
            ->setDisplayOptions('form', [
            'type' => 'entity_reference_autocomplete',
            'settings' => [
                'match_operator' => 'CONTAINS',
                'match_limit' => 10,
                'size' => 60,
                'placeholder' => '',
            ],
            'weight' => -3,
        ])
            ->setDisplayConfigurable('form', TRUE)
            ->setDisplayConfigurable('view', TRUE);
        // Role field for the contact.
        // The values shown in options are 'administrator' and 'user'.
        $fields['role'] = BaseFieldDefinition::create('list_string')->setLabel(t('Role'))
            ->setDescription(t('The role of the Contact entity.'))
            ->setSettings([
            'allowed_values' => [
                'administrator' => 'administrator',
                'user' => 'user',
            ],
        ])
            ->setDefaultValue('user')
            ->setDisplayOptions('view', [
            'label' => 'above',
            'type' => 'string',
            'weight' => -2,
        ])
            ->setDisplayOptions('form', [
            'type' => 'options_select',
            'weight' => -2,
        ])
            ->setDisplayConfigurable('form', TRUE)
            ->setDisplayConfigurable('view', TRUE);
        $fields['langcode'] = BaseFieldDefinition::create('language')->setLabel(t('Language code'))
            ->setDescription(t('The language code of ContentEntityExample entity.'));
        $fields['created'] = BaseFieldDefinition::create('created')->setLabel(t('Created'))
            ->setDescription(t('The time that the entity was created.'));
        $fields['changed'] = BaseFieldDefinition::create('changed')->setLabel(t('Changed'))
            ->setDescription(t('The time that the entity was last edited.'));
        return $fields;
    }

}

Members

Title Sort descending Modifiers Object type Summary
Contact::baseFieldDefinitions public static function Define the field properties here.
Contact::getOwner public function
Contact::getOwnerId public function
Contact::preCreate public static function When a new entity instance is added, set the user_id entity reference to
the current user as the creator of the instance.
Contact::setOwner public function
Contact::setOwnerId public function