我想以编程方式(使用php)填写现有的drupal表单来创建一个包含在贡献模块中的内容类型。
详细信息:模块为SimpleFeed,内容类型为Feed。我想调用模块的函数来完成这个。我感兴趣的方法是hook_insert,它似乎需要vid和nid,我不确定它们是什么。
感谢任何帮助。
答案 0 :(得分:1)
你能提供更多信息(哪些模块?)。通常,我可能建议调用模块函数来创建内容类型,而不是尝试以编程方式通过表单传递它。这样你就不用担心实现了,并且可以相信如果模块工作,它也适用于你的脚本:)
当然这确实会将您的模块与他们的模块联系起来,因此其功能的任何变化都会影响您的模块。 (但是,如果他们也更新了他们的数据库结构,你就会冒这个风险)
离。
// 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);
现在我认为此时它应自动调用simplefeed的hook_insert()
。如果没有,那么继续2.但我会检查它是否已经成功。
自己打电话!
simplefeed_insert($node);
edit2 :drupal_execute()
也不是一个坏主意,因为您可以获得一些验证,但这样您就不必处理表单API了。不舒服。我很确定node_save()
无论如何都会调用所有钩子,所以你真的只需要在这个方法下执行第1步。
答案 1 :(得分:1)
drupal api提供了drupal_execute()来做到这一点。我建议你不要直接调用函数来创建节点(除非有性能原因)。通过使用drupal_execute(),将调用其他模块中的所有正确挂钩,并且您的代码更有可能继续使用drupal的未来版本。
请注意,使用此方法的一个经典错误并非首先调用类似
的内容 module_load_include('inc', 'node', 'node.pages')
将加载节点创建表单的代码。
直接调用node_save通常被认为已弃用,可能会在将来版本的drupal中使用破坏的代码。
有一个很好的例子