9.11.2. Aggiungere, aggiornare ed eliminare un’entità tramite programmazione
Il lavoro con le entità in Drupal è unificato e tutte le operazioni CRUD (Create, Read, Update, Delete) sono le stesse per ogni tipo di entità. In questo articolo vedremo come lavorare con le entità nel codice personalizzato.
Iniziamo con esempi semplici.
Creare un nodo tramite programmazione
use \Drupal\node\Entity\Node;
$node = Node::create([
'type' => 'article',
'title' => 'Druplicon test',
]);
$node->save();
Per creare un nodo, è necessario aggiungere tutti i campi obbligatori; per impostazione predefinita è richiesto solo il campo Title. È inoltre possibile accedere all’oggetto nodo dopo la sua creazione:
$node = Node::create([
'type' => 'article',
'title' => 'Druplicon test',
]);
$node->field_text->value = 'Testo semplice';
$node->save();
Il metodo create()
si trova nella classe Node.php. Se un tipo di entità dispone di un proprio metodo create()
, è preferibile utilizzare quello. Tuttavia, esistono anche modi universali per creare un’entità.
$node_entity_type = \Drupal::entityTypeManager()->getDefinition('node');
$node = new Node([
$node_entity_type->getKey('bundle') => 'movie',
$node_entity_type->getKey('label') => 'Foo',
'field_release_date' => '1/1/2015',
]);
$node->save();
Alla fine, utilizzando il metodo save()
, salviamo l’entità.
Aggiornare un nodo (entità) tramite programmazione
$nid = 234;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
$node->title = 'Nuovo titolo';
$node->field_text = 'testo';
$node->save();
Abbiamo trattato in dettaglio la modifica dei campi di un’entità nell’articolo precedente:
http://drupalbook.org/drupal/9111-work-entity-fields-programmatically
Eliminare un nodo (entità) tramite programmazione
Se vuoi eliminare un singolo nodo, puoi farlo utilizzando il metodo delete()
:
$nid = 123;
$node = node_load($nid);
$node->delete();
Creare più nodi (entità) tramite programmazione
Quando devi caricare molti nodi, farlo uno per uno può risultare dispendioso, poiché ogni nodo ha campi che richiedono molte query SQL per essere caricati dal database. È molto più veloce caricare tutti i nodi in un’unica operazione:
$nids = db_select('node_field_data', 'n')
->fields('n', ['nid'])
->condition('title', $my_title)
// Il tag node_access controllerà i permessi di accesso.
->addTag('node_access')
->execute()
->fetchCol();
$nodes = Node::loadMultiple($nids);
Eliminare più nodi (entità) tramite programmazione
$result = \Drupal::entityQuery("node")
->condition('created', strtotime('-30 days'), '=')
->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);