Je sais que je peux mettre à jour (ou définir une valeur pour) un champ de référence d'entité dans Drupal 7 avec un code similaire au suivant).
$node['field_code_used_by'][LANGUAGE_NONE][0]['target_id'] = $id;
Je veux définir par programme une valeur pour mon champ de référence d'entité utilisateur dans Drupal 8.
J'ai essayé avec $node->field_code_used_by->setValue(1);
et $node->field_code_used_by->entity->value = 1;
Mais aucun d'eux n'a fonctionné.
Comment puis-je définir la valeur d'un champ de référence d'entité?
Vous devez utiliser un code similaire au suivant.
$node = Node::load($nid);
$node->field_code_used_by->target_id = $user_id;
$node->save();
Pour un champ à plusieurs valeurs, pour ajouter la valeur à la fin de la liste, utilisez le code suivant.
$node->field_code_used_by[] = ['target_id' => $user_id];
Une autre façon consiste à définir la propriété entity
avec l'objet entité, comme dans le code suivant.
$node = Node::load($nid);
$user = \Drupal\user\Entity\User::load(1);
$node->field_code_used_by->entity = $user;
$node->save();
Comme dans D7, la propriété principale d'un champ de référence dans D8 est toujours le target id
:
$node->field_code_used_by->target_id = $user_id;
La propriété entity
est une valeur calculée. Si vous placez un objet dans cette valeur, drupal le reconvertira en id avant de l'enregistrer dans la base de données.
champs à valeurs multiples
Ajoutez un élément à un champ à valeurs multiples:
$node->field_code_used_by[] = ['target_id' => $user_id];
La propriété target_id
n'est pas nécessaire, car il s'agit de la propriété principale et utilisé par défaut. Donc, pour la plupart des champs, vous pouvez ajouter une valeur comme dans un simple tableau php, qui est facile à retenir:
$node->field_code_used_by[] = $user_id;
Vous devez être conscient de la différence entre un champ à valeur unique et un champ à valeurs multiples. Le code ci-dessous montre comment. Source: https://stefvanlooveren.me/blog/how-programmatically-update-entity-reference-field-drupal-8
$imageIds = [
'3',
'32',
'50'
];
foreach($imageIds as $index => $fid) {
if($index == 0) {
$node->set('field_article_images', $fid);
} else {
$node->get('field_article_images')->appendItem([
'target_id' => $fid,
]);
}
}