Вопрос

В специальном модуле для Drupal 4.7 я собрал объект узла и передал его в node_save($node) для создания узлов.Похоже, этот хак больше не работает в Drupal 6.Хотя я уверен, что этот хак можно исправить, мне любопытно, существует ли стандартное решение для создания узлов без формы.В этом случае данные извлекаются из пользовательского канала на другом веб-сайте.

Это было полезно?

Решение

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

  1. Убедитесь, что важные поля установлены:uid, имя, тип, язык, заголовок, тело, фильтр (см. node_add() и node_form())
  2. Пропустить узел через 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, но в целом это может быть более простым решением вашей проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top