Temps de lecture
Environ 4 minutes
Load entity
hook_entity_load
function hook_entity_load(array $entities, $entity_type_id) {
foreach ($entities as $entity) {
$entity->foo = mymodule_add_something($entity);
}
}
hook_ENTITY_TYPE_load
function hook_ENTITY_TYPE_load($entities) {
foreach ($entities as $entity) {
$entity->foo = mymodule_add_something($entity);
}
}
hook_entity_storage_load
function hook_entity_storage_load(array $entities, $entity_type) {
if ($entity_type == ' user') {
foreach ($entities as $entity) {
$entity->foo = mymodule_add_something_uncached($entity);
}
}
}
hook_entity_prepare_view
function hook_entity_prepare_view($entity_type_id, array $entities, array $displays, $view_mode) {
// Load a specific node into the user object for later theming.
if (!empty($entities) && $entity_type_id == 'user') {
// Only do the extra work if the component is configured to be
// displayed. This assumes a 'mymodule_addition' extra field has been
// defined for the entity bundle in hook_entity_extra_field_info().
$ids = array();
foreach ($entities as $id => $entity) {
if ($displays[$entity->bundle()]->getComponent('mymodule_addition')) {
$ids[] = $id;
}
}
if ($ids) {
$nodes = mymodule_get_user_nodes($ids);
foreach ($ids as $id) {
$entities[$id]->user_node = $nodes[$id];
}
}
}
}
Interact with entities before rendering
hook_entity_view
, hook_ENTITY_TYPE_view
, and hook_entity_view_alter
.
hook_entity_view
function hook_entity_view(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display, $view_mode) {
// Only do the extra work if the component is configured to be displayed.
// This assumes a 'mymodule_addition' extra field has been defined for the
// entity bundle in hook_entity_extra_field_info().
if ($display->getComponent('mymodule_addition')) {
$build['mymodule_addition'] = array(
'#markup' => mymodule_addition($entity),
'#theme' => 'mymodule_my_additional_field',
);
}
}
hook_ENTITY_TYPE_view
function hook_ENTITY_TYPE_view(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display, $view_mode) {
// Only do the extra work if the component is configured to be displayed.
// This assumes a 'mymodule_addition' extra field has been defined for the
// entity bundle in hook_entity_extra_field_info().
if ($display->getComponent('mymodule_addition')) {
$build['mymodule_addition'] = array(
'#markup' => mymodule_addition($entity),
'#theme' => 'mymodule_my_additional_field',
);
}
}
hook_entity_view_alter
function hook_entity_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
// Change its weight.
$build['an_additional_field']['#weight'] = -10;
// Add a #post_render callback to act on the rendered HTML of the entity.
$build['#post_render'][] = 'my_module_node_post_render';
}
}
Create or update entities
hook_entity_create
function hook_entity_create(\Drupal\Core\Entity\EntityInterface $entity) {
\Drupal::logger('example')->info('Entity created: @label', ['@label' => $entity->label()]);
}
hook_ENTITY_TYPE_create
function hook_ENTITY_TYPE_create(\Drupal\Core\Entity\EntityInterface $entity) {
\Drupal::logger('example')->info('ENTITY_TYPE created: @label', ['@label' => $entity->label()]);
}
hook_entity_insert
function hook_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
// Insert the new entity into a fictional table of all entities.
db_insert('example_entity')
->fields(array(
'type' => $entity->getEntityTypeId(),
'id' => $entity->id(),
'created' => REQUEST_TIME,
'updated' => REQUEST_TIME,
))
->execute();
}
hook_ENTITY_TYPE_insert
function hook_ENTITY_TYPE_insert(Drupal\Core\Entity\EntityInterface $entity) {
// Insert the new entity into a fictional table of this type of entity.
db_insert('example_entity')
->fields(array(
'id' => $entity->id(),
'created' => REQUEST_TIME,
'updated' => REQUEST_TIME,
))
->execute();
}
hook_entity_revision_create
function hook_entity_revision_create(Drupal\Core\Entity\EntityInterface $new_revision, Drupal\Core\Entity\EntityInterface $entity, $keep_untranslatable_fields) {
// Retain the value from an untranslatable field, which are by default
// synchronized from the default revision.
$new_revision->set('untranslatable_field', $entity->get('untranslatable_field'));
}
hook_ENTITY_TYPE_revision_create
function hook_ENTITY_TYPE_revision_create(Drupal\Core\Entity\EntityInterface $new_revision, Drupal\Core\Entity\EntityInterface $entity, $keep_untranslatable_fields) {
// Retain the value from an untranslatable field, which are by default
// synchronized from the default revision.
$new_revision
->set('untranslatable_field', $entity
->get('untranslatable_field'));
}
hook_entity_update
function hook_entity_update(Drupal\Core\Entity\EntityInterface $entity) {
// Update the entity's entry in a fictional table of all entities.
db_update('example_entity')
->fields(array(
'updated' => REQUEST_TIME,
))
->condition('type', $entity->getEntityTypeId())
->condition('id', $entity->id())
->execute();
}
hook_ENTITY_TYPE_update
function hook_ENTITY_TYPE_update(Drupal\Core\Entity\EntityInterface $entity) {
// Update the entity's entry in a fictional table of this type of entity.
db_update('example_entity')
->fields(array(
'updated' => REQUEST_TIME,
))
->condition('id', $entity->id())
->execute();
}
hook_entity_presave
function hook_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
if ($entity instanceof ContentEntityInterface && $entity->isTranslatable()) {
$route_match = \Drupal::routeMatch();
\Drupal::service('content_translation.synchronizer')->synchronizeFields($entity, $entity->language()->getId(), $route_match->getParameter('source_langcode'));
}
}
hook_ENTITY_TYPE_presave
function hook_ENTITY_TYPE_presave(Drupal\Core\Entity\EntityInterface $entity) {
if ($entity->isTranslatable()) {
$route_match = \Drupal::routeMatch();
\Drupal::service('content_translation.synchronizer')->synchronizeFields($entity, $entity->language()->getId(), $route_match->getParameter('source_langcode'));
}
}
Delete entities
The entity deletion process also offers several hooks to give us the ability to interact:
hook_entity_predelete
hook_ENTITY_TYPE_predelete
hook_entity_delete
hook_ENTITY_TYPE_delete
hook_entity_revision_delete
hook_ENTITY_TYPE_revision_delete
hook_entity_predelete
function hook_entity_predelete(Drupal\Core\Entity\EntityInterface $entity) {
// Count references to this entity in a custom table before they are removed
// upon entity deletion.
$id = $entity->id();
$type = $entity->getEntityTypeId();
$count = db_select('example_entity_data')
->condition('type', $type)
->condition('id', $id)
->countQuery()
->execute()
->fetchField();
// Log the count in a table that records this statistic for deleted entities.
db_merge('example_deleted_entity_statistics')
->key(array('type' => $type, 'id' => $id))
->fields(array('count' => $count))
->execute();
}
hook_ENTITY_TYPE_predelete
function hook_ENTITY_TYPE_predelete(Drupal\Core\Entity\EntityInterface $entity) {
// Count references to this entity in a custom table before they are removed
// upon entity deletion.
$id = $entity->id();
$type = $entity->getEntityTypeId();
$count = db_select('example_entity_data')
->condition('type', $type)
->condition('id', $id)
->countQuery()
->execute()
->fetchField();
// Log the count in a table that records this statistic for deleted entities.
db_merge('example_deleted_entity_statistics')
->key(array('type' => $type, 'id' => $id))
->fields(array('count' => $count))
->execute();
}
hook_entity_delete
function hook_entity_delete(Drupal\Core\Entity\EntityInterface $entity) {
// Delete the entity's entry from a fictional table of all entities.
db_delete('example_entity')
->condition('type', $entity->getEntityTypeId())
->condition('id', $entity->id())
->execute();
}
hook_ENTITY_TYPE_delete
function hook_ENTITY_TYPE_delete(Drupal\Core\Entity\EntityInterface $entity) {
// Delete the entity's entry from a fictional table of all entities.
db_delete('example_entity')
->condition('type', $entity->getEntityTypeId())
->condition('id', $entity->id())
->execute();
}
hook_entity_revision_delete
function hook_entity_revision_delete(Drupal\Core\Entity\EntityInterface $entity) {
$referenced_files_by_field = _editor_get_file_uuids_by_field($entity);
foreach ($referenced_files_by_field as $field => $uuids) {
_editor_delete_file_usage($uuids, $entity, 1);
}
}
hook_ENTITY_TYPE_revision_delete
function hook_ENTITY_TYPE_revision_delete(Drupal\Core\Entity\EntityInterface $entity) {
$referenced_files_by_field = _editor_get_file_uuids_by_field($entity);
foreach ($referenced_files_by_field as $field => $uuids) {
_editor_delete_file_usage($uuids, $entity, 1);
}
}
Edit entities
hook_entity_prepare_form
hook_ENTITY_TYPE_prepare_form
.
hook_entity_prepare_form
function hook_entity_prepare_form(\Drupal\Core\Entity\EntityInterface $entity, $operation, \Drupal\Core\Form\FormStateInterface $form_state) {
if ($operation == 'edit') {
$entity->label->value = 'Altered label';
$form_state->set('label_altered', TRUE);
}
}
hook_ENTITY_TYPE_prepare_form
function hook_ENTITY_TYPE_prepare_form(\Drupal\Core\Entity\EntityInterface $entity, $operation, \Drupal\Core\Form\FormStateInterface $form_state) {
if ($operation == 'edit') {
$entity->label->value = 'Altered label';
$form_state->set('label_altered', TRUE);
}
}
Interact with entity translations
hook_entity_translation_create
hook_ENTITY_TYPE_translation_create
.
hook_entity_translation_create
function hook_entity_translation_create(\Drupal\Core\Entity\EntityInterface $translation) {
\Drupal::logger('example')->info('Entity translation created: @label', ['@label' => $translation->label()]);
}
hook_ENTITY_TYPE_translation_create
function hook_ENTITY_TYPE_translation_create(\Drupal\Core\Entity\EntityInterface $translation) {
\Drupal::logger('example')->info('ENTITY_TYPE translation created: @label', ['@label' => $translation->label()]);
}
Inserthook_entity_translation_insert
hook_ENTITY_TYPE_translation_insert
.
hook_entity_translation_insert
function hook_entity_translation_insert(\Drupal\Core\Entity\EntityInterface $translation) {
$variables = array(
'@language' => $translation->language()->getName(),
'@label' => $translation->getUntranslated()->label(),
);
\Drupal::logger('example')->notice('The @language translation of @label has just been stored.', $variables);
}
hook_ENTITY_TYPE_translation_insert
function hook_ENTITY_TYPE_translation_insert(\Drupal\Core\Entity\EntityInterface $translation) {
$variables = array(
'@language' => $translation->language()->getName(),
'@label' => $translation->getUntranslated()->label(),
);
\Drupal::logger('example')->notice('The @language translation of @label has just been stored.', $variables);
}
Deletehook_entity_translation_delete
hook_ENTITY_TYPE_translation_delete
.
hook_entity_translation_delete
function hook_entity_translation_delete(\Drupal\Core\Entity\EntityInterface $translation) {
$variables = array(
'@language' => $translation->language()->getName(),
'@label' => $translation->label(),
);
\Drupal::logger('example')->notice('The @language translation of @label has just been deleted.', $variables);
}
hook_ENTITY_TYPE_translation_delete
function hook_ENTITY_TYPE_translation_delete(\Drupal\Core\Entity\EntityInterface $translation) {
$variables = array(
'@language' => $translation->language()->getName(),
'@label' => $translation->label(),
);
\Drupal::logger('example')->notice('The @language translation of @label has just been deleted.', $variables);
}
Control access to entities
hook_entity_access
hook_ENTITY_TYPE_access
.
hook_entity_access
function hook_entity_access(\Drupal\Core\Entity\EntityInterface $entity, $operation, \Drupal\Core\Session\AccountInterface $account) {
// No opinion.
return AccessResult::neutral();
}
hook_ENTITY_TYPE_access
function hook_ENTITY_TYPE_access(\Drupal\Core\Entity\EntityInterface $entity, $operation, \Drupal\Core\Session\AccountInterface $account) {
// No opinion.
return AccessResult::neutral();
}
Control access to entity creation
hook_entity_create_accesshook_ENTITY_TYPE_create_access
.
hook_entity_create_access
function hook_entity_create_access(\Drupal\Core\Session\AccountInterface $account, array $context, $entity_bundle) {
// No opinion.
return AccessResult::neutral();
}
hook_ENTITY_TYPE_create_access
function hook_ENTITY_TYPE_create_access(\Drupal\Core\Session\AccountInterface $account, array $context, $entity_bundle) {
// No opinion.
return AccessResult::neutral();
}