1

使用 Drupal 7,我遇到了 Drupal 不允许节点表单提交两次的问题。场景:

  • 我显示一个节点表单并使用 Drupal 的 ajax 框架通过 use-ajax-submit 功能处理提交。

  • 我第一次提交表单时,它可以工作,没问题。

  • 第二次提交表单时,我收到以下消息:

    “此页面上的内容要么已被其他用户修改,要么您已经使用此表单提交了修改。因此,您的更改无法保存。”

我知道这是预期的行为,并且正在尝试找到解决方法。我似乎记得 Drupal 6 中有一个表单属性,它允许在构建表单时多次提交,但在 Drupal 7 中找不到任何关于它的信息。

希望任何人都可以分享任何建议。

4

3 回答 3

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;

}
于 2012-05-16T02:10:24.297 回答
0

drupal 7 中不存在 hook_allow_multisubmit

于 2013-06-07T09:43:49.910 回答
0

这是我最近遇到的一个问题,所以我将添加一个“更完整”版本的 Mark Weitz 的答案,它确实有效。

首先,您需要为您键入的内容更改节点形式

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

}

显然,这并非没有风险,因为现在我们选择的内容类型人们能够覆盖彼此的工作。假设他们正在同时编辑节点。

于 2015-05-08T11:56:24.833 回答