我想以编程方式(使用 php)填写现有的 drupal 表单以创建包含在贡献模块中的内容类型。
详细信息:模块为 SimpleFeed,内容类型为 Feed。我想调用模块的函数来完成这个。我感兴趣的方法是 hook_insert 似乎需要 vid 和 nid ,我不确定它们是什么。
任何帮助表示赞赏。
您能否提供更多信息(哪些模块?)。一般来说,我可能会建议调用模块函数来创建内容类型,而不是尝试以编程方式通过表单传递它。这样您就不必担心实现,并且可以相信如果模块有效,它也适用于您的脚本:)
当然,这确实将您的模块与他们的模块联系在一起,因此其功能的任何更改都可能影响您的模块。(但话又说回来,如果他们也更新他们的数据库结构,你就会冒这个风险)
前任。
// your file.php
function mymodule_do_stuff() {
cck_create_field('something'); // as an example, i doubt this
// is a real CCK function :)
}
编辑:vid
和nid
是节点ID,vid
是修订ID,nid
是特定节点的主键。因为这是一个实际的节点,您可能需要执行两个操作。
以编程方式创建节点
您必须为所有确切字段(表node
和node_revisions
)引用数据库,但这应该为您提供一个基本的工作节点:
$node = (object) array(
'nid' => '', // empty nid will force a new node to be created
'vid' => '',
'type' => 'simplefeed'. // or whatever this node is actually called
'title' => 'title of node',
'uid' => 1, // your user id
'status' => 1, // make it active
'body' => 'actual content',
'format' => 1,
// these next 3 fields are the simplefeed ones
'url' => 'simplefeed url',
'expires' => 'whatever value',
'refresh' => 'ditto',
);
node_save($node);
现在我认为hook_insert()
它应该在这一点上自动调用 simplefeed 。如果没有,那么继续 2。但我会检查它是否已经解决了。
自己打电话!
simplefeed_insert($node);
edit2:drupal_execute()
这也不是一个坏主意,因为您可以取回一些验证,但是如果您不满意,这样您就不必处理表单 API。我很确定node_save()
无论如何都会调用所有钩子,所以你应该只需要在这个方法下执行第 1 步。
drupal api 提供了drupal_execute()来做到这一点。我建议您避免直接调用函数来创建节点(除非有性能原因)。通过使用 drupal_execute() 将调用其他模块中的所有正确钩子,并且您的代码更有可能继续在未来版本的 drupal 中工作。
请注意,使用此方法的一个经典错误不是首先调用类似
module_load_include('inc', 'node', 'node.pages')
这将为您的节点创建表单加载代码。
直接调用 node_save 通常被认为不推荐使用,并且可能会在未来版本的 drupal 中留下损坏的代码。
这个摇篮曲帖子有一个很好的例子