class Contact

Same name in other branches
  1. 3.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.<entity_type>.<link_name>

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 modules/content_entity_example/tests/src/Kernel/ContactTest.php
ContentEntityExampleTest.php in modules/content_entity_example/tests/src/Functional/ContentEntityExampleTest.php

File

modules/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 Member alias Overriden Title Overrides
CacheableDependencyTrait::$cacheContexts protected property Cache contexts.
CacheableDependencyTrait::$cacheMaxAge protected property Cache max-age.
CacheableDependencyTrait::$cacheTags protected property Cache tags.
CacheableDependencyTrait::setCacheability protected function Sets cacheability; useful for value object constructors.
Contact::baseFieldDefinitions public static function Define the field properties here. Overrides ContentEntityBase::baseFieldDefinitions
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.
Overrides EntityBase::preCreate
Contact::setOwner public function
Contact::setOwnerId public function
ContentEntityBase::$activeLangcode protected property Language code identifying the entity active language.
ContentEntityBase::$defaultLangcode protected property Local cache for the default language code.
ContentEntityBase::$defaultLangcodeKey protected property The default langcode entity key.
ContentEntityBase::$enforceDefaultTranslation protected property Override the result of isDefaultTranslation().
ContentEntityBase::$enforceRevisionTranslationAffected protected property Whether the revision translation affected flag has been enforced.
ContentEntityBase::$entityKeys protected property Holds untranslatable entity keys such as the ID, bundle, and revision ID.
ContentEntityBase::$fieldDefinitions protected property Local cache for field definitions.
ContentEntityBase::$fields protected property The array of fields, each being an instance of FieldItemListInterface.
ContentEntityBase::$fieldsToSkipFromTranslationChangesCheck protected static property Local cache for fields to skip from the checking for translation changes.
ContentEntityBase::$isDefaultRevision protected property Indicates whether this is the default revision.
ContentEntityBase::$langcodeKey protected property The language entity key.
ContentEntityBase::$languages protected property Local cache for the available language objects.
ContentEntityBase::$loadedRevisionId protected property The loaded revision ID before the new revision was set.
ContentEntityBase::$newRevision protected property Boolean indicating whether a new revision should be created on save.
ContentEntityBase::$revisionTranslationAffectedKey protected property The revision translation affected entity key.
ContentEntityBase::$translatableEntityKeys protected property Holds translatable entity keys such as the label.
ContentEntityBase::$translationInitialize protected property A flag indicating whether a translation object is being initialized.
ContentEntityBase::$translations protected property An array of entity translation metadata.
ContentEntityBase::$validated protected property Whether entity validation was performed.
ContentEntityBase::$validationRequired protected property Whether entity validation is required before saving the entity.
ContentEntityBase::$values protected property The plain data values of the contained fields.
ContentEntityBase::access public function Overrides EntityBase::access 1
ContentEntityBase::addTranslation public function
ContentEntityBase::bundle public function Overrides EntityBase::bundle
ContentEntityBase::bundleFieldDefinitions public static function 5
ContentEntityBase::clearTranslationCache protected function Clears entity translation object cache to remove stale references.
ContentEntityBase::create public static function Overrides EntityBase::create
ContentEntityBase::createDuplicate public function Overrides EntityBase::createDuplicate 1
ContentEntityBase::get public function
ContentEntityBase::getEntityKey protected function Gets the value of the given entity key, if defined. 1
ContentEntityBase::getFieldDefinition public function
ContentEntityBase::getFieldDefinitions public function
ContentEntityBase::getFields public function
ContentEntityBase::getFieldsToSkipFromTranslationChangesCheck protected function Returns an array of field names to skip in ::hasTranslationChanges. 1
ContentEntityBase::getIterator public function
ContentEntityBase::getLanguages protected function
ContentEntityBase::getLoadedRevisionId public function
ContentEntityBase::getRevisionId public function
ContentEntityBase::getTranslatableFields public function
ContentEntityBase::getTranslatedField protected function Gets a translated field.
ContentEntityBase::getTranslation public function
ContentEntityBase::getTranslationLanguages public function
ContentEntityBase::getTranslationStatus public function Overrides TranslationStatusInterface::getTranslationStatus
ContentEntityBase::getUntranslated public function
ContentEntityBase::hasField public function
ContentEntityBase::hasTranslation public function
ContentEntityBase::hasTranslationChanges public function
ContentEntityBase::id public function Overrides EntityBase::id
ContentEntityBase::initializeTranslation protected function Instantiates a translation object for an existing translation.
ContentEntityBase::isDefaultRevision public function
ContentEntityBase::isDefaultTranslation public function
ContentEntityBase::isDefaultTranslationAffectedOnly public function
ContentEntityBase::isLatestRevision public function
ContentEntityBase::isLatestTranslationAffectedRevision public function
ContentEntityBase::isNewRevision public function
ContentEntityBase::isNewTranslation public function
ContentEntityBase::isRevisionTranslationAffected public function
ContentEntityBase::isRevisionTranslationAffectedEnforced public function
ContentEntityBase::isTranslatable public function
ContentEntityBase::isValidationRequired public function
ContentEntityBase::label public function Overrides EntityBase::label 4
ContentEntityBase::language public function Overrides EntityBase::language
ContentEntityBase::onChange public function
ContentEntityBase::postCreate public function Overrides EntityBase::postCreate 1
ContentEntityBase::postSave public function Overrides EntityBase::postSave 8
ContentEntityBase::preSave public function Overrides EntityBase::preSave 8
ContentEntityBase::preSaveRevision public function 3
ContentEntityBase::referencedEntities public function Overrides EntityBase::referencedEntities 1
ContentEntityBase::removeTranslation public function
ContentEntityBase::set public function
ContentEntityBase::setDefaultLangcode protected function Populates the local cache for the default language code.
ContentEntityBase::setDefaultTranslationEnforced public function Set or clear an override of the isDefaultTranslation() result.
ContentEntityBase::setNewRevision public function
ContentEntityBase::setRevisionTranslationAffected public function
ContentEntityBase::setRevisionTranslationAffectedEnforced public function
ContentEntityBase::setValidationRequired public function
ContentEntityBase::toArray public function Overrides EntityBase::toArray
ContentEntityBase::updateFieldLangcodes protected function Updates language for already instantiated fields.
ContentEntityBase::updateLoadedRevisionId public function
ContentEntityBase::updateOriginalValues public function Updates the original values with the interim changes.
ContentEntityBase::uuid public function Overrides EntityBase::uuid
ContentEntityBase::validate public function 1
ContentEntityBase::wasDefaultRevision public function
ContentEntityBase::__clone public function Magic method: Implements a deep clone.
ContentEntityBase::__construct public function Overrides EntityBase::__construct
ContentEntityBase::__get public function Implements the magic method for getting object properties.
ContentEntityBase::__isset public function Implements the magic method for isset().
ContentEntityBase::__set public function Implements the magic method for setting object properties.
ContentEntityBase::__sleep public function Overrides EntityBase::__sleep
ContentEntityBase::__unset public function Implements the magic method for unset().
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function Aliased as: traitSleep 1
DependencySerializationTrait::__wakeup public function 2
EntityBase::$enforceIsNew protected property Boolean indicating whether the entity should be forced to be new.
EntityBase::$entityTypeId protected property The entity type.
EntityBase::$typedData protected property A typed data object wrapping this entity.
EntityBase::delete public function Overrides EntityInterface::delete 1
EntityBase::enforceIsNew public function Overrides EntityInterface::enforceIsNew
EntityBase::entityTypeBundleInfo protected function Gets the entity type bundle info service.
EntityBase::entityTypeManager protected function Gets the entity type manager.
EntityBase::getCacheContexts public function Overrides CacheableDependencyTrait::getCacheContexts
EntityBase::getCacheMaxAge public function Overrides CacheableDependencyTrait::getCacheMaxAge
EntityBase::getCacheTags public function Overrides CacheableDependencyTrait::getCacheTags
EntityBase::getCacheTagsToInvalidate public function Overrides EntityInterface::getCacheTagsToInvalidate 3
EntityBase::getConfigDependencyKey public function Overrides EntityInterface::getConfigDependencyKey
EntityBase::getConfigDependencyName public function Overrides EntityInterface::getConfigDependencyName 1
EntityBase::getConfigTarget public function Overrides EntityInterface::getConfigTarget 1
EntityBase::getEntityType public function Overrides EntityInterface::getEntityType
EntityBase::getEntityTypeId public function Overrides EntityInterface::getEntityTypeId
EntityBase::getListCacheTagsToInvalidate protected function The list cache tags to invalidate for this entity.
EntityBase::getOriginalId public function Overrides EntityInterface::getOriginalId 1
EntityBase::getTypedData public function Overrides EntityInterface::getTypedData
EntityBase::getTypedDataClass private function Returns the typed data class name for this entity.
EntityBase::hasLinkTemplate public function Overrides EntityInterface::hasLinkTemplate
EntityBase::invalidateTagsOnDelete protected static function Invalidates an entity&#039;s cache tags upon delete. 1
EntityBase::invalidateTagsOnSave protected function Invalidates an entity&#039;s cache tags upon save. 2
EntityBase::isNew public function Overrides EntityInterface::isNew 2
EntityBase::languageManager protected function Gets the language manager.
EntityBase::linkTemplates protected function Gets an array link templates. 1
EntityBase::load public static function Overrides EntityInterface::load
EntityBase::loadMultiple public static function Overrides EntityInterface::loadMultiple
EntityBase::postDelete public static function Overrides EntityInterface::postDelete 17
EntityBase::postLoad public static function Overrides EntityInterface::postLoad 3
EntityBase::preDelete public static function Overrides EntityInterface::preDelete 7
EntityBase::save public function Overrides EntityInterface::save 3
EntityBase::setOriginalId public function Overrides EntityInterface::setOriginalId 1
EntityBase::toLink public function Overrides EntityInterface::toLink
EntityBase::toUrl public function Overrides EntityInterface::toUrl 2
EntityBase::uriRelationships public function Overrides EntityInterface::uriRelationships
EntityBase::urlRouteParameters protected function Gets an array of placeholders for this entity. 2
EntityBase::uuidGenerator protected function Gets the UUID generator.
EntityChangedTrait::getChangedTime public function Gets the timestamp of the last entity change for the current translation.
EntityChangedTrait::getChangedTimeAcrossTranslations public function Returns the timestamp of the last entity change across all translations.
EntityChangedTrait::setChangedTime public function Sets the timestamp of the last entity change for the current translation.
EntityChangesDetectionTrait::getFieldsToSkipFromTranslationChangesCheck protected function Returns an array of field names to skip when checking for changes. Aliased as: traitGetFieldsToSkipFromTranslationChangesCheck
RefinableCacheableDependencyTrait::addCacheableDependency public function 1
RefinableCacheableDependencyTrait::addCacheContexts public function
RefinableCacheableDependencyTrait::addCacheTags public function
RefinableCacheableDependencyTrait::mergeCacheMaxAge public function
SynchronizableEntityTrait::$isSyncing protected property Is entity being created updated or deleted through synchronization process.
SynchronizableEntityTrait::isSyncing public function
SynchronizableEntityTrait::setSyncing public function
TranslationStatusInterface::TRANSLATION_CREATED constant Status code identifying a newly created translation.
TranslationStatusInterface::TRANSLATION_EXISTING constant Status code identifying an existing translation.
TranslationStatusInterface::TRANSLATION_REMOVED constant Status code identifying a removed translation.