Como criar nós usando node_save?

9

Estou tentando migrar meu site html atual para o Drupal. Como tenho mais de 80.000 páginas para migrar, pensei que, em vez de ficar sentado na frente de um computador por 50 anos, criaria um módulo. Consegui criar um script que extrai o html de cada diretório e agora cheguei a um bloqueio no qual preciso criar um nó. Estou tentando criar um novo nó usando node_save(), mas quando node_save é executado, recebo um PDOExceptionerro com tudo o que tento. Estou passando $node, que é uma matriz que é lançada em um objeto.

PDOException: em field_sql_storage_field_storage_write () (linha 424 de /srv/www/htdocs/modules/field/modules/field_sql_storage/field_sql_storage.module).

É assim que estamos criando o nó atualmente, mas produz um erro:

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

Respostas:

6

Eu acho que você deve ler Como criar programaticamente nós, comentários e taxonomias no 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
fonte
por que o voto negativo?
vfclists
6

Em vez de converter uma matriz em um stdClassobjeto, você pode tentar criar um novo stdClass()objeto e, em seguida, usar node_object_prepare () para preparar o objeto para criar um novo nó e, finalmente, alterar manualmente os valores de uid, nome, título, idioma, corpo, etc. Além disso, certifique-se de usar node_submit () antes de salvar o novo nó no banco de dados.

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

dwieeb
fonte
1

Seu problema é que você está tentando criar um novo nó com nid = null e vid = null, que está estragando a tabela de nós enquanto tenta inserir novos registros com o número de índice 0 - o que está criando um problema de entradas duplicadas e núcleo drupal confuso. A propósito - o núcleo drupal é vulnerável a ações como o node_save não verá o problema e tentará inserir esse registro no db - o que está causando um erro de sql - e lançando uma exceção DOP

Daniofantasy
fonte