एकाधिक फॉर्म सबमिशन (सर्वर साइड) को रोकें


9

मैं एक ऐसी समस्या में चल रहा हूँ जहाँ एक उपयोगकर्ता कई बार फॉर्म एपीआई द्वारा निर्मित किसी भी फॉर्म को जमा कर सकता है (तेजी से क्लिक करने पर कई अनुरोधों के परिणामस्वरूप)।

मैंने बटन को अक्षम करने के मूल क्लाइंट साइड (जावास्क्रिप्ट) समाधान में डाल दिया है, लेकिन मैं उत्सुक हूं कि इस स्थिति को रोकने के लिए सबसे अच्छा तरीका क्या है।

क्या इसे संभालने के लिए Drupal के फॉर्म टोकन सिस्टम का उपयोग करने का एक अनुशंसित तरीका है? विशेष रूप से एक वैश्विक रूप समाधान (यानी, हुक_फॉर्म_ल्टर ()) का उपयोग करके हर फॉर्म में एक कस्टम सत्यापनकर्ता जोड़ रहा है।

मेरा दृष्टिकोण अब तक कुछ इस तरह रहा है:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $form['#validate'][] = 'mymodule_form_validate';
}

function mymodule_form_validate(&$form, &$form_state){
  //initialize form array
  if (!isset($_SESSION['submitted_forms'])){
    $_SESSION['submitted_forms'] = array();
  }

  $form_token = $form_state['values']['form_token'];
  if ( isset($_SESSION['submitted_forms'][$form_token]) && $_SESSION['submitted_forms'][$form_token] = TRUE ){
    form_set_error('name]', 'This form has already been submitted');
  }
  else{
    $_SESSION['submitted_forms'][$form_token] = TRUE;
  }
}

मैं उस मुसीबत में चल रहा हूँ जहाँ form_token फ़ॉर्म के लिए अद्वितीय नहीं है - ऐसा लगता है कि चाहे जो भी हो वही रहना चाहिए। मैं शायद गलत समझ रहा हूं कि फॉर्म एपी की भव्य योजना में टोकन क्या है।

किसी भी जानकारी की सराहना की है!


अनुवर्ती के रूप में, मैंने टोकन के बजाय $ form_state ['form_build_id'] का उपयोग करना शुरू कर दिया। अगर मैं उसी फॉर्म को दो बार आईडी बनाता हूं, तो कहीं न कहीं इस फॉर्म को फिर से बनाया जाता है और किसी भी तरह से प्रोसेस किया जाता है।
प्राइरीहिपो

जवाबों:


8

मुझे वही समस्या थी और ड्रुपल से लॉकिंग तंत्र का उपयोग करके इसे ठीक करने में कामयाब रहा

मान्य फ़ंक्शन में मैंने उपयोग किया:

function mymodule_custom_form_validate($form, &$form_state){
  if (lock_acquire('your_custom_lock_name')) {
    // long operations here
  } else {
    form_set_error("", t("You submitted this form already."));
  }
}

और सबमिट फ़ंक्शन में मैंने लॉक जारी किया:

function mymodule_custom_form_submit($form, &$form_state){
  // submit code
  lock_release('your_custom_lock_name');
}

1

यहां आपको मॉड्यूल वजन पर विचार करना चाहिए:

  1. एक माड्यूल (पहले_मॉडल) दें, जिसमें मॉड्यूल वज़न ऋणात्मक अधिकतम_वैल्यू (-२००० हो सकता है) यहां इसे निम्नलिखित कोड के साथ हुक_फॉर्म_ल्टर () को लागू करना चाहिए। अब आपको सत्यापित करना चाहिए कि फॉर्म पहले से जमा है या आपके कोड द्वारा।
   function first_module_form_alter(&$form, &$form_state, $form_id)
    {
      $form['#validate'][] = 'mymodule_form_validate';
    }
function mymodule_form_validate(&$form, &$form_state){
  //a($form_state);
  //initialize form array
  if (!isset($_SESSION['submitted_forms'])){
    $_SESSION['submitted_forms'] = array();
  }

  $form_token = $form_state['values']['form_id'];
  if ( isset($_SESSION['submitted_forms'][$form_token]) && $_SESSION['submitted_forms'][$form_token] = TRUE ){
    form_set_error('name]', 'This form has already been submitted');
  }
  else{
    $_SESSION['submitted_forms'][$form_token] = TRUE;
  }
}
  1. दूसरा_मॉड्यूल जिसमें अत्यधिक उच्च मूल्य का भार है। क्या आपको मॉड्यूल में सबमिट कॉलबैक जोड़कर सत्र को रद्द करना चाहिए

function second_module_form_alter (& $ form, & $ form_state, $ form_id) {$ form ['# submit'] [] = ’mymodule_form_submit’; }

function mymodule_form_submit(&$form, &$form_state){

  $form_token = $form_state['values']['form_id'];
  unset($_SESSION['submitted_forms'][$form_token]);

}

1

यदि आप सभी रूपों पर यह कार्यक्षमता चाहते हैं और कोडिंग के बिना अधिक नियंत्रण छिपाएँ सबमिट करें बटन मॉड्यूल पर एक नज़र रखना ।

विशेषताएं:

  1. क्लिक करने के बाद सबमिट बटन को छिपाएं या अक्षम करें
  2. प्रतीक्षा करते समय एक संदेश और / या छवि प्रदर्शित करें

5
Submt बटन छिपाएँ सर्वर साइड समाधान नहीं है। मॉड्यूल के विवरण से: "जावास्क्रिप्ट के साथ ब्राउज़रों के लिए अक्षम इस मॉड्यूल का कोई प्रभाव नहीं होगा।" drupal.org/project/hide_submit
फ्रेडरिक

0
$form['submit'] = array(
  '#type' => 'submit',
  '#value' => t('Save'),
  '#attributes' => array(
    'onclick' => 'javascript:var s=this;setTimeout(function(){s.value="Saving...";s.disabled=true;},1);',
  ),
);

आशा है कि यह मदद करेगा ..

या आप सबमिट बटन के कई क्लिकों को रोक सकते हैं और ड्रुपल में एक मॉड्यूल Hide सबमिट बटन है

कुछ उपयोगकर्ता गलती से सबमिट बटन पर क्लिक करते हुए एक बार से अधिक समय तक अपने पद के सहेजे जाने की प्रतीक्षा करते हैं। कुछ मामलों में इसके परिणामस्वरूप डुप्लिकेट पोस्टिंग या ई-कॉमर्स ऑर्डर डुप्लिकेट हो सकते हैं।


-1

यह मेरी समस्या पहले भी थी। इसका मेरा समाधान JS के माध्यम से बटन को निष्क्रिय करना है।

।मापांक:

/**
 * Implementation of hook_init().
 */
function myModule_init(){
if (arg(0) == 'node' && (arg(2) == 'edit' || arg(1) == 'add')) {
    //hide btn when clicked on article nodes
    drupal_add_js(drupal_get_path('module', myModule') . '/js/disable-submit.js');
}

जे एस:

Drupal.behaviors.module_disable_submit = function (context) {

/* 
 * Disable keypress on form fields.
 * Prevent browser to reload when pressing enter in input fields 
 */


$('.buttons input:submit').click(function() {
  $('.buttons input:submit').hide();
  $('#node-form .buttons').prepend('<input type="submit" style="margin:1px 0; box-shadow:0 1px 1px #DDDDDD; border-radius:3px 3px 3px 3px; background:url(/sites/all/themes/rubik/images/bleeds.png) repeat-x scroll 0 -41px #F4F4F4; border-color:#DDDDDD #DDDDDD #CCCCCC; border-style:solid; border-width:1px; color:#B8A98F; cursor:default; font-weight:normal; padding:2px 10px; text-align:center;" value="Saving..." name="op" onclick="return false;" />');
  if ('.buttons input:submit') {
    $('.buttons input:submit').keypress(function() {
      $('.buttons input:submit').parents("form").submit();
      $('.buttons input:submit').hide();
    });
  }
});
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.