如何在drupal中从cron作业创建节点?

时间:2008-09-17 23:08:32

标签: php drupal drupal-6

在drupal 4.7的自定义模块中,我将一个节点对象一起攻击并将其传递给node_save($ node)以创建节点。这个hack似乎不再适用于drupal 6.虽然我确信这个hack可以修复但我很好奇是否有标准的解决方案来创建没有表单的节点。在这种情况下,数据会从另一个网站上的自定义Feed中提取。

5 个答案:

答案 0 :(得分:12)

实现这一目标的最佳实践方法是使用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);

答案 1 :(得分:9)

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);

'状态'和'推广'很容易被忽视 - 如果你没有设置它们,节点将保持未发布和未启动状态,你只会看到你是否进入内容管理屏幕。

答案 2 :(得分:6)

我不知道用于实际创建节点的标准API。但这就是我从构建一个能够完成你想做的事情的模块中收集到的。

  1. 确保设置了重要字段:uid,名称,类型,语言,标题,正文,过滤条件(请参阅node_add()node_form()
  2. 将节点传递给node_object_prepare(),以便其他模块可以添加到$ node对象。

答案 3 :(得分:0)

我发现的另一个答案是使用drupal核心中的blogapi模块中的the example。它在核心的事实让我更有信心它将继续在未来的版本中工作。

答案 4 :(得分:0)

上面有一些很好的答案,但在将摄取的Feed项目转换为节点的具体示例中,您还可以采用使用simplefeed模块(http://wwww.drupal.org/project/simplefeed)的方法。此模块使用simplepie引擎来提取提要并将每个提要中的各个项目转换为节点。我意识到这并没有专门解决从cron创建节点的问题,但它可能是一个更容易解决整个问题的方法。