【问题标题】:Drupal - Automate a Content Form SubmissionDrupal - 自动提交内容表单
【发布时间】:2008-11-14 21:55:01
【问题描述】:

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

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

感谢任何帮助。

【问题讨论】:

    标签: php drupal


    【解决方案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 是特定节点的主键。因为这是一个实际的节点,您可能需要执行两个操作。

    1. 以编程方式创建节点

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

    2. 自己调用!

      simplefeed_insert($node);
      

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      this lullabot post 有一个很好的例子

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2020-11-19
      • 2012-02-02
      相关资源
      最近更新 更多