web-dev-qa-db-fra.com

Mettre à jour par programme la valeur d'un champ

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

Essayé 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 noeud $node = Node::load(1);

J'ai également essayé d'utiliser Mettre à jour 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.

15
No Sssweat

Vous pouvez essayer ce code:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}
26
MrD

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)
  }
}

Modifier:

Ajout de l'instruction use au code.

7
4k4

Les titres dans Drupal 8 ne sont pas définis comme des champs standard; ils ont leur propre fonction. Utilisez $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.

3
Tom Bisciglia