Simplemente desactive la ID de nodo con unset($node->nid), y node_save () creará un nuevo nodo.
El código ejecutado desde node_save()es el siguiente:
// Insert a new node.
$node->is_new = empty($node->nid);// ...if($node->is_new){
_node_save_revision($node, $user->uid);
drupal_write_record('node', $node);
db_query('UPDATE {node_revisions} SET nid = %d WHERE vid = %d', $node->nid, $node->vid);
$op ='insert';}
El último argumento de drupal_write_record () no se pasa; Esto significa que la función no actualizará una fila de base de datos existente.
Una vez que el objeto de nodo se ha guardado con node_save(), $node->nidcontiene la ID de nodo para la fila de base de datos recién creada.
El objeto de formulario web del nodo tiene muchas claves nid en sus matrices que contienen el nid anterior, ¿qué debo hacer al respecto?
Arosboro
Drupal solo verifica $node->nid. Si ninguna de esas ID de nodo es la ID del nodo cargado, que debe cambiarse con la ID del nodo guardado, puede dejar esas ID de nodo tal como están.
kiamlaluno
2
Si está utilizando el módulo de ruta, es posible que también deseeunset($node->path);
Patrick James McDougle el
6
Tuve que publicar esto como respuesta porque el sistema te hace tener 50 puntos de reputación antes de que puedas comentar.
De todos modos, en respuesta a @koivo y su respuesta. Solo quería agregar eso para mí, también desestabilizar el $node->vidhecho. Entonces mi código para desarmar y guardar es
// Load a node
$node = node_load(1);// unset version and node id's
unset($node->nid);
unset($node->vid);
unset($node->path);// Save the copy
node_save($node);
En D7, debe desarmar el id del nodo unset($node->nid)y el id de revisión unset($node->vid). Construyo un formulario para clonar nodos de un determinado tipo (producto) que tiene un cierto término de referencia (con el reemplazo de ese término id). Aquí está el envío final:
Si hay algún campo de referencia de entidad en el nodo original, entonces no retiene su valor en el nodo clonado y también se genera una excepción de informe de entidad por no especificar el tipo de nodo. Estoy probando en D7. ¿Cualquier pista?
kiranking
2
Prueba el módulo de réplica .
Necesitaba clonar y modificar cosas fácilmente en un sitio que hice recientemente y descubrí que este módulo funcionaba bien.
Consulte el archivo replicate.api.php para ver lo fácil que es usarlo.
$node->nid
. Si ninguna de esas ID de nodo es la ID del nodo cargado, que debe cambiarse con la ID del nodo guardado, puede dejar esas ID de nodo tal como están.unset($node->path);
Tuve que publicar esto como respuesta porque el sistema te hace tener 50 puntos de reputación antes de que puedas comentar.
De todos modos, en respuesta a @koivo y su respuesta. Solo quería agregar eso para mí, también desestabilizar el
$node->vid
hecho. Entonces mi código para desarmar y guardar esfuente
En D7, debe desarmar el id del nodo
unset($node->nid)
y el id de revisiónunset($node->vid)
. Construyo un formulario para clonar nodos de un determinado tipo (producto) que tiene un cierto término de referencia (con el reemplazo de ese término id). Aquí está el envío final:Puede considerar volver a guardar las marcas de tiempo y
$node->uid
también.fuente
Prueba el módulo de réplica .
Necesitaba clonar y modificar cosas fácilmente en un sitio que hice recientemente y descubrí que este módulo funcionaba bien.
Consulte el archivo replicate.api.php para ver lo fácil que es usarlo.
fuente