1

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

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

任何帮助表示赞赏。

4

2 回答 2

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

    现在我认为hook_insert()它应该在这一点上自动调用 simplefeed 。如果没有,那么继续 2。但我会检查它是否已经解决了。

  2. 自己打电话!

    simplefeed_insert($node);
    

edit2drupal_execute()这也不是一个坏主意,因为您可以取回一些验证,但是如果您不满意,这样您就不必处理表单 API。我很确定node_save()无论如何都会调用所有钩子,所以你应该只需要在这个方法下执行第 1 步。

于 2008-11-14T22:06:36.247 回答
1

drupal api 提供了drupal_execute()来做到这一点。我建议您避免直接调用函数来创建节点(除非有性能原因)。通过使用 drupal_execute() 将调用其他模块中的所有正确钩子,并且您的代码更有可能继续在未来版本的 drupal 中工作。

请注意,使用此方法的一个经典错误不是首先调用类似

module_load_include('inc', 'node', 'node.pages')

这将为您的节点创建表单加载代码。

直接调用 node_save 通常被认为不推荐使用,并且可能会在未来版本的 drupal 中留下损坏的代码。

这个摇篮曲帖子有一个很好的例子

于 2008-11-14T22:55:37.130 回答