在 drupal 4.7 的自定义模块中,我将一个节点对象组合在一起并将其传递给 node_save($node) 以创建节点。这个 hack 似乎不再适用于 drupal 6。虽然我确信这个 hack 可以修复,但我很好奇是否有一个标准的解决方案来创建没有表单的节点。在这种情况下,数据是从另一个网站上的自定义提要中提取的。
5 回答
实现这一点的最佳实践方法是利用 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);
“状态”和“提升”很容易被忽略——如果您不设置它们,节点将保持未发布和未提升状态,您只能在进入内容管理屏幕时看到。
我不知道实用地创建节点的标准 API。但这就是我从构建一个可以执行您尝试执行的操作的模块中收集到的信息。
- 确保设置了重要字段:uid、名称、类型、语言、标题、正文、过滤器(请参阅
node_add()
和node_form()
) - 传递节点,
node_object_prepare()
以便其他模块可以添加到 $node 对象。
我发现的另一个答案是使用drupal 核心中 blogapi 模块中的示例。它在核心中的事实让我更加相信它将在未来的版本中继续工作。
上面有一些很好的答案,但是在将摄取的提要项转换为节点的具体示例中,您还可以采用使用 simplefeed 模块(http://wwww.drupal.org/project/simplefeed)的方法。该模块使用 simplepie 引擎来摄取提要并将每个提要中的单个项目转换为节点。我意识到这并没有专门解决从 cron 创建节点的问题,但它可能是一个更容易解决您的问题的整体问题。