2012-05-15 111 views
1

使用Drupal 7時,我遇到了Drupal不允許提交兩次節點表單的問題。場景:允許節點表單多次提交

  • 我顯示一個節點表單並使用Drupal的ajax框架來處理通過use-ajax-submit功能進行的提交。
  • 我第一次提交表單,它的工作原理沒有問題。
  • 我第二次提交表單,我得到以下信息:

    「此頁面上的內容或者已被其他用戶修改,或者您已提交使用這種形式的修改,其結果是,您的更改無法保存。「

我明白這是預期的行爲,並試圖找到解決辦法。我似乎記得Drupal 6中有一個表單屬性,可以在表單建立時進行多次提交,但在Drupal 7中找不到任何關於它的任何內容。

會愛任何人可能需要共享的建議。

回答

1

我解決了這個問題!查看節點模塊,結果發現node_validate根據變量form_state中的值檢查上次提交的時間。我爲該表單編寫了一個自定義驗證處理程序,繞過了node_validate函數並允許節點表單多次提交。

/** 
* Sets up a node form so that it can be submitted more than once through an ajax interface 
* @param unknown_type $form 
* @param unknown_type $form_state 
*/ 
function MYMODULE_allow_multisubmit (&$form, &$form_state){ 

    // set this as a custom submit handler within a form_alter function 
    // set the changed value of the submission to be above the last updated time 
    // to bypass checks in the node_validate 
    $check = node_last_changed($form_state['values']['nid']); 
    $form_state['values']['changed'] = $check + 120; 

} 
+0

小孩把這個代碼,以及如何回調它 – Rami

0

hook_allow_multisubmit不要在Drupal 7

0

這是一個問題,我跑進最近existe,所以我會添加馬克·韋茲的答案的「更全面」版本,它確實工作。

首先,你需要改變的內容的節點形式鍵入您需要

//Implements hook_form_alter() 
function MYMODULE_form_alter(&$form, &$form_state, $form_id){ 

    //Check form is the node add/edit form for the required content type 
    if($form_id == "MYCONTENTTYPE_node_form"){ 

     //Append our custom validation function to the forms validation array 
     //Note; We must use array_unshift so our function is called first. 
     array_unshift($form['#validate'], 'my_custom_validation_function'); 

    } 

} 

我們定義的自定義驗證函數來解決這些錯誤:本

「內容頁面已被其他用戶修改,或者您已經使用此表單提交了修改,因此您的更改無法保存。「

//Our custom validation function 
function my_custom_validation_function($form, &$form_state){ 

    //Drupal somewhere in this validation chain will check our $form_state 
    //variable for when it thinks the node in question was last changed, 
    //it then determins when the node was actually changed and if the $form_state 
    //value is less than the drupal value it throws the 'Cant edit' error. 
    //To bypass this we must update our $form_state changed value to match the actual 
    //last changed value. Simple stuff really... 

    //Lets do the above ^^ 
    $form_state['values']['changed'] = node_last_changed($form_state['values']['nid']); 

    //Any other extra validations you want to do go here. 

} 

顯然,這不是沒有它的風險,因爲現在我們所選擇的內容類型的人都能夠覆蓋彼此的工作。假設他們正在同時編輯節點。