9.11.1. Travailler avec les champs d’entité de manière programmatique
Récupérer les valeurs des champs dans les entités est assez simple, mais il existe plusieurs façons de le faire. Voyons comment travailler au mieux avec les valeurs des champs dans du code personnalisé. Vous pouvez toujours consulter les informations les plus récentes sur le travail avec les champs sur le site officiel :
https://www.drupal.org/docs/8/api/entity-api/working-with-the-entity-api
Dans cet article, nous examinerons des exemples de travail avec les valeurs.
Vous n'avez pas besoin de retenir comment fonctionnent certains champs, vous pouvez toujours revenir à cette page pour vous en souvenir. Avec le temps, vous vous référerez de plus en plus à la documentation et vous réaliserez à quel point il est facile de travailler avec les champs dans Drupal. En attendant, vous pouvez mettre cette page en favori pour toujours avoir un pense-bête à portée de main.
Travailler avec les nœuds
Charger un nœud par son nid :
$nid = 234;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
Obtenir l'identifiant du nœud :
$node->id();
Obtenir le bundle du nœud/entité :
$node->bundle();
$entity->getType();
Obtenir les valeurs des champs :
$node->get('title')->value;
$node->get('created')->value;
$node->get('body')->value;
$node->get('body')->summary;
$node->get('field_foo')->value;
$node->get('field_image')->target_id;
Vous pouvez également utiliser une notation courte pour obtenir les valeurs :
$node->title->value;
$node->created->value;
$node->body->value;
$node->body->summary;
$node->field_foo->value;
$node->field_image->target_id;
Chargement de nœuds spécifiques par valeur de champ :
$query = \Drupal::entityQuery('node')
->condition('type', 'article'),
->condition('field_terms', 42);
$nids = $query->execute();
$nodes = $node_storage->loadMultiple($nids);
foreach ($nodes as $node) {
print $node->title->value;
$node->set('title', "Nouveau titre pour le nœud");
$node->save();
}
Modifier les valeurs dans les champs :
$node->set('title', "Nouveau titre");
$node->set('body', array(
'summary' => "Accroche",
'value' => "Texte long",
'format' => 'basic_html',
));
$node->save();
Aussi, pour les champs à valeur unique, vous pouvez utiliser une notation courte :
$node->title = 'Nouveau titre';
$node->field_text = 'texte';
Récupérer les valeurs de plusieurs champs :
$nids = \Drupal::entityQuery('node')->condition('type', 'album')->execute();
$nodes = Node::loadMultiple($nids);
$data = array();
foreach($nodes as $node) {
$photo = array();
foreach($node->get('field_image')->getValue() as $file){
$fid = $file['target_id']; // obtenir le fid du fichier;
$photo[] = \Drupal\file\Entity\File::load($fid)->getFileUri();
}
$data[] = array(
'album_name' => $node->get('field_album_name')->getValue(),
'place' => $node->get('field_place')->getValue(),
'author' => $node->get('field_author')->getValue(),
'photo' => $photo,
);
}
Travailler avec les champs de fichiers
Les fichiers sont ajoutés aux autres entités via des champs de référence, et lorsque nous accédons à ces champs, nous pouvons obtenir l’identifiant du fichier puis récupérer les informations du fichier à partir de cet identifiant.
Obtenir un fichier par son ID :
$fid = 42;
$file_storage = \Drupal::entityTypeManager()->getStorage('file');
$file = $file_storage->load($fid);
Obtenir l’objet fichier depuis le champ du nœud :
$file = $node->field_image->entity;
Obtenir certains champs d’un objet fichier :
$file->getFileUri(); // "public://file123.jpg"
// Vous pouvez transformer en URL de fichier depuis l’URI : file_url_transform_relative(file_create_url($file->getFileUri()));
// "/sites/default/files/public/file123.jpg"
$file->filename->value; // "file123.jpg"
$file->filemime->value; // "image/jpeg"
$file->filesize->value; // 63518 (taille en octets)
$file->created->value; // 1511206249 (timestamp Unix)
$file->changed->value; // 1511234256 (timestamp Unix)
$file->id();
Vous pouvez consulter les valeurs des propriétés de fichiers disponibles depuis la table file_managed comme suit :
echo $file->uid->target_id; // 1
echo $file->uid->value; // Cela ne fonctionne pas ! Utilisez target_id.
echo $file->uid->entity->name->value;
echo $file->uid->entity->timezone->value; // "Asia/Omsk"
Travailler avec les champs de référence d’entité
Vous pouvez obtenir plusieurs valeurs depuis les champs de référence et les traiter avec foreach :
foreach ($node->field_my_entity_reference as $reference) {
print $reference->target_id;
print $reference->entity->title->value;
}
Modifier un champ de référence d’entité multiple :
$nids = [3,4,5,6];
$node->set('field_my_entity_reference', $nids);
$node->save();
Ajouter de nouvelles valeurs au champ de référence d’entité aux valeurs existantes :
$nids = [3,4,5,6]; // valeur d’exemple
foreach ($nids as $nid) {
$node->field_my_entity_reference[] = [
'target_id' => $nid
];
}
$node->save();
Travailler avec les paragraphes
$my_paragraph = null;
foreach ($node->get('field_paragraph_reference') as $paragraph) {
if ($paragraph->entity->getType() == 'your_paragraph_type') {
$my_paragraph = $paragraph->entity;
}
}
if (!empty($my_paragraph)) {
print $my_paragraph->field_somefield->value;
print $my_paragraph->title->value; // Cela ne fonctionne pas !
}
else {
print "Le nœud ne contient pas ce type de paragraphe.";
}
Obtenir le type de paragraphe :
$my_paragraph->getType();
Nous utiliserons ces exemples à l’avenir pour écrire des modules personnalisés travaillant avec les hooks et les objets entité.