
Недавно столкнулась с необходимостью автоматической загрузки данных в nodы с CCK полями.
Хочу поделиться своим способом решения данной проблемы.
Недавно столкнулась с необходимостью автоматической загрузки данных в nodы с CCK полями.
Хочу поделиться своим способом решения данной проблемы.
Условия задачи:
Установлен Drupal 5.* (тестировалось только на 5.2), с помощью модуля CCK создан тип публикации,
например, MyContentType, с дополнительным (к Title и Body) полем myfield.
И есть данные, например, в XML формате, которые нужно загрузить на сайт в виде отдельных страниц типа MyContentType.
Задача, собственно, и заключается в следующем — автоматически пройтись по XML и создать необходимые node с содержанием из Xml.
Варианты предлагаемые на drupal.org можно посмотреть тут:
How-to: Import data into CCK nodes (5.x) | drupal.org
importing data into CCK created node | drupal.org
На drupal.ru: Импорт нод из XML
Мой вариант - это вобщем-то тоже самое, но проще.
Пишем отдельный модуль createnodes:
<?php
/**
* Implementation of hook_menu().
*
*/
function createnodes_menu($may_cache) {
$items = array();
if ($may_cache) {
// This is the minimum information you can provide for a menu item.
$items[] = array('path' => 'createnodes', 'title' => t('Create Nodes'),
'callback' => 'createnodes_add',
'access' => user_access('dminister nodes'));
}
return $items;
}
/**
* A simple page callback.
*
*/
function createnodes_add() {
$content = '';
$xml = new DomDocument();
$xml -> load(drupal_get_path('module', 'createnodes') .'/result.xml');
$xpath = new DOMXPath($xml);
$query = '//item';
$entries = $xpath->query($query);
$count = 0;
foreach ($entries as $entry) {
$num = db_num_rows(db_query("SELECT title FROM {node} WHERE title = '%s'", $entry->firstChild->nodeValue));
if ($num == 0) {
createnodes_save($entry);
$count += 1;
}
}
return $count . ' nodes were added';
}
function createnodes_save($item) {
$fn = $item->firstChild->nodeValue;
$nid = db_next_id('{node}_nid');
$node->title = $fn;
$node->type = 'art';
$node->status = 1;
$node->uid = 1;
$node->field_photo = array(array('fid' => db_next_id('{files}_fid'),
'title' => $fn,
'alt' => $fn,
'nid' => $nid,
'filename' => $fn,
'filepath' => 'sites/all/files/i/'.$fn,
'filemime' => 'image/jpeg',
'filesize' => $item->getAttribute('size')));
// Save the node:
node_save($node);
}
?>Массив для свойств $node->field_* может выглядеть и по другому, это зависит от типа конкретного CCK поля. Мне в данном случае помог модуль devel . На вкладке dev_load для конкретного nodа можно увидеть как должен выглядеть целиком объект $node.
Точно также на вкладке dev_load можно подсмотреть как правильно добавить категорию к своему node (taxonomy).
| Вложения | Размер |
|---|---|
| createnodes.zip | 7.7 Кбайт |
Большое
Большое спасибо, давно искал :)
-------------------
avangard-hub.ru user
Отправить новый комментарий