¿Por qué entity_metadata_wrapper-> save () no actualiza la revisión del nodo?

8

Estoy desarrollando un módulo para actualizar nodos (habilitar revisión). Se parece a esto.

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

Estableció los campos correctamente, pero la revisión-id del nodo no cambió después $w->save().

¿Cómo puedo actualizar la ID de revisión?

zhuchun
fuente
¿Está la create new revisionbandera establecida en el nodo para el tipo de contenido? ¿Has probado como $w->revision->set(1);antes de guardar? ....
tenken
Sí, "crear nueva revisión" está activado. No sé mucho sobre $w->revision->set(1), ¿es esa una forma manual de informar al drupal que el nodo se ha actualizado? Voy a probarlo.
zhuchun
hmm, $w->revision->set()funciona. Parece que no lo entiendo $w->save(). Pensé que debería aumentar la revisión-id automáticamente al guardar. ¿Hay alguna forma de obtener el próximo ID de revisión de aumento? Gracias
zhuchun
no, revision->set(1)le dice al nodo que registre una nueva revisión en la edición próxima / actual del nodo. No estoy seguro de por qué el contenedor de metadatos no está viendo la configuración global de crear una nueva revisión ... pero configurar la marca de revisión es una solución muy simple como ya has visto. A continuación, recibo mi comentario como respuesta si desea votar a favor para ayudar a otros usuarios en el futuro a encontrar una respuesta correcta.
tenken

Respuestas:

6

¿Está el indicador de crear nueva revisión establecido en el nodo para el tipo de contenido? ¿Has probado como $ w-> revision-> set (1); antes de guardar? ....

EDITAR:

El autor dice que la configuración $w->revision->set(1)resuelve su problema.

Tenken
fuente
¡Es una solución fácil! Simplemente no entiendo por qué es necesario jajaja. ¡Gracias!
zhuchun
10

Cuando edita un nodo a través de la interfaz de usuario, se realiza a través de node_form(). Esto tiene una llamada cerca de la parte superior node_object_prepare(), que configura los valores predeterminados para ese nodo. Esto incluye establecer el valor predeterminado de $node->revision, que se utiliza node_save()para determinar si se necesita una nueva revisión o no.

La API de entidad es consciente de la revisión, pero node_object_prepare()es una cosa específica de nodo. Esto significa que debe administrar los valores usted mismo, incluida la configuración de la propiedad de revisión para imitar lo que hará el formulario de edición de nodos.

mpdonadio
fuente
7

Ninguna de estas respuestas es realmente correcta, hacerlo ->set(1)suena como si realmente estuviera cambiando el número de revisión y, por lo tanto, debería aumentarlo.

En realidad, esto es solo una bandera booleana, por lo que la respuesta correcta es $node->revision->set(true);

Como dice zhuchun: no entiende por qué es necesario, cuando se explica como una bandera booleana tiene mucho sentido en lugar del número.

Gav_
fuente
Hubo un momento en que la creación de nuevo contenido de drupal involucraba la llamada más fácil, drupal_submit_formpor ejemplo. Si inspecciona los valores POST para un formulario de envío de nodo, verá cosas como revision = 1en los campos POST porque create new revisionse marcó el cuadro de elementos del formulario . Dado que 1 == TRUEel código funciona en ambos sentidos. Pero, tu punto es válido.
tenken
esto debería ser aceptado respuesta
Alex Skrypnyk
0

Si el tipo de nodo no tiene las revisiones habilitadas por defecto, la forma más sucinta de solicitar una nueva revisión es:

$w->revision = TRUE;

que es exactamente lo mismo que usar:

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

pero con menos tipeo requerido.

Fonante
fuente