logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri
16/10/2025, by Ivan

Menu

Negli articoli precedenti abbiamo già incontrato gli hook. In questo articolo analizzeremo più da vicino gli hook che aiutano a lavorare con le entità.

In questo articolo puoi leggere in generale cosa sono gli hook e perché sono necessari:

http://drupalbook.org/drupal/92-what-hook-drupal-8

Utilizzeremo gli hook per aggiungere il nostro codice personalizzato che verrà eseguito in determinati eventi relativi alle entità: aggiunta, eliminazione, aggiornamento.

Puoi consultare tutti gli hook di Drupal in questa pagina:

https://api.drupal.org/api/drupal/core!core.api.php/group/hooks/8.2.x

Tratteremo solo una parte di essi, quelli che si incontrano più frequentemente nei moduli personalizzati che lavorano con i contenuti.

Ho caricato tutto il codice su GitHub nel modulo drupalbook_examples, puoi scaricare il modulo e aggiungerlo al tuo sito:

https://github.com/levmyshkin/drupalbook8

hook_entity_presave()

https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!entity.api.php/function/hook_entity_presave/8.6.x

/**
 * Implementa hook_entity_presave().
 */
function drupalbook_examples_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'article') {
    $entity->title->value = $entity->title->value . ' by ' . date('d-m-Y');
  }
}

hook_entity_presave() viene eseguito ogni volta che un’entità viene salvata.

Non è necessario chiamare $entity->save() all’interno dell’hook, poiché l’oggetto entità viene modificato prima del salvataggio. In questo esempio aggiungiamo al titolo dell’articolo la data corrente di salvataggio. Se aggiorniamo l’articolo il giorno successivo, la nuova data verrà aggiunta di nuovo. Se non rimuoviamo la data prima del salvataggio, il titolo continuerà a crescere con ogni salvataggio. Di solito, questo hook viene usato per controllare la presenza di determinati valori nei campi o per inviare notifiche via email riguardo alle modifiche.

Nota che controlliamo prima il tipo di entità, poiché hook_entity_presave() funziona per tutte le entità: contenuti, blocchi, commenti, termini di tassonomia. Inoltre, verifichiamo il bundle specifico del nodo.

hook_entity_insert()

https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!entity.api.php/function/hook_entity_insert/8.6.x

/**
 * Implementa hook_entity_insert().
 */
function drupalbook_examples_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'page') {
    $node = Node::create([
      'type'  => 'article',
      'title' => 'Nuova pagina creata: ' . $entity->title->value,
    ]);
    $node->save();
  }
}

hook_entity_insert() viene chiamato quando viene aggiunta una nuova entità. Ad esempio, quando si crea una nuova pagina, verrà creata anche un’articolo. Se hai già definito il precedente hook, verrà aggiunta anche la data al titolo dell’articolo creato.

È importante notare la differenza tra hook_entity_insert() e hook_entity_presave(): il primo si attiva solo una volta, quando l’entità viene creata, e non modifica i valori dei campi. Quindi, se incolli il codice del primo hook nel secondo, non funzionerà:

/**
 * Implementa hook_entity_insert().
 */
function drupalbook_examples_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'article') {
    $entity->title->value = $entity->title->value . ' by ' . date('d-m-Y');
  }
}

Naturalmente, potresti forzare il salvataggio del nodo:

function your_module_entity_insert(Drupal\Core\Entity\EntityInterface $entity){
  if ($entity->getType() == 'article') {
    drupal_register_shutdown_function('_your_module_post_insert', $entity);
  }
}
 
function _your_module_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity) {
      $entity->save();
  }
}

Ma è meglio non farlo: utilizza hook_entity_presave() per modificare l’entità stessa durante il salvataggio e hook_entity_insert() per modificare altre entità o eseguire azioni secondarie.

hook_entity_update()

https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!entity.api.php/function/hook_entity_update/8.2.x

/**
 * Implementa hook_entity_update().
 */
function drupalbook_examples_entity_update(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'page') {
    \Drupal::messenger()->addMessage('La pagina è stata modificata: ' . $entity->title->value);
  }
}

hook_entity_update() viene eseguito ogni volta che un’entità viene aggiornata. Non è consigliabile modificare i campi dell’oggetto $entity in questo hook. Come hook_entity_insert(), serve per eseguire azioni come logging, invio di notifiche o altre operazioni non legate ai dati stessi. Inoltre, evita di chiamare $entity->save() per non causare cicli infiniti di aggiornamento.

hook_entity_delete()

https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!entity.api.php/function/hook_entity_delete/8.6.x

Un altro hook utile per registrare o eseguire azioni dopo l’eliminazione di un’entità.

hook_entity_access()

https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!entity.api.php/function/hook_entity_access/8.2.x

<?php

use Drupal\Core\Access\AccessResult;
 
/**
 * Implementa hook_entity_access().
 */
function drupalbook_examples_entity_access(\Drupal\Core\Entity\EntityInterface $entity, $operation, \Drupal\Core\Session\AccountInterface $account) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'article' && $operation == 'view' && in_array('administrator', $account->getRoles())) {
    AccessResult::forbidden();
  }
}
?>

In questo esempio, blocchiamo l’accesso agli articoli per tutti gli utenti che non hanno il ruolo di amministratore. Se ti bastano i permessi standard per gestire l’accesso ai contenuti, è meglio usare le impostazioni di autorizzazione. hook_entity_access() serve per creare regole di accesso più complesse, ad esempio in base a orari, punti utente, livelli di karma o altre condizioni.

Tuttavia, l’uso improprio di questo hook per riscrivere i permessi standard può creare confusione in altri sviluppatori che lavoreranno sul progetto. Questo è il principale svantaggio degli hook: la loro esecuzione non è sempre evidente. Se non conosci l’esistenza di un modulo che implementa certi hook, potresti non capire perché, ad esempio, il titolo di un articolo cambia al salvataggio. Per questo motivo, quando riscontri un comportamento simile, è utile cercare nel progetto tutti i riferimenti a entity_presave o entity_update.

Abbiamo analizzato solo alcuni hook, ma ora dovresti avere una buona idea di dove e come utilizzarli. Più lavori con Drupal, più spesso ti capiterà di scrivere codice personalizzato. Se uno di questi hook ti sembra il punto giusto per aggiungere codice, puoi tranquillamente implementarlo nel tuo modulo personalizzato.