Как мне создать узел из задания cron в Drupal?
Вопрос
В специальном модуле для Drupal 4.7 я собрал объект узла и передал его в node_save($node) для создания узлов.Похоже, этот хак больше не работает в Drupal 6.Хотя я уверен, что этот хак можно исправить, мне любопытно, существует ли стандартное решение для создания узлов без формы.В этом случае данные извлекаются из пользовательского канала на другом веб-сайте.
Решение
Я не знаю стандартного API для прагматичного создания узла.Но это то, что я почерпнул при создании модуля, который делает то, что вы пытаетесь сделать.
- Убедитесь, что важные поля установлены:uid, имя, тип, язык, заголовок, тело, фильтр (см.
node_add()
иnode_form()
) - Пропустить узел через
node_object_prepare()
поэтому другие модули могут добавляться к объекту $node.
Другие советы
Лучший способ добиться этого — использовать drupal_execute.drupal_execute будет выполнять стандартную проверку и базовые операции с узлами, чтобы все шло так, как ожидает система.Drupal_execute имеет свои особенности и немного менее интуитивно понятен, чем простой node_save, но в Drupal 6 вы можете использовать drupal_execute следующим образом.
$form_id = 'xxxx_node_form'; // where xxxx is the node type
$form_state = array();
$form_state['values']['type'] = 'xxxx'; // same as above
$form_state['values']['title'] = 'My Node Title';
// ... repeat for all fields that you need to save
// this is required to get node form submits to work correctly
$form_state['submit_handlers'] = array('node_form_submit');
$node = new stdClass();
// I don't believe anything is required here, though
// fields did seem to be required in D5
drupal_execute($form_id, $form_state, $node);
node_save() по-прежнему отлично работает в Drupal 6;вам понадобится несколько конкретных фрагментов данных, чтобы все заработало.
$node = new stdClass();
$node->type = 'story';
$node->title = 'This is a title';
$node->body = 'This is the body.';
$node->teaser = 'This is the teaser.';
$node->uid = 1;
$node->status = 1;
$node->promote = 1;
node_save($node);
«Статус» и «Продвигать» легко не заметить — если вы их не установите, узел останется неопубликованным и непродвинутым, и вы увидите его только в том случае, если перейдете на экран администрирования контента.
Еще один ответ, который я обнаружил, заключался в использовании пример из модуля blogapi в ядре Drupal.Тот факт, что он есть в ядре, дает мне немного больше уверенности в том, что он продолжит работать в будущих версиях.
Выше есть несколько хороших ответов, но в конкретном примере превращения загруженного элемента ленты в узел вы также можете использовать подход с использованием модуля simplefeed (http://www.drupal.org/project/simplefeed).Этот модуль использует механизм simplepie для приема каналов и превращает отдельные элементы из каждого канала в узлы.Я понимаю, что это не касается конкретно проблемы создания узлов из cron, но в целом это может быть более простым решением вашей проблемы.