Как создать узел из задания cron в drupal?

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

5 ответов


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

  1. убедитесь, что установлены важные поля: uid, name, type, language, title, body, filter (см. 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);

'Status' и 'Promote' легко пропустить-если вы не установите их, узел останется неопубликованным и неопубликованным, и вы увидите, только если вы перейдете на экран администрирования контента.


еще один ответ, который я обнаружил, чтобы использовать пример от блокупай модуль в ядро Drupal. Тот факт, что он находится в ядре, дает мне немного больше уверенности в том, что он будет продолжать работать в будущих версиях.


есть несколько хороших ответов выше, но в конкретном примере превращения проглоченного элемента подачи в узел вы также можете использовать модуль simplefeed (http://wwww.drupal.org/project/simplefeed). Этот модуль использует simplepie engine для поглощения каналов и превращает отдельные элементы из каждого канала в узлы. Я понимаю, что это не специально решает проблему создания узлов из cron, но это может быть более простым решением вашей проблемы в общем и целом.