Отсутствие "тела" при программном создании узла с интернационализацией
Я пытаюсь создать узлы типа событий в 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);
}
Но опять же, как я ни старался, используя этот метод, я не смог спасти "тело". (Я знаю, что в этом коде есть какой-то мусор, это мои эксперименты.)
Вопросы.
- Какой метод лучше всего использовать для моего приложения. node_сохранить или drupal_form_submit
- Для правильного метода, какой лучший способ хранения основного текста?
- Как мне узнать, какие ключи массива $form_state являются допустимыми или элементы $node, чтобы я мог найти правильное место для дальнейшего сопоставления полей?
2 answers
Если ваш сайт многоязычный, то "en" будет содержать переводы на английский язык вашего исходного узла (я думаю, что это правильно).
Рискуя, я бы сказал, что вы не используете многоязычный сайт и вместо этого хотите использовать константу LANGUAGE_NONE
, например
$node->language = LANGUAGE_NONE;
Если ваш сайт не является многоязычным, использование "en", вероятно, объяснит, почему вы не видите сохраненное значение тела. Это может быть даже в базе данных, но поскольку система полей ищет поля с помощью LANGUAGE_NONE
, когда он прикрепляет данные к узлу, не зависящему от языка, ничего не найдено.
Хотя это может быть полной чушью;)
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;
}
}
}