it-swarm.it

Come creare nodi usando node_save?

Sto cercando di migrare il mio attuale sito HTML in Drupal. Ho più di 80.000 pagine che devo migrare, quindi ho pensato di creare un modulo invece di stare seduto davanti a un computer per 50 anni. Sono stato in grado di creare uno script che estrae l'html da ogni directory e ora sono arrivato a un blocco stradale in cui ho bisogno di creare un nodo. Sto cercando di creare un nuovo nodo usando node_save(), ma quando viene eseguito node_save, ottengo un errore PDOException con tutto ciò che provo. Sto passando $node, che è un array che viene quindi inserito in un oggetto.

PDOException: in field_sql_storage_field_storage_write () (riga 424 di /srv/www/htdocs/modules/field/modules/field_sql_storage/field_sql_storage.module).

Ecco come stiamo attualmente creando il nodo, ma produce un errore:

$node= array(
    'uid' => $user->uid,
    'name' => $user->name,
    'type' => 'page',
    'language' => LANGUAGE_NONE,
    'title' => $html['title'],
    'status' => 1,
    'promote' => 0,
    'sticky' => 0,
    'created' => (int)REQUEST_TIME,
    'revision' => 0,
    'comment' => '1',
    'menu' => array(
        'enabled' => 0,
        'mlid' => 0,
        'module' => 'menu',
        'hidden' => 0,
        'has_children' => 0,
        'customized' => 0,
        'options' => array(),
        'expanded' => 0,
        'parent_depth_limit' => 8,
        'link_title' => '',
        'description' => '',
        'parent' => 'main-menu:0',
        'weight' => '0',
        'plid' => '0',
        'menu_name' => 'main-menu',
    ),
    'path' => array(
        'alias' => '',
        'pid' => null,
        'source' => null,
        'language' => LANGUAGE_NONE,
        'pathauto' => 1,
    ),
    'nid' => null,
    'vid' => null,
    'changed' => '',
    'additional_settings__active_tab' => 'edit-menu',
    'log' => '',
    'date' => '',
    'submit' => 'Save',
    'preview' => 'Preview',
    'private' => 0,
    'op' => 'Save',
    'body' => array(LANGUAGE_NONE => array(
        array(
            'value' => $html['html'],
            'summary' => $link,
            'format' => 'full_html',
        ),
    )),
        'validated' => true,
);

node_save((object)$node);

// Small hack to link revisions to our test user.
db_update('node_revision')
    ->fields(array('uid' => $node->uid))
    ->condition('vid', $node->vid)
    ->execute();
9
samwell

Penso che dovresti leggere Come creare a livello di codice nodi, commenti e tassonomie in Drupal 7 .

$node = new stdClass(); // We create a new node object
$node->type = "page"; // Or any other content type you want
$node->title = "Your title goes jere";
$node->language = LANGUAGE_NONE; // Or any language code if Locale module is enabled. More on this below *
$node->path = array('alias' => 'your node path'); // Setting a node path
node_object_prepare($node); // Set some default values.
$node->uid = 1; // Or any id you wish

// Let's add standard body field
$node->body[$node->language][0]['value'] = 'This is a body text';
$node->body[$node->language][0]['summary'] = 'Here goes a summary';
$node->body[$node->language][0]['format'] = 'filtered_html'; // If field has a format, you need to define it. Here we define a default filtered_html format for a body field

$node = node_submit($node); // Prepare node for a submit
node_save($node); // After this call we'll get a nid
6
penguin89

Invece di trasmettere un array in un oggetto stdClass, potresti provare a creare un nuovo oggetto stdClass() e quindi utilizzare node_object_prepare () per preparare l'oggetto alla creazione di un nuovo nodo e infine cambiando manualmente i valori di uid, nome, titolo, lingua, corpo, ecc. Inoltre, assicurarsi di utilizzare node_submit () prima di salvare il nuovo nodo nel database.

Esempio: http://drupal.org/node/1173136

6
dwieeb

Il tuo problema è che stai provando a creare un nuovo nodo con nid = null e vid = null, che sta rovinando la tabella dei nodi mentre stai cercando di inserire nuovi record con il numero indice 0 - che sta creando un problema con voci duplicate e confusion drupal core. A proposito - drupal core è vulnerabile per azioni come node_save non vedrà il problema e proverà ad inserire quel record nel db - che sta causando un errore sql - e lanciando un'eccezione DOP

1
Daniofantasy