2012-05-15 2 views
1

Использование Drupal 7, я столкнулся с проблемой, когда Drupal не разрешил представления форм узлов дважды. Сценарий:Разрешение формы узла для отправки более одного раза

  • Я показываю форму узла и использую структуру ajax для Drupal для обработки представления через функцию 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

whefrer, чтобы поместить этот код и как его называть – Rami

0

hook_allow_multisubmit не Existe в Drupal 7

0

Это была проблема, я столкнулся в последнее время, так что я буду добавлять "Фуллера версию ответа Марк Вайц, который действительно работает.

Сначала вам нужно будет изменить форму узла для содержимого, типа вам требуется

//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. 

} 

Очевидно, что это не без риска, как теперь наши избранные люди типа контента могут наложиться друг на другие работы. Предполагая, что они одновременно редактируют узел.

Смежные вопросы