วิธีสร้างโหนดโดยใช้ node_save?


9

ฉันพยายามย้ายเว็บไซต์ html ปัจจุบันของฉันไปที่ Drupal ฉันมีมากกว่า 80,000 หน้าฉันจะต้องย้ายดังนั้นฉันคิดว่าแทนที่จะนั่งหน้าคอมพิวเตอร์เป็นเวลา 50 ปีฉันจะสร้างโมดูล ฉันสามารถสร้างสคริปต์ที่แยก html จากแต่ละไดเรกทอรีและตอนนี้ฉันไปถึง Roadblock ที่ฉันต้องการสร้างโหนด ฉันกำลังพยายามสร้างโหนดใหม่ที่ใช้node_save()แต่เมื่อดำเนินการ node_save ฉันได้รับPDOExceptionข้อผิดพลาดกับทุกสิ่งที่ฉันลอง ฉันกำลังผ่านเข้าไป$nodeซึ่งเป็นอาร์เรย์ที่ถูกโยนเข้าไปในวัตถุแล้ว

PDOException: ใน field_sql_storage_field_storage_write () (บรรทัด 424 จาก /srv/www/htdocs/modules/field/modules/field_sql_storage.module)

นี่คือวิธีที่เรากำลังสร้างโหนด แต่มันสร้างข้อผิดพลาด:

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

คำตอบ:


6

ผมคิดว่าคุณควรอ่านวิธีการเขียนโปรแกรมสร้างโหนด, ความคิดเห็นและ taxonomies ใน 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

ทำไม downvote
vfclists

6

แทนที่จะหล่ออาร์เรย์เป็นstdClassวัตถุคุณสามารถลองสร้างstdClass()วัตถุใหม่แล้วใช้node_object_prepare () เพื่อจัดเตรียมวัตถุสำหรับการสร้างโหนดใหม่และสุดท้ายเปลี่ยนค่าของ uid, ชื่อ, ชื่อ, ภาษา, ร่างกาย ฯลฯ ตรวจสอบให้แน่ใจว่าใช้node_submit () ก่อนบันทึกโหนดใหม่ลงในฐานข้อมูล

ตัวอย่าง: http://drupal.org/node/1173136


1

ปัญหาของคุณคือคุณกำลังพยายามสร้างโหนดใหม่ที่มี nid = null และ vid = null ซึ่งกำลังไขตารางโหนดขณะที่คุณพยายามแทรกระเบียนใหม่ด้วยหมายเลขดัชนี 0 ซึ่งกำลังสร้างปัญหารายการที่ซ้ำกันและ แกน drupal ที่สับสน โดยวิธี - หลัก drupal มีความเสี่ยงสำหรับการกระทำเช่น node_save จะไม่เห็นปัญหาและพยายามที่จะแทรกบันทึกลงใน db - ซึ่งเป็นสาเหตุของข้อผิดพลาด sql - และโยนออกยกเว้น PDO

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.