2017-09-24 35 views
2

ユーザーがJQueryを使用してサブミットボタンをクリックしたときにフォームを送信しています。しかし、それをクリックすると同じフォームを複数回送信してしまい、なぜこのようなことが起こっているのかわかりません。たくさんのことを試しましたが、失敗しました。以下はコードです。同じPHP関数がJSを使用して複数回実行されています。サブミット

下記のPHP、Javascript、HTMLコードを追加しています。

HTML:

<div class="box-body big"> 
     <form id="pdf-generator" action="<?= $this->base; ?>/companies/generatePdf/" method="post" target="_blank"> 

      <select id="pdfname" class="form-control" name="pdfname"> 

       <option value="showfields">---Show Available Fields---</option> 
       <option value="29300____test1.pdf">29300____test1.pdf</option> 
      </select> 
      <input type="hidden" name="fieldPairs" id="fieldPairs" value="" /> 
     </form> 


     <div class="divide-12"></div> 
     <button id="genPdfFormButton" type="button" class="btn btn-success pull-right">Generate PDF</button> 
     <div class="divide-12"></div> 
</div> 

JS:

 $('#genPdfFormButton').click(function(){ 

     var elements = document.getElementsByTagName("input"); 
     var textAreas = document.getElementsByTagName("textarea"); 

     var list = ""; 
     var pair = ""; 

     document.getElementById("fieldPairs").value = ''; 
     //all input fields 
     for (var i=0; i<elements.length; i++) { 
      pair = elements[i].id + "=" + elements[i].value; 
      list = (list.length == 0) ? pair : list + "|" + pair; 
     } 
     //all textareas 
     for (var i=0; i<textAreas.length; i++) { 
      pair = textAreas[i].id + "=" + textAreas[i].value; 
      list = (list.length == 0) ? pair : list + "|" + pair; 
     } 

     document.getElementById("fieldPairs").value = list; 

     $('#pdf-generator').submit(); 
    }); 

PHP:このコードは、私が機能するので、同じログメッセージを複数回見ることができますPHPの関数を呼び出す

public function generatePdf() { 
    $this->log("==>===============[start]=====================", 'debug'); 
    $this->autoRender = false; 

    $pdfName = $this->request->data['pdfname']; 

    //get the submitted data 
    $formData = $this->processFormData($this->request->data['fieldPairs']); 

    if($pdfName == "showfields") { //show only form data fields 
     var_dump($formData); 
    } else { //generate PDF file 

     $this->log("==> gonna call generatePdf <== ", 'debug'); 
     $pdf = new PdfForm(PDF.$pdfName, $formData); 
     $pdf->download(); 
    } 
} 

複数の時間と呼ばれています。

p.s:この問題は、送信ボタンを複数回クリックしたことによるものではありません。

+0

初心者の方は、リクエストメソッドに頼ることなくリクエストデータに基づいてアクションを実行しないでください!つまり、[** POSTリクエストであることを確認する**](https://book.cakephp.org/2.0/en/controllers/request-response.html#inspecting-the-request)無効なリクエスト**](https://book.cakephp.org/2.0/en/controllers/request-response.html#CakeRequest::allowMethod)。 ps、常にあなたの正確なCakePHPのバージョン( 'vendor/cakephp/cakephp/VERSION.txt'や' lib/Cake/VERSION.txt'の最後の行)をお伝えください - ありがとう! – ndm

+0

私のcakephpバージョンは2.4.6です。当初、私は問題はJSと関係がありますが。しかし、今私は私がpdf =新しいPdfForm(PDF。$ pdfName、$ formData)を取り除くと実現しました。コードでは、ログを1回だけ出力します。しかし、このコードがあると、複数回実行されます。どんな手掛かり ? – ManinGreen

答えて

0

を提出することをクリックするたびに無効にする必要がありますので、多くの時間を無駄にし、多くのコードをデバッグした後、私は問題を修正しました。それは私のブラウザにインストールされているIDM(Internet Download Manager)の拡張機能によるものです。私はそれを無効にし、すべてが期待どおりに機能し始め、機能は現在1回しか実行されていません。

phew!

1

あなたはそのボタンをユーザーが

$('#genPdfFormButton').click(function(){ 
    $(this).prop('disabled', 'disabled'); 
    ... 
} 
+0

これは解決策ではありません。問題は、フォームボタンを複数回クリックすることによるものではありません。 – ManinGreen

+0

クリックイベントをリッスンするのではなく、フォーム送信時に送信ボタンを無効にする方がよいでしょう。フォームデータが複数回送信されないことが重要な場合は、これが良い方法です。しかし、最初に修正が必要なOPのコードにバグがあるようです。 – drmonkeyninja

+0

'$ pdf-> download();'には、ブラウザにファイルをダウンロードさせるコードがあります。私はヘッダーを使用してそれを強制しており、ヘッダーの1つが問題を作り出しています。ファイルを削除したり、ファイル拡張子をPDFから何か他のものに変更したりすると、関数が何度も何度も呼び出されない場合、 'header(" Content-Disposition:attachment; filename = {$ finalFileName} ")どんな手掛かり ? – ManinGreen

関連する問題