একাধিক ফর্ম জমাগুলি প্রতিরোধ করুন (সার্ভার সাইড)


9

আমি এমন সমস্যায় পড়ছি যেখানে কোনও ব্যবহারকারী একাধিকবার ফর্ম এপিআই দ্বারা নির্মিত যে কোনও ফর্ম জমা দিতে পারে (একাধিক অনুরোধের ফলে দ্রুত ক্লিক করে)।

আমি বোতামটি নিষ্ক্রিয় করার প্রাথমিক ক্লায়েন্ট সাইড (জাভাস্ক্রিপ্ট) সমাধানটি রেখেছি, তবে আমি উত্সাহিত হয়েছি যে এই পরিস্থিতি রোধ করার সর্বোত্তম পদ্ধতিটি সার্ভারের দিক থেকে কী।

এটি হ্যান্ডল করার জন্য দ্রুপালের ফর্ম টোকেন সিস্টেমটি ব্যবহার করার জন্য কি কোনও প্রস্তাবিত উপায় আছে? বিশেষত একটি বিশ্বব্যাপী ফর্ম সমাধান (যেমন, হুক_ফর্ম_াল্টার () ব্যবহার করে প্রতিটি ফর্মের জন্য একটি কাস্টম ভ্যালিডেটার যুক্ত করা)।

আমার এ পর্যন্ত এই পদ্ধতির কিছু ছিল:

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_state ['form_build_id'] ব্যবহার শুরু করেছি। যদি আমি একই ফর্ম বিল্ড আইডিটি দু'বার জমা করি তবে কোথাও কোথাও যেভাবে ফর্মটি পুনর্নির্মাণ এবং প্রক্রিয়াজাত করা যায় along
প্রিরিহিপ্পো

উত্তর:


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. একটি মডিউল (প্রথমে_ মডিউল দিন) যার মডিউলের ওজন নেতিবাচক সর্বাধিক_মূল্য হওয়া উচিত (-২০০০ হতে পারে) এখানে নিম্নলিখিত কোড সহ হুক_ফর্ম_াল্টার () প্রয়োগ করা উচিত ow এখন আপনার কোডটি দিয়ে ফর্মটি ইতিমধ্যে জমা দেওয়া হয়েছে কি না তা যাচাই করা উচিত।
   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. সম্ভাব্য উচ্চ মানের ওজনযুক্ত দ্বিতীয়_মডিউল e এখানে আপনার একটি মডিউলে জমা কলব্যাক যোগ করে সেশনটি আনসেট করা উচিত

ফাংশন সেকেন্ড_মডিউল_ফর্ম_াল্টার (& $ ফর্ম, & $ ফর্ম_স্টেট, $ ফর্ম_আইডি) $ $ ফর্ম ['# সাবমিট'] [] = 'মায়োমডিউল_ফর্ম_সাম্বিত'; }

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

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

}

1

আপনি যদি সমস্ত ফর্মের এই কার্যকারিতাটি চান এবং কোডিং ছাড়াই আরও নিয়ন্ত্রণ করতে চান তবে হাইড সাবমিট বাটন মডিউলটি একবার দেখুন।

বৈশিষ্ট্য:

  1. ক্লিক করার পরে সাবমিট বাটনটি লুকান বা অক্ষম করুন
  2. অপেক্ষা করার সময় একটি বার্তা এবং / অথবা চিত্র প্রদর্শন করুন

5
হাইড সাবমিট বাটন মডিউলটি কোনও সার্ভার সাইড সমাধান নয়। মডিউলটির বর্ণনা থেকে: "জাভাস্ক্রিপ্ট অক্ষম ব্রাউজারগুলির জন্য এই মডিউলটির কোনও প্রভাব পড়বে না।" 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);',
  ),
);

আশা করি এটি সাহায্য করবে ..

অথবা আপনি জমা দেওয়ার বোতামের একাধিক ক্লিক রোধ করাতে পারেন এবং দ্রুপালের একটি মডিউল হাইড সাবমিট বাটন রয়েছে

কিছু ব্যবহারকারী দুর্ঘটনাক্রমে তাদের পোস্টটি সংরক্ষণের জন্য অপেক্ষা করার সময় সাবমিট বাটনে ক্লিক করুন। কিছু ক্ষেত্রে এটি ডুপ্লিকেট পোস্টিং বা ই-বাণিজ্য অর্ডার সদৃশ করতে পারে।


-1

এটিও আমার আগে সমস্যা ছিল। এর আমার সমাধানটি হল জেএসের মাধ্যমে বোতামটি অক্ষম করা।

.module:

/**
 * 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();
    });
  }
});
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.