2011-06-29 13 views
3

我有mymodule_field_widget_form(),它創建了一個自動完成的文本字段,以及3個用於自定義字段的按鈕。在2個按鈕上,我使用調用自定義ajax命令的ajax回調函數。當函數執行進入任一按鈕的回調函數時,$ form_state ['triggering_element']始終是相同的,最後一個按鈕(表單元素...?)的形式由上面的鉤子創建。我想獲得實際觸發回調的元素。這是可能的,這個自定義字段被添加到一個內容類型不止一次,這就是爲什麼它很重要。自定義ajax命令根據幾個因素創建一個帶有iframe或純html內容的jQuery ui對話框,因此我認爲沒有必要重新呈現按鈕被觸發的整個表單。其實沒有任何地方重新渲染,也許這就是問題所在?

乾杯

回答

8

按照Spudley的建議設置#default_value,並將#name屬性設置爲獨特的參數(使用參數$delta)。

+1

這個工程,謝謝! – Temaruk

+1

在我的情況下,設置'#name'就夠了。 – Arild

5

當函數執行進入任一按鈕的回調函數中,$ form_state [「triggering_element」]總是相同的,最後一個按鈕

這是不幸的是如何Drupal的形式API的作品。如果您在表單上有幾個提交按鈕,您有時無法分辨哪個按鈕被點擊。

首先,看this answer on Drupal.org我認爲這可能會幫助你:

看着你的形式設置代碼。在定義各種按鈕的位置,將'#value'更改爲'#default_value'。這將允許Drupal認識到字段值(即表單提交值)可以改變,因此不會固定到最後一個按鈕的值,而不管哪個被點擊。


如果沒有幫助,這裏有一些其他的解決方案,可以幫助:

  1. 直視PHP的$_POST陣列,找出哪個按鈕被點擊。這有效,但違背了「Drupal方式」。 Drupal表單API的重點在於隱藏你的原始PHP功能。但是有時候這樣做可能會對它有所幫助。

  2. 將按鈕分成不同的形式。如果你不需要同時提交任何其他字段,這顯然只會起作用。

  3. 在您的表單上創建一個隱藏字段,並在提交表單之前立即使用Javascript填充單擊按鈕的名稱。

希望有所幫助。

+0

這部分解決了這個問題,並給了我一些想法,謝謝!經過一些調試後,我發現_form_builder_handle_input_element()函數檢查所有輸入元素,並且重複重置觸發元素,可能是因爲它無法區分它們(名稱,值)。感謝您的幫助! 我之所以不願意做隱藏字段的js人口是因爲我認爲它與Drupal Ajax API的目的衝突。 – Temaruk

+0

這是一個答案!我可以確認'#default_value'解決方案的工作原理! – Michiel

+0

感謝您的回答。我正在開發一個自定義的FAPI元素類型,它是一行文本字段,但多值,允許一個文本字段的網格。嘗試我可能的做法,當我在表單中使用我的元素時,刪除和添加按鈕不一致地將triggering_element作爲錯誤按鈕添加#name,#id和#default_value屬性不起作用。我可以看到我的按鈕提交和ajax回調中的$ _POST,現在它的功能就像一個魅力.... – jackrabbithanna

相關問題