2009-10-14 24 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函數可以幫到你。