it-swarm-vi.com

Làm thế nào để tạo các nút bằng cách sử dụng node_save?

Tôi đang cố gắng di chuyển trang web html hiện tại của mình vào Drupal. Tôi có hơn 80.000 trang tôi phải di chuyển nên tôi nghĩ thay vì ngồi trước máy tính trong 50 năm tôi sẽ tạo ra một mô-đun. Tôi đã có thể tạo một tập lệnh trích xuất html từ mỗi thư mục và bây giờ tôi đã đến một khối đường nơi tôi cần tạo một nút. Tôi đang cố gắng tạo một nút mới bằng cách sử dụng node_save(), nhưng khi node_save được thực thi, tôi gặp lỗi PDOException với mọi thứ tôi thử. Tôi đang đi qua $node, là một mảng sau đó được đúc thành một đối tượng.

PDOException: trong trường_s_s.

Đây là cách chúng tôi hiện đang tạo nút, nhưng nó tạo ra lỗi:

$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

Tôi nghĩ rằng bạn nên đọc Cách lập trình tạo các nút, nhận xét và phân loại theo chương trình trong 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

Thay vì truyền một mảng vào một đối tượng stdClass, bạn có thể thử tạo một đối tượng stdClass() mới và sau đó sử dụng node_object_prepare () để chuẩn bị cho đối tượng tạo mới nút và cuối cùng thay đổi thủ công các giá trị của uid, tên, tiêu đề, ngôn ngữ, nội dung, v.v. Ngoài ra, hãy chắc chắn sử dụng node_submit () trước khi lưu nút mới vào cơ sở dữ liệu.

Ví dụ: http://drupal.org/node/1173136

6
dwieeb

Vấn đề của bạn là, bạn đang cố gắng tạo một nút mới với nid = null và vid = null, điều này làm hỏng bảng nút khi bạn đang cố gắng chèn các bản ghi mới với chỉ số 0 - đang tạo ra một vấn đề trùng lặp và khó hiểu drupal core. Nhân tiện - drupal core dễ bị tổn thương vì những hành động như node_save sẽ không thấy vấn đề và cố gắng chèn bản ghi đó vào db - điều này gây ra lỗi sql - và đưa ra ngoại lệ PDO

1
Daniofantasy