Perché entity_metadata_wrapper-> save () non aggiorna la revisione del nodo?


8

Sto sviluppando un modulo per aggiornare i nodi (abilitare la revisione). Sembra così

 $nodes = node_load_multiple(array(), array('type' => $bundleType));
 foreach ($ndoes as $node){
    $w = entity_metadata_wrapper('node',$node);
    $w->MyFields->set($someValue);
    $w->save();
 }

Ha impostato correttamente i campi ma l'ID di revisione del nodo non è cambiato dopo $w->save().

Come posso aggiornare l'ID revisione?


Il create new revisionflag è impostato sul nodo per il tipo di contenuto? Hai provato come $w->revision->set(1);prima di salvare? ....
Tenken

Sì, "crea nuova revisione" è attivo. Non ne so molto $w->revision->set(1), è un modo manuale per far sapere al drupal che il nodo è stato aggiornato? Lo proverò.
Zhuchun,

hmm, $w->revision->set()funziona. Sembra che fraintenda $w->save(). Ho pensato che dovrebbe aumentare automaticamente l'ID di revisione durante il salvataggio. Esiste un modo per ottenere il prossimo ID revisione aumento? Grazie
zhuchun,

no, revision->set(1)dice al nodo di registrare una nuova revisione sulla modifica imminente / corrente del nodo. Non sono sicuro del motivo per cui il wrapper dei metadati non vede l'impostazione globale di creare una nuova revisione ..... ma l'impostazione del flag di revisione è una soluzione molto semplice come hai visto ora. Mi viene fornito il mio commento come una risposta di seguito se ti interessa votarlo per aiutare altri utenti in futuro a trovare una risposta corretta.
Tenken

Risposte:


6

Il nuovo flag di revisione di creazione è impostato sul nodo per il tipo di contenuto? Hai provato come $ w-> revision-> set (1); prima di salvare? ....

MODIFICARE:

L'autore afferma che l'impostazione $w->revision->set(1)risolve il suo problema.


È una soluzione semplice! Solo non capisco perché è necessario lol. Grazie!
Zhuchun,

10

Quando si modifica un nodo tramite l'interfaccia utente, viene eseguito tramite node_form(). Questo ha una chiamata vicino all'inizio node_object_prepare(), che imposta i valori predefiniti per quel nodo. Ciò include l'impostazione del valore predefinito di $node->revision, utilizzato da node_save()per determinare se è necessaria o meno una nuova revisione.

L'API Entity è a conoscenza della revisione, ma node_object_prepare()è una cosa specifica del nodo. Ciò significa che è necessario gestire i valori da soli, inclusa l'impostazione della proprietà di revisione per imitare ciò che farà il modulo di modifica del nodo.


7

Nessuna di queste risposte è in realtà corretta, farlo ->set(1)sembra farti cambiare il numero di revisione e quindi dovrebbe incrementarlo.

Questa è in realtà solo una bandiera booleana, quindi la risposta corretta è $node->revision->set(true);

Come dice zhuchun: non capisce perché sia ​​necessario, quando spiegato come una bandiera booleana ha perfettamente senso piuttosto che il numero.


C'è stato un tempo in cui la creazione di nuovi contenuti drupal ha comportato più facilmente la chiamata drupal_submit_formad esempio. Se si ispezionano i valori POST per un modulo di invio nodo, verranno visualizzati elementi come revision = 1nei campi POST perché la create new revisioncasella degli elementi del modulo è stata selezionata. Poiché 1 == TRUEil codice funziona in entrambi i modi. Ma il tuo punto è valido.
Tenken,

questa dovrebbe essere una risposta accettata
Alex Skrypnyk,


0

Se il tipo di nodo non ha le revisioni abilitate per impostazione predefinita, il modo più breve per richiedere una nuova revisione è:

$w->revision = TRUE;

che è esattamente lo stesso che usare:

$w->revision->set(TRUE);

ma con meno digitazione richiesta.

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.