node_save를 사용하여 노드를 만드는 방법은 무엇입니까?


9

현재 html 사이트를 Drupal로 마이그레이션하려고합니다. 마이그레이션해야 할 80,000 페이지가 있으므로 50 년 동안 컴퓨터 앞에 앉아있는 대신 모듈을 만들 것이라고 생각했습니다. 각 디렉토리에서 html을 추출하는 스크립트를 만들 수 있었고 이제 노드를 만들어야하는로드 블록에 도달했습니다. 를 사용하여 새 노드를 만들려고하는데 node_save()node_save가 실행될 때 PDOException시도하는 모든 것에 오류가 발생합니다. 을 전달 $node합니다.이 배열은 객체로 캐스팅됩니다.

PDOException : field_sql_storage_field_storage_write () (/ srv / www / htdocs / modules / field / modules / field_sql_storage / field_sql_storage.module의 424 행)

이것이 현재 노드를 만드는 방법이지만 오류가 발생합니다.

$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

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

문제는 색인 번호가 0 인 새 레코드를 삽입하려고 할 때 노드 테이블을 망가 뜨리는 nid = null 및 vid = null을 사용하여 새 노드를 작성하려고 시도하는 것입니다. 혼란스러운 드루팔 코어. 그런데 drupal core는 node_save가 문제를 보지 못하고 그 레코드를 db에 삽입하려고 시도합니다-SQL 오류를 유발하고 PDO 예외를 던지는 것과 같은 작업에 취약합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.