Отсутствие "тела" при программном создании узла с интернационализацией


Я пытаюсь создать узлы типа событий в Drupal 7, используя данные из внешней базы данных. Он читает правильно и создает узел почти идеально. Но, похоже, это не спасает часть "тела" узла.

db_set_active('default');

foreach ($results as $record) { // Results gained from an ext DB
  echo 'Creating event: ' . $record->name;

  $node = new stdClass();
  $node->type = 'event';
  node_object_prepare($node);

  $node->title    = $record->name;
  $node->language = "en";;

  $node->body[$node->language][0]['value']   = $record->bodytext;  /* This line ?? */

  $path = 'content/programmatically_created_node_' . date('YmdHis');
  $node->path = array('alias' => $path);

  node_save($node);  
}

Это ранние стадии, и у меня есть несколько полей для размещения в узлах типа событий, включая некоторые пользовательские поля.

Я не уверен, как сопоставить поля во внешней базе данных с полями узлов. Строка выше может быть совершенно неправильной на данном этапе, но он прошел через множество неудачных итераций.

По запросу: вывод DPM узла (после сохранения)

... (Object) stdClass
type (String, 5 characters ) event
uid (String, 2 characters ) 10
status (Integer) 1
promote (Integer) 0
sticky (Integer) 0
created (Integer) 1357635638
revision (Boolean) FALSE
comment (String, 1 characters ) 1
language (String, 3 characters ) und
menu (Array, 13 elements)
title (String, 42 characters ) Starter Course
field_pakp_p1_id (String, 36 characters ) 78ee9b05-9225-fb5b-9bbb-508eada6ba81
body (Array, 1 element)
  en (Array, 1 element)
    0 (Array, 3 elements)
      value (String, 19 characters ) This is a body text
      summary (String, 19 characters ) Here goes a summary
      format (String, 13 characters ) filtered_html
path (Array, 1 element)
validated (Boolean) TRUE
changed (Integer) 1357635638
timestamp (Integer) 1357635638
publish_on (Integer) 0
unpublish_on (Integer) 0
log (String, 0 characters )
nid (String, 3 characters ) 423
tnid (Integer) 0
translate (Integer) 0
vid (String, 3 characters ) 423
field_event_status (Array, 1 element)
xmlsitemap (Array, 15 elements)

...

Я также попытался использовать метод drupal_form_submit..

foreach ($results as $record) { // Results gained from an ext DB
    echo 'Creating event: ' . $record->name;
    $node = (object) array(
      'type' => 'event',
      'language' => LANGUAGE_NONE
    );
    node_object_prepare($node);

    $form_state = array();  
    $form_state['values']['language'] = "en";
    $form_state['values']['title'] = $record->name;  
    $form_state['values']['description']['value'] = "description....";
    $form_state['values']['body']['value'] = "body....";
    $form_state['values']['body']['format'] = filter_default_format();
    $form_state['values']['body']['LANGUAGE'] = "en";
    $form_state['values']['name'] = $user->name;  
    $form_state['values']['op'] = t('Save');

    drupal_form_submit("{$node->type}_node_form", $form_state, $node);

}

Но опять же, как я ни старался, используя этот метод, я не смог спасти "тело". (Я знаю, что в этом коде есть какой-то мусор, это мои эксперименты.)

Вопросы.

  1. Какой метод лучше всего использовать для моего приложения. node_сохранить или drupal_form_submit
  2. Для правильного метода, какой лучший способ хранения основного текста?
  3. Как мне узнать, какие ключи массива $form_state являются допустимыми или элементы $node, чтобы я мог найти правильное место для дальнейшего сопоставления полей?
Author: Rob, 2013-01-02

2 answers

Если ваш сайт многоязычный, то "en" будет содержать переводы на английский язык вашего исходного узла (я думаю, что это правильно).

Рискуя, я бы сказал, что вы не используете многоязычный сайт и вместо этого хотите использовать константу LANGUAGE_NONE, например

$node->language = LANGUAGE_NONE;

Если ваш сайт не является многоязычным, использование "en", вероятно, объяснит, почему вы не видите сохраненное значение тела. Это может быть даже в базе данных, но поскольку система полей ищет поля с помощью LANGUAGE_NONE, когда он прикрепляет данные к узлу, не зависящему от языка, ничего не найдено.

Хотя это может быть полной чушью;)

 1
Author: Clive, 2013-01-02 16:47:14

Drupal 6 или 7?

Я бы использовал node_save(). Попробуйте использовать dpm() для проверки структуры определенного типа узла. Может быть, разместить это здесь?

Я только что сделал нечто подобное:

/**
 * Import upload form.
 */
function mymodule_import_form($form, &$form_state) {
  $form = array();

  $form['#attributes'] = array('enctype' => "multipart/form-data");

  $form['import_file'] = array(
    '#type' => 'file',
    '#title' => t('Import file'),
    '#description' => t('CSV file containing xx data.'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Import'),
  );

  return $form;
}

/**
 * Import submit callback.
 */
function mymodule_import_form_submit($form, &$form_state) {
  $validators = array(
    'file_validate_extensions' => array('csv'),
  );

  if ($file = file_save_upload('import_file', $validators)) {
    $fp = fopen($file->uri, 'r');

    $count = 0;
    while ($row = fgetcsv($fp)) {

      // If event already exists, don't do anything.
      $result = db_query(
        "SELECT nid FROM node WHERE type = 'event' AND created = :created AND title = :title",
        array(':created' => $row[3], ':title' => $row[7])
      );
      $nid = $result->fetchField();
      if ($nid) {
        drupal_set_message('Already exists: ' . l($row[7], 'node/' . $nid . '/edit'));
        continue;
      }

      // Create event node
      $node = new stdClass();
      $node->type = 'event';
      node_object_prepare($node);
      $node->uid = 0;
      $node->created = $row[3];
      $node->title = $row[7];
      $node->language = 'da';
      $node->body['und'][0]['value'] = $row[10];
      $node->field_company_name['und'][0]['value'] = $row[8];
      $node->field_email['und'][0]['value'] = $row[10];
      $node->field_phone['und'][0]['value'] = $row[9];
      node_save($node);

      drupal_set_message('Created: ' . l($node->title, 'node/' . $node->nid . '/edit'));

      $count++;
      if ($count > 50) break;
    }
  }
}
 0
Author: Martin Poulsen, 2013-01-02 16:40:47