Drupal - 自动提交内容表单

时间:2008-11-14 21:55:02

标签: php drupal

我想以编程方式(使用php)填写现有的drupal表单来创建一个包含在贡献模块中的内容类型。

详细信息:模块为SimpleFeed,内容类型为Feed。我想调用模块的函数来完成这个。我感兴趣的方法是hook_insert,它似乎需要vid和nid,我不确定它们是什么。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

你能提供更多信息(哪些模块?)。通常,我可能建议调用模块函数来创建内容类型,而不是尝试以编程方式通过表单传递它。这样你就不用担心实现了,并且可以相信如果模块工作,它也适用于你的脚本:)

当然这确实会将您的模块与他们的模块联系起来,因此其功能的任何变化都会影响您的模块。 (但是,如果他们也更新了他们的数据库结构,你就会冒这个风险)

离。

// your file.php

function mymodule_do_stuff() {
    cck_create_field('something'); // as an example, i doubt this
                                   // is a real CCK function :)
}

修改vidnid是节点ID,vid是修订ID,nid是特定的主键节点。因为这是一个实际的节点,您可能需要做两个操作。

  1. 以编程方式创建节点

    您必须为所有确切字段(表nodenode_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.但我会检查它是否已经成功。

  2. 自己打电话!

    simplefeed_insert($node);
    
  3. 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中使用破坏的代码。

this lullabot post

有一个很好的例子