AYUDA! Funcion personalizada para Importacion de datos externos a Drupal con node_save??

Events happening in the community are now at Drupal community events on www.drupal.org.
Gmartin's picture

Hola estoy importando datos de una base de datos externa de momento no tuve problemas accediendo a los datos pero ahora tengo que convertir esos registros alienigenas en nodos de drupal.. y aqui me esta doliendo la cabeza.. probe muchas formas ahora esta parece ser la que mejor funciona les adjunto el codigo, mi problema es que me genera automaticamente los nid pero los vid los deja en cero entonces me da error de clave duplicada para la tabla node_revisions, espero que alguien entienda de que estoy hablando..

function mimodulo_migracion_manual_form_submit(){

db_set_active('db_old');

$result = db_query("SELECT * FROM producciones");

db_set_active('default');

$t="";
$n=0;

while ($data = db_fetch_object($result)) {

// Construct the new node object.
$nodo = new stdClass();

$nodo->title = check_plain($data->titulo);
$nodo->body = $data->sinopsis;
//$nodo->type = 'produccion';
$nodo->type = 'page';
$nodo->created = time();
$nodo->changed = $nodo->created;
$nodo->status = 1; // Published?
$nodo->promote = 0; // Display on front page?
$nodo->sticky = 0; // Display top of page?
$nodo->format = 1; // Filtered HTML?
$nodo->uid = 1; // Content owner uid (author)?
$nodo->language = 'es';

node_submit($nodo);
node_save($nodo);
unset($nodo);

$t.="[".$data->titulo."] ";
$n++;
}
$m="

".t('Se importaron con exito !cant producciones:',array('!cant' => $n))."

";

$m.="

".$t."

".t('El Proceso de Migracion se ha completado.')."

";

drupal_set_message($m);

}

EL ERROR: user warning: Duplicate entry '0' for key 1 query: INSERT INTO node_revisions (nid, uid, title, body, teaser, log, timestamp, format) VALUES (0,etc etc

Es obvio lo que pasa la función me genera automaticamente los nid pero no los vid asumi que la funcion node_save haria el trabajo.. pero parece que no es asi... esta es una version de prueba la funcion completa incluiria campos cck pero primero quiero comprobar que funciona...

GRACIAS POR LA AYUDA!!!

Comments

Node Import

ArielCamino's picture

Hola, probaste el módulo Node Import? Si no lo conoces pegale un vistazo desde mi punto de vista es uno de los módulos más impresionantes de Drupal:

Node Import

Saludos!

Gracias por responder si lo probé...

Gmartin's picture

Gracias por responder antes que anda...si lo probé parece muy útil aunque no es lo que necesito específicamente.. en realidad estoy haciendo pruebas por posiblemente tenga que hacer un modulo para sincronizar stock con artículos de ubercart... y un primer paso seria hacer una función mas simple como esta... con node import por lo que vi no puedo actualizar...ademas que hice pruebas exportando los datos de las tablas a CSV y tenia algunos errores con algunos campos...

Dicho sea de paso mi funcion esta funcionando de lujo..y estoy agregando los campos cck ... sigo con las pruebas

Un Saludo!

node_submit devuelve el nodo

gbarrigap's picture

Viendo tu código, me parece extraño el uso de node_submit; por qué hiciste esto:

<?php
node_submit
($nodo);
node_save($nodo);
?>

¿en vez de esto?

<?php
$node
= node_submit($nodo);
node_save($node);
?>

De esta forma lo he hecho y lo he visto en la API, pero no sin utilizar el retorno de node_submit().

Igual veo que hay algunos campos que son innecesarios según el ejemplo, porque la función node_save, por ejemplo, se encarga de manejar el autor, fecha, versión y otras cosas del nodo.

Revisa la API de esas dos funciones para que veas qué hacen y qué te podrías ahorrar.

Saludos.

SI tienes razon estaba usando como base este codigo...

Gmartin's picture

Estaba usando como base este codigo: http://drupal.org/node/351426 pero no me moleste mucho en leer la api...grave error :-. Igual a estas horas ya estoy creando nodos con campos cck de referencia de nodo, fecha, video y funciona perfecto. :-) i'm so happy. En realidad alguno de esos campos que completa node_save necesitaba cargarlos a mano para que mantengan la coherencia del antiguo sitio cuando menos en la fecha de creacion y la esta tomando bien... claro luego de mucho debug no se q haria sin komodo!

Gracias, estoy entrando a la API en este instante!

Chequeando en debug node_submit....

Gmartin's picture

Por si a alguien le sirve node_submit mas alla que retorne el nodo... parece modificarlo como si lo pasara por referencia osea esta cargando el teaser aunque no use el nodo retornado...

por lo que:

<?php
node_submit
($nodo);
node_save($nodo);
?>

es igual a

<?php
$node
= node_submit($nodo);
node_save($node);
?>

Un Saludo!

El problema es cuando cambiar de db

victorkane's picture

Probá esto:

function mimodulo_migracion_manual_form_submit(){

db_set_active('db_old');

$result = db_query("SELECT * FROM producciones");

// **** NO! **** db_set_active('default');

$t="";
$n=0;

while ($data = db_fetch_object($result)) {

// Construct the new node object.
$nodo = new stdClass();

$nodo->title = check_plain($data->titulo);
$nodo->body = $data->sinopsis;
//$nodo->type = 'produccion';
$nodo->type = 'page';
$nodo->created = time();
$nodo->changed = $nodo->created;
$nodo->status = 1; // Published?
$nodo->promote = 0; // Display on front page?
$nodo->sticky = 0; // Display top of page?
$nodo->format = 1; // Filtered HTML?
$nodo->uid = 1; // Content owner uid (author)?
$nodo->language = 'es';

db_set_active('default');                   // escribir a la base nueva, no a la vieja <-- error
$nodo = node_submit($nodo);           // necesario porque no pasás por referencia tampoco
node_save($nodo);
db_set_active('db_old');                   // Entonces el bucle puede seguir con los datos correctos
// por que? unset($nodo);

$t.="[".$data->titulo."] ";
$n++;
}

Suerte!

También fijate en algunos módulos que podrían ayudar

victorkane's picture

Aparte de importar las tablas en la base nueva y no tener que verselas con dos bases, el módulo data (utiliza el módulo schema) detecta tablas "huérfonos" en la base de datos y les da soporte para views.

http://drupal.org/project/data

http://drupal.org/project/schema

Por otro lado, el módo migrate fue hecho para estos casos:

Migrate:
http://drupal.org/project/migrate

Uso de la t()

KMC81's picture

Aunque poco tiene que ver con el tema que planteas, el uso que le das a la función t() es incorrecto, ya que todo texto que se pase por esta función ha de estar en inglés, utilizando plantillas para ponerlo en cualquier otro idioma.

En la API se puede leer: "The t() system assumes any data it receives is in English. User data may be in another language, producing translation errors."

t() en la API:
http://api.drupal.org/api/drupal/includes--common.inc/function/t/6

Saludos!

Argentina

Group organizers

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week