9.11.2. Ajouter, mettre à jour, supprimer une entité de manière programmatique
Travailler avec les entités dans Drupal est unifié et toutes les opérations CRUD sont également les mêmes pour toutes les entités. Dans cet article, nous allons découvrir comment travailler avec les entités dans du code personnalisé.
Commençons par des exemples simples.
Créer un nœud de manière programmatique
use \Drupal\node\Entity\Node;
$node = Node::create([
'type' => 'article',
'title' => 'Test Druplicon',
]);
$node->save();
Pour créer un nœud, vous devez ajouter tous les champs requis, par défaut il s'agit uniquement du champ Titre. Vous pouvez aussi accéder à l'objet nœud après sa création :
$node = Node::create([
'type' => 'article',
'title' => 'Test Druplicon',
]);
$node->field_text->value = 'Texte simple';
$node->save();
La méthode create() se trouve dans la classe Node.php, si un type d'entité possède sa propre méthode create(), il est préférable de l'utiliser. Bien qu'il existe des façons universelles de créer une 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();
Enfin, en utilisant la méthode save(), nous sauvegardons l'entité.
Mettre à jour un nœud (entité) de manière programmatique
$nid = 234;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
$node->title = 'Nouveau titre';
$node->field_text = 'texte';
$node->save();
Nous avons détaillé l'édition des champs d'entité dans un article précédent :
http://drupalbook.org/drupal/9111-work-entity-fields-programmatically
Supprimer un nœud (entité) de manière programmatique
Si vous souhaitez supprimer un nœud, cela peut se faire en utilisant la méthode delete() :
$nid = 123;
$node = node_load($nid);
$node->delete();
Créer plusieurs nœuds (entités) de manière programmatique
Lorsque vous devez charger plusieurs nœuds, il serait coûteux de le faire un par un, car chaque nœud possède des champs et pour charger les données depuis la base de données, il faudra exécuter de nombreuses requêtes SQL. Il est beaucoup plus rapide de charger tous les nœuds en une seule fois :
$nids = db_select('node_field_data', 'n')
->fields('n', ['nid'])
->condition('title', $my_title)
// Le tag node_access vérifie les droits d'accès.
->addTag('node_access')
->execute()
->fetchCol();
$nodes = Node::loadMultiple($nids);
Supprimer plusieurs nœuds (entités) de manière programmatique
$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);