2009-10-14 49 views
2

我正在构建一个基于Drupal的网站,需要将节点ID传递给单独的Web服务。这个Web服务处理文件上传到一个单独的服务器(从一个Drupal开启)。可能使用多步表单保存节点?

这会产生一个问题,如果我创建一个新节点,则在提交表单之前不会生成节点ID - 这意味着我无法附加这些文件,直到我保存节点并将其打开并重新编辑为止。我想删除该步骤。

是否有可能创建一个两步节点创建过程,其中节点的基础知识被提交并保存,然后表单重新指向第二步,在这里我可以附加文件?

我也会考虑启用AJAX的节点提交表单 - 但这似乎会增加更复杂的情况。

任何意见,例子将不胜感激!

回答

4

可以有一个多步骤的形式做到这一点。请参阅http://pingv.com/blog/ben-jeavons/2009/multi-step-forms-drupal-6-using-variable-functions为规范的方式来做到这一点(除了代码,也检查评论)。

你也可以通过向表单添加第二个提交处理程序来完成。第一个默认值(node_form_submit)将节点(包括附加文件)保存为标准的Drupal方式。第二个处理程序可以将文件上传到单独的服务器,上传错误检查,从Drupal数据库中删除文件等。您可以通过将其添加到表单的#submit property中来将额外的提交处理程序添加到Drupal 6表单中,表格定义或通过hook_form_alter/hook_form_FORM_ID_alter

+1

+1添加第二个提交回调 – 2009-10-14 17:58:01

+0

由于第二个提交回调已经可以访问'$ form_state ['nid']'中的nid,它也可以将$ form_state ['redirect']'改变为'node/[nid]/edit在提交后立即再次打开节点编辑表单(在第二次表单提交后需要检查新节点以防止重定向)。 – 2009-10-14 18:05:19

+0

谢谢!我已经构建了多步表单(连接到标准节点添加/编辑表单)。仍然努力争取$ form_state变量不被传递给我的验证器函数 - 我发现的例子都没有显示这个变量是如何传递的。 – PrairieHippo 2009-10-14 22:47:35

0

我碰到了完全相同的问题,并做了错误的方式。我自己添加了钩子。

http://drupal.org/node/313389

+0

@Daren:你的'postsave'nodeapi动作与'hook_nodeapi'的标准'insert'和'update'动作有什么不同?两者都在*节点被保留后发生,例如,通过插入操作,您已经拥有节点ID。 – 2009-10-14 17:23:20

+0

这是至少一年前我写这篇文章的时候,我永远无法得到插入的结果,以便为我所做的工作提供node_id。我知道它与文件附件有关。对不起,我无法提供更多帮助。 – 2009-10-14 20:58:14

2

根据你想要做什么,你可以在其'插入'操作上使用hook_nodeapi。它在成功创建节点后被触发,因此节点对象将包含新分配的nid。

注:API文档的措辞有点暧昧关于“插入”和“更新”的操作:

“插入”:正在创建 的节点(插入到数据库中)。

这听起来是正确的过程中间,而节点已经在这一点上创建

1

我猜node_save函数可以帮到你。