class Contact
Same name in other branches
- 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
- class \Drupal\Core\Entity\EntityBase implements \Drupal\Core\Entity\EntityInterface uses \Drupal\Core\Cache\RefinableCacheableDependencyTrait, \Drupal\Core\DependencyInjection\DependencySerializationTrait
- class \Drupal\Core\Entity\ContentEntityBase extends \Drupal\Core\Entity\EntityBase implements \Drupal\Core\Entity\IteratorAggregate, \Drupal\Core\Entity\ContentEntityInterface, \Drupal\Core\TypedData\TranslationStatusInterface uses \Drupal\Core\Entity\EntityChangesDetectionTrait, \Drupal\Core\Entity\SynchronizableEntityTrait
- class \Drupal\content_entity_example\Entity\Contact extends \Drupal\Core\Entity\ContentEntityBase implements \Drupal\content_entity_example\ContactInterface uses \Drupal\Core\Entity\EntityChangedTrait
- class \Drupal\Core\Entity\ContentEntityBase extends \Drupal\Core\Entity\EntityBase implements \Drupal\Core\Entity\IteratorAggregate, \Drupal\Core\Entity\ContentEntityInterface, \Drupal\Core\TypedData\TranslationStatusInterface uses \Drupal\Core\Entity\EntityChangesDetectionTrait, \Drupal\Core\Entity\SynchronizableEntityTrait
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\EntityView 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's cache tags upon delete. | 1 | ||
EntityBase::invalidateTagsOnSave | protected | function | Invalidates an entity'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. |