Pourquoi entity_metadata_wrapper-> save () ne met pas à jour la révision du nœud?

8

Je développe un module pour mettre à jour les nœuds (activer la révision). Cela ressemble à ceci.

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

Il a correctement défini les champs mais l'ID de révision du nœud n'a pas changé après $w->save().

Comment puis-je mettre à jour l'ID de révision?

zhuchun
la source
L' create new revisionindicateur est-il défini sur le nœud pour le type de contenu? Avez-vous essayé comme $w->revision->set(1);avant de sauvegarder? ....
tenken
Oui, "créer une nouvelle révision" est activé. Je ne sais pas grand-chose $w->revision->set(1), est-ce une façon manuelle de laisser le drupal savoir que le nœud a été mis à jour? Je vais essayer.
zhuchun
hmm, ça $w->revision->set()marche. Il semble que je me méprenne $w->save(). Je pensais que cela devrait augmenter automatiquement le numéro de révision lors de l'enregistrement. Existe-t-il de toute façon une nouvelle augmentation de l'ID de révision? Merci
zhuchun
non, revision->set(1)indique au nœud d'enregistrer une nouvelle révision lors de la modification à venir / en cours du nœud. Je ne sais pas pourquoi l'encapsuleur de métadonnées ne voit pas le paramètre global de créer une nouvelle révision ..... mais définir l'indicateur de révision est une solution de contournement très simple comme vous l'avez maintenant vu. Je reçois mon commentaire comme réponse ci-dessous si vous souhaitez voter pour aider d'autres utilisateurs à l'avenir à trouver une réponse correcte.
tenken

Réponses:

6

L'indicateur de création de révision est-il défini sur le nœud pour le type de contenu? Avez-vous essayé comme $ w-> revision-> set (1); avant de sauvegarder? ....

ÉDITER:

L'auteur dit que le réglage $w->revision->set(1)résout son problème.

tenken
la source
C'est une solution de contournement facile! Je ne comprends pas pourquoi c'est nécessaire lol. Je vous remercie!
zhuchun
10

Lorsque vous modifiez un nœud via l'interface utilisateur, cela se fait via node_form(). Cela a un appel vers le haut de node_object_prepare(), qui définit les valeurs par défaut pour ce nœud. Cela inclut la définition de la valeur par défaut de $node->revision, qui est utilisée par node_save()pour déterminer si une nouvelle révision est nécessaire ou non.

L'API d'entité est compatible avec les révisions, mais elle node_object_prepare()est spécifique au nœud. Cela signifie que vous devez gérer les valeurs vous-même, notamment en définissant la propriété de révision pour imiter ce que fera le formulaire de modification de nœud.

mpdonadio
la source
7

Aucune de ces réponses n'est en fait correcte, cela ->set(1)donne l'impression que vous changez réellement le numéro de révision et devrait donc l'incrémenter.

Ceci est en fait juste un drapeau booléen donc la bonne réponse est $node->revision->set(true);

Comme le dit zhuchun: il ne comprend pas pourquoi cela est nécessaire, lorsqu'il est expliqué comme un drapeau booléen, il est parfaitement logique plutôt que le nombre.

Gav_
la source
Il fut un temps où la création de nouveau contenu drupal impliquait le plus facilement d'appeler drupal_submit_formpar exemple. Si vous inspectez les valeurs POST pour un formulaire de soumission de noeud, vous verrez des choses comme revision = 1dans les champs POST car la create new revisioncase des éléments du formulaire a été cochée. Puisque 1 == TRUEle code fonctionne de toute façon. Mais, votre point est valable.
tenken
cette réponse devrait être acceptée
Alex Skrypnyk
0

Si le type de nœud n'a pas de révisions activées par défaut, la façon la plus succincte de demander une nouvelle révision est:

$w->revision = TRUE;

ce qui revient exactement à utiliser:

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

mais avec moins de frappe nécessaire.

Fonant
la source