Aggiornamento a livello di codice di un campo


14

Voglio aggiornare il valore di un campo nodo quando un nodo viene aggiornato.

Provato usando il codice menzionato qui Aggiornando programmaticamente un nodo 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();
      }
    }

ma non ha funzionato. Ottengo un errore 500 dopo aver salvato il nodo. Ho anche provato a eliminare l'istruzione if e a specificare un ID nodo$node = Node::load(1);

Ho anche provato a utilizzare Aggiorna un nodo / Entità a livello di codice in 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();

}

ma neanche fortuna.

Inoltre, ho provato a utilizzare diversi hook entity_presave, entity_update, node_update, ma non ho fatto alcuna differenza.

Risposte:


25

Puoi provare questo codice:

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

Grazie, ha funzionato, se qualcun altro vuole aggiungere altre possibili varianti, sentiti libero di aggiungere un'altra risposta.
No Sssweat,

1
@NoSssweat: ho ragione nel ritenere che la linea con "body" nel codice mostrato in questa risposta non sia realmente necessaria per rispondere alla tua domanda? E che questa linea illustra piuttosto come puoi fare cose simili con (ad esempio) il corpo? Inoltre, poiché la tua domanda riguardava un "campo", potresti usare una linea simile come la linea con "corpo" per un campo personalizzato, con il nome della macchina (diciamo) field_my_extra_field? Ci scusiamo per quello che sembra dirottare una risposta per porre nuove domande, ma anche solo "mostrare il codice" in una risposta (senza alcuna spiegazione) non è percepito come una buona pratica da queste parti, giusto?
Pierre.Vriens,

1
@ Pierre.Vriens Ho usato il titolo nella mia Q per semplicità. Ho pensato che se avessi saputo cambiare il titolo, sarebbe stato lo stesso per qualsiasi campo, basta cambiare il nome della macchina. Si scopre che questa risposta utilizza un metodo specifico per modificare il titolo, che non funzionerebbe per nessun altro campo, quindi è davvero importante che mostri il metodo per il corpo.
No Sssweat,

Non riesco a far sparare questo amo. Modifico un tipo di contenuto, faccio clic su Invia, ma niente.
Sig. Pablo,

7

Questa è un'altra variante dell'utilizzo dell'hook che originariamente si è tentato di utilizzare.

Penso che il problema con il tuo codice sia che provi a caricare una nuova istanza del nodo, ma dovresti usare il nodo fornito come parametro $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)
  }
}

Modificare:

Aggiunta l'istruzione use al codice.


1
ho appena provato il tuo codice, ma sta rompendo il sito, ottenendo il classicoThe website encountered an unexpected error. Please try again later.
No Sssweat

1
Questo codice serve solo a dimostrare come utilizzare l'hook. Hai bisogno delle giuste dichiarazioni d'uso. Puoi scoprirlo, se guardi nel watchdog (/ admin / reports / dblog).
4k4,

1
l'aggiunta di use Drupal\node\NodeInterface;codice non interrompe più automaticamente il sito, ma dopo aver salvato il nodo, ricevo l'errore 500 come se stessi ricevendo la mia domanda e i registri non registrano nulla al riguardo.
No Sssweat,

1
Volevo solo indicare il problema: non caricare una nuova istanza del nodo, ma utilizzare quella fornita come parametro della funzione. Quale errore è dietro 500? Controllare i file di registro o attivare la registrazione degli errori.
4k4,

1
Cancella il registro, quindi non mi confondo con tutti gli altri errori precedenti, ma dopo aver salvato e ricevuto l'errore più volte i file di registro sono vuoti
No Sssweat

3

I titoli in Drupal 8 non sono impostati come campi standard; hanno la loro funzione. Utilizzare $node->setTitle('New Title');per un nodo o $entity->setLabel('New Title');per un'entità generica. Vedi Nodo :: setTitle per maggiori informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.