Wie erstelle ich Knoten mit node_save?

9

Ich versuche, meine aktuelle HTML-Site in Drupal zu migrieren. Ich habe über 80.000 Seiten, die ich migrieren muss, also dachte ich, anstatt 50 Jahre lang vor einem Computer zu sitzen, würde ich ein Modul erstellen. Ich konnte ein Skript erstellen, das das HTML aus jedem Verzeichnis extrahiert, und jetzt kam ich zu einer Straßensperre, an der ich einen Knoten erstellen muss. Ich versuche, einen neuen Knoten mit zu erstellen node_save(), aber wenn node_save ausgeführt wird, PDOExceptionwird bei allem, was ich versuche , eine Fehlermeldung angezeigt . Ich gehe vorbei $node, das ist ein Array, das dann in ein Objekt umgewandelt wird.

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

So erstellen wir derzeit den Knoten, aber es entsteht ein Fehler:

$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();
Samwell
quelle

Antworten:

6

Ich denke, Sie sollten lesen, wie Sie Knoten, Kommentare und Taxonomien in Drupal 7 programmgesteuert erstellen .

$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
Pinguin89
quelle
Warum das Downvote?
vfclists
6

Anstatt ein Array in ein stdClassObjekt umzuwandeln , können Sie versuchen, ein neues stdClass()Objekt zu erstellen und dann mit node_object_prepare () das Objekt für die Erstellung eines neuen Knotens vorzubereiten und schließlich die Werte von uid, name, title, language, body usw. Manuell zu ändern Stellen Sie außerdem sicher, dass Sie node_submit () verwenden, bevor Sie den neuen Knoten in der Datenbank speichern.

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

Dwieeb
quelle
1

Ihr Problem ist, dass Sie versuchen, einen neuen Knoten mit nid = null und vid = null zu erstellen, wodurch die Knotentabelle durcheinander gebracht wird, während Sie versuchen, neue Datensätze mit der Indexnummer 0 einzufügen. Dies führt zu einem Problem mit doppelten Einträgen und verwirrender Drupalkern. Übrigens - Drupal Core ist anfällig für Aktionen, bei denen node_save das Problem nicht erkennt und versucht, diesen Datensatz in die Datenbank einzufügen - was einen SQL-Fehler verursacht - und eine PDO-Ausnahme auslöst

Daniofantasie
quelle