如何以编程方式加载给定节点的表单,修改它的值,然后提交它?

时间:2012-10-23 15:01:59

标签: drupal-7

当我点击某个论坛节点的“编辑”标签时,我会看到一个显示的表单,如下所示:

Edit view of a forum node

当我在“论坛” - 下拉菜单中选择任何选项(从而选择论坛容器)并单击“提交”时,论坛节点将移动到所选的论坛容器。

现在,我需要做的是从代码中的某个位置以编程方式触发所有这些。我必须将很多论坛节点移动到很多不同的论坛容器中,这就是我需要这样做的原因。

我在考虑如何做到这一点是:

  1. 加载“forum_node_form”的表单数据,以便包含特定论坛节点的数据(论坛节点我想移动到另一个论坛容器)。
  2. 将参数$ form_state ['values'] ['forum_tid']更改为论坛容器的tid我想将论坛节点移动到。
  3. 使用drupal_form_submit()保存表单数据。
  4. 然而,这证明比我预期的更难。有人能指出我这样做的正确方法是什么?

    到目前为止,我使用var_export($ form_state ['values'],true)在手动测试期间记录了$ form_state ['values']的内容。然后我将$ form_state ['values'] ['forum_tid']更改为论坛容器的tid我想将论坛移动到然后使用drupal_form_submit('forum_node_form',$ form_state)提交数据; < / p>

    导致错误消息:

      

    警告:call_user_func_array()期望参数1是有效的回调,函数'node_form'未找到或drupal_retrieve_form()中的函数名无效(/"PATH"/includes/form.inc)的第795行。

    我找到了一些使用form_load_include()的建议,因此添加了这一行:

    form_load_include($form_state, 'inc', 'node', 'node.pages');

    ...导致一些新的错误:

      
        
    • 警告:node_form()中的node_form()缺少参数3(/"PATH"/modules/node/node.pages.inc)第83行。
    •   
    • EntityMalformedException:在类型node的实体上缺少bundle属性。在entity_extract_ids()中(/"PATH"/includes/common.inc)第7539行。
    •   

    node_form()的参数3是节点对象$ node,我不知道如何解决这个问题,我实际上觉得这不是解决整个问题的正确方法。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以只加载节点对象(使用node_load),更改论坛tid值并保存节点(使用node_save),而不是经历加载节点表单的痛苦更新它。

示例:

<?php

function mymodule_updatemynode($nid,$new_forum_tid){
    if ($node = node_load($nid)){
        // not exactly sure what the forum tid field is called
        // just an example
        $node->field_forum_tid['und'][0]['#value'] = $new_forum_tid;
        node_save($node);
    }
}