web-dev-qa-db-fra.com

Comment créer des nœuds en utilisant node_save?

J'essaie de migrer mon site html actuel vers Drupal. J'ai plus de 80 000 pages à migrer, alors j'ai pensé qu'au lieu de m'asseoir devant un ordinateur pendant 50 ans, je créerais un module. J'ai pu créer un script qui extrait le code HTML de chaque répertoire et maintenant je suis arrivé à un barrage routier où j'ai besoin de créer un nœud. J'essaie de créer un nouveau nœud en utilisant node_save(), mais lorsque node_save est exécuté, j'obtiens une erreur PDOException avec tout ce que j'essaie. Je passe $node, qui est un tableau qui est ensuite converti en objet.

PDOException: dans field_sql_storage_field_storage_write () (ligne 424 de /srv/www/htdocs/modules/field/modules/field_sql_storage/field_sql_storage.module).

Voici comment nous créons actuellement le nœud, mais cela produit une erreur:

$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

Je pense que vous devriez lire Comment créer par programmation des nœuds, des commentaires et des taxonomies dans 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

Au lieu de convertir un tableau en un objet stdClass, vous pouvez essayer de créer un nouvel objet stdClass() puis d'utiliser node_object_prepare () pour préparer l'objet à la création d'un nouveau nœud et enfin changer manuellement les valeurs de uid, nom, titre, langue, corps, etc. Assurez-vous également d'utiliser node_submit () avant d'enregistrer le nouveau nœud dans la base de données.

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

6
dwieeb

Votre problème est que vous essayez de créer un nouveau nœud avec nid = null et vid = null, ce qui fout la table des nœuds lorsque vous essayez d'insérer de nouveaux enregistrements avec le numéro d'index 0 - ce qui crée un problème d'entrées en double et confondre drupal core. Soit dit en passant - drupal core est vulnérable pour des actions telles que node_save ne verra pas le problème et essaiera d'insérer cet enregistrement dans la base de données - ce qui provoque une erreur sql - et lève une exception PDO

1
Daniofantasy