2012-03-30 55 views
1

我已經創建這樣一種形式:Drupal的形式作用

function create_custom_form($form, &$form_state) { 
    $form['#action'] = "#"; 
     .... 
} 

function create_custom_form_validate($form, &$form_state) { 
     .... 
} 

function create_custom_form_submit($form, &$form_state) { 
     .... 
     if(..) 
      drupal_goto('abc'); 
     else 
      drupal_goto('xxx'); 
} 

當我提交此表的Drupal之前去行動,並宣讀我的功能之後...我怎樣才能繞過動作形式和只讀一個_submit函數?

+0

通過$ form ['submit'] = array('create_custom_form_submit');'添加處理程序到您的提交按鈕。 – 2012-03-30 09:48:14

回答

2

請勿使用drupal_goto因爲可能會有更多「提交」回調執行。 drupal_goto函數會中斷這些。

相反,使用$form_state['redirect'] = ... http://api.drupal.org/api/drupal/includes!form.inc/function/drupal_redirect_form/7

function create_custom_form_submit($form, &$form_state) { 
     .... 
     if(..) 
      $form_state['redirect'] = 'abc'; 
     else 
      $form_state['redirect'] = 'xxx'; 
} 

作爲該函數具有相同的格式ID(create_custom_form) - 與所附那麼這個功能將被自動執行,所以沒有必要在字「_submit」將任何提交回調添加到表單中。

如果你想要一個額外的函數來執行提交,那麼你應該按照Hamza的建議做,只有你的附加函數會有不同的名字。例如

function create_custom_form($form, &$form_state) { 
    $form['#action'] = "#"; 
    .... 
    // Add any additional callbacks to call before any redirects happen 
    $form['#submit'][] = 'create_custom_form_additional_submit_callback';  
    $form['#submit'][] = ... 
} 

function create_custom_form_additional_submit_callback($form, &$form_state) { 
    // Do something before redirect 
    ... 
} 

在上面的例子:

  • create_custom_form_additional_submit_callback

AND

  • create_custom_form_submit(因爲其得到了與 '_submit' 同名所附)

會執行,只有當他們都完成後纔會執行重定向。

+0

我試過惠特$ form_state ['重定向']但我有同樣的問題...如果我改變形式行動惠特虛假頁面Drupal重定向在這個假頁面,並不遵循重定向或轉到.. 。我認爲在執行動作和檢查_submit之後... – Stefano 2012-03-30 14:50:41

+0

如果您將表單動作設置爲散列「#」,則該頁面將提交給自己,但服務器和drupal將永遠不會看到您的「#」,即使它在URL不是您的服務器的可見字符。由於Drupal正在尋找一個它永遠找不到的地方,你的提交鉤子永遠不會被觸發。如果您希望檢測表單是否由您網頁上的其他腳本提交,那麼爲什麼不將該操作設置爲「?submitted = 1」 – 2012-03-30 18:51:05