Bagaimana cara membuat node menggunakan node_save?

9

Saya mencoba memigrasikan situs html saya saat ini ke Drupal. Saya memiliki lebih dari 80.000 halaman yang harus saya migrasikan, jadi saya pikir daripada duduk di depan komputer selama 50 tahun saya akan membuat modul. Saya dapat membuat skrip yang mengekstrak html dari setiap direktori dan sekarang saya sampai pada blok jalan di mana saya perlu membuat simpul. Saya mencoba membuat simpul baru menggunakan node_save(), tetapi ketika node_save dieksekusi, saya mendapatkan PDOExceptionkesalahan dengan semua yang saya coba. Saya lewat $node, yang merupakan array yang kemudian dilemparkan ke objek.

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

Ini adalah bagaimana kami saat ini membuat simpul, tetapi menghasilkan kesalahan:

$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
sumber

Jawaban:

6

Saya pikir Anda harus membaca Cara membuat node, komentar, dan taksonomi secara terprogram di 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
penguin89
sumber
mengapa downvote?
vfclists
6

Alih-alih melemparkan array ke stdClassobjek, Anda bisa mencoba membuat stdClass()objek baru dan kemudian menggunakan node_object_prepare () untuk menyiapkan objek untuk membuat node baru dan akhirnya secara manual mengubah nilai-nilai uid, nama, judul, bahasa, tubuh, dll. Juga, pastikan untuk menggunakan node_submit () sebelum menyimpan node baru ke database.

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

dwieeb
sumber
1

Masalah Anda adalah, bahwa Anda mencoba untuk membuat simpul baru dengan nid = null dan vid = null, yang mengacaukan tabel simpul saat Anda mencoba untuk memasukkan catatan baru dengan nomor indeks 0 - yang menciptakan masalah entri duplikat dan inti drupal membingungkan. Omong-omong - inti drupal rentan untuk tindakan seperti node_save tidak akan melihat masalah dan mencoba memasukkan catatan itu ke db - yang menyebabkan kesalahan sql - dan membuang pengecualian PDO

Daniofantasy
sumber