Mettre à jour par programme la valeur d'un champ

14

Je souhaite mettre à jour la valeur d'un champ de nœud lorsqu'un nœud est mis à jour.

Testé en utilisant le code mentionné ici Mise à jour par programme d'un nœud Drupal 8

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

Mais cela n'a pas fonctionné. J'obtiens une erreur 500 après avoir enregistré le nœud. J'ai également essayé de retirer l'instruction if et de spécifier un identifiant de nœud$node = Node::load(1);

J'ai également essayé d'utiliser la mise à jour d'un nœud / entité par programme dans Drupal 8

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

mais pas de chance non plus.

De plus, j'ai essayé d'utiliser différents hooks entity_presave, entity_update, node_update, mais cela n'a fait aucune différence.

Pas de sueur
la source

Réponses:

25

Vous pouvez essayer ce code:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}
MrD
la source
Merci, cela a fonctionné, si quelqu'un d'autre souhaite ajouter d'autres variantes possibles, n'hésitez pas à ajouter une autre réponse.
Pas de Sssweat
1
@NoSssweat: ai-je raison de supposer que la ligne avec "body" dans le code affiché dans cette réponse n'est pas vraiment nécessaire pour répondre à votre question? Et que cette ligne illustre plutôt comment vous pouvez faire des choses similaires avec (par exemple) le corps? De plus, puisque votre question concernait un "champ", pourriez-vous utiliser une ligne similaire à la ligne avec "corps" pour un champ personnalisé, avec le nom de la machine (par exemple) field_my_extra_field? Désolé pour ce qui peut sembler détourner une réponse pour poser de nouvelles questions, mais simplement "afficher le code" dans une réponse (sans aucune explication) n'est pas perçu comme une bonne pratique ici non plus, non?
Pierre.Vriens
1
@ Pierre.Vriens J'ai utilisé le titre dans mon Q pour plus de simplicité. J'ai pensé que si je savais comment changer le titre, ce serait la même chose pour n'importe quel champ, il suffit de changer le nom de la machine. Il s'avère que cette réponse utilise une méthode spécifique pour changer le titre, ce qui ne fonctionnerait pour aucun autre champ, il est donc important qu'il montre la méthode pour le corps.
Pas de Sssweat
Je ne peux pas tirer ce crochet. Je modifie un type de contenu, cliquez sur soumettre, mais rien.
M. Pablo
7

Il s'agit d'une autre variante de l'utilisation du crochet que vous avez essayé d'utiliser à l'origine.

Je pense que le problème avec votre code est que vous essayez de charger une nouvelle instance du nœud, mais vous devez utiliser le nœud fourni comme paramètre $entity:

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

Éditer:

Ajout de l'instruction use au code.

4k4
la source
1
vient d'essayer votre code, mais il brise le site, obtenant le classiqueThe website encountered an unexpected error. Please try again later.
No Sssweat
1
Ce code sert uniquement à montrer comment utiliser le crochet. Vous avez besoin des bonnes déclarations d'utilisation. Vous pouvez le découvrir, si vous regardez dans watchdog (/ admin / reports / dblog).
4k4
1
l'ajout de use Drupal\node\NodeInterface;code n'interrompt plus automatiquement le site, mais après avoir enregistré le nœud, j'obtiens l'erreur 500 comme si je recevais ma question et les journaux n'enregistrent rien à ce sujet.
Pas de Sssweat
1
Je voulais seulement signaler le problème: ne chargez pas une nouvelle instance du nœud, mais utilisez celle fournie comme paramètre de fonction. Quelle erreur se cache derrière 500? Veuillez vérifier vos fichiers journaux ou activer la journalisation des erreurs.
4k4
1
J'efface le journal, donc je ne suis pas confondu avec toutes les autres erreurs précédentes, mais après avoir enregistré et obtenu l'erreur plusieurs fois, les fichiers journaux sont vides
No Sssweat
3

Les titres dans Drupal 8 ne sont pas définis comme des champs standard; ils ont leur propre fonction. À utiliser $node->setTitle('New Title');pour un nœud ou $entity->setLabel('New Title');pour une entité générique. Voir Node :: setTitle pour plus d'informations.

Tom Bisciglia
la source