お世話になります。
ajaxを使ってファイルを読み込む処理1が正常終了し、ダイアログで「OK」を選択した場合に
改めてファイルを読み込む+登録を行う処理2を実行したいと考えています。
処理自体は行えるのですが、どうやら処理2が2回処理されてしまっているようです。
下記のように記述しているのですがどこを変更したら良いのでしょうか?
根本的に記述の仕方が間違っているのでしょうか?
アドバイス等よろしくお願いします。
JavaScript
javascript
1// test.js 2/* 初期処理 */ 3function imgReadDep() { 4 document.getElementById("filReadDep").value = ""; 5 document.getElementById("filReadDep").click(); 6} 7function chgReadDep() { 8 var fd = new FormData(); 9 if ($("input[name='filReadDep']").val() !== '') { 10 fd.append("file", $("input[name='filReadDep']").prop("files")[0]); 11 } 12 var selectTable = $("#hidReadDep").val(); 13 fd.append("select_table", $("#hidReadDep").val()); 14 var postData = { 15 type : "POST", 16 url : $('#check-csv-url').text(), 17 data : fd, 18 dataType : 'json', 19 processData : false, 20 contentType : false 21 }; 22 readCsvCheckAjax(postData); 23} 24 25/* 処理1 */ 26function readCsvCheckAjax(postData) { 27 $.ajax(postData).done(function(data) { 28 if (data.check) { 29 if (!window.confirm("処理1を実行してよろしいですか?")) { 30 alert("実行しませんでした"); 31 return; 32 } 33 readCsvRegitAjax(); 34 } else { 35 alert("処理1の実行に失敗しました。"); 36 } 37 }).fail(function(data) { 38 alert("処理1の実行に失敗しました。"); 39 }).always(function(data) { 40 }); 41} 42 43/* 処理2 */ 44function readCsvRegitAjax() { 45 var fd = new FormData(); 46 if ($("input[name='filReadDep']").val() !== '') { 47 fd.append("file", $("input[name='filReadDep']").prop("files")[0]); 48 } 49 var selectTable = $("#hidReadDep").val(); 50 fd.append("select_table", $("#hidReadDep").val()); 51 var postData = { 52 type : "POST", 53 url : $('#regit-dep-csv-url').text(), 54 data : fd, 55 dataType : 'json', 56 processData : false, 57 contentType : false 58 }; 59 $.ajax(postData).done(function(data) { 60 if (data.check) { 61 alert("処理2の処理は正常に終了しました。"); 62 } else { 63 alert("処理2の実行に失敗しました。"); 64 return; 65 } 66 }).fail(function(data) { 67 alert("処理2の実行に失敗しました。"); 68 }).always(function(data) { 69 }); 70}
追記:
記載できていませんでしたが、cakephp3を使用しており、
post後にcontrollerの処理を行うような仕様となっています。
現状としては処理1が行われた後で「処理1を実行してよろしいですか?」のダイアログが表示され、
キャンセルを押すとそのまま処理が終了します。
OKを押すと処理2が実行され「処理2の処理は正常に終了しました。」が2回表示されます。
表示だけではなく実際に処理2も2階行われており、データも2件登録されている状態となっています。
PGは以下のような記述をしています。
ctp
PHP
1<?php 2// index.ctp 3<html> 4<head> 5<meta charset="utf-8"> 6<link rel="stylesheet" href="/test/css/jquery-ui.css"> 7<script src="/test/js/jquery-3.2.1.js"></script> 8<script src="/test/js/jquery-ui.js"></script> 9<link rel="stylesheet" href="/test/css/style.css"> 10<link rel="stylesheet" href="/test/css/test.css"> 11<script src="/test/js/common.js"></script> 12<script src="/test/js/test.js"></script> 13</head> 14<body> 15<span id="check-csv-url" class="DisplayNone"> 16 <?= $this->Url->build(['action' => 'checkCsv']) ?> 17</span> 18<span id="regit-dep-csv-url" class="DisplayNone"> 19 <?= $this->Url->build(['action' => 'regitDepCsv']) ?> 20</span> 21 22<?=$this->Form->create(null, ['type' => 'file','url' => ['action' => 'check_csv'],'onsubmit' => 'return false;', 'name' =>'frmReadDep', 'id' =>'frmReadDep', 'enctype' => 'multipart/form-data' ])?> 23 <input id="filReadDep" name="filReadDep" type="file" value="" onChange="chgReadDep()" class="DisplayNone" /> 24 <button class="btnMa mt5px" onClick="imgReadDep()"><?= $this->Html->image("buttons.png")?></button> 25<?= $this->Form->end(); ?> 26<input type="hidden" id="hidReadDep" value="dep"> 27</body> 28</html>
controller
PHP
1<?php 2 3namespace App\Controller; 4 5use Cake\Core\Configure; 6use Cake\ORM\TableRegistry; 7use Cake\Event\Event; 8use Cake\Error\Debugger; 9use App\Controller\AppController; 10 11class TestController extends AppController 12{ 13 public function index(...$path) 14 { 15 } 16 17 /* 18 * CSV内容チェック 19 */ 20 public function checkCsv(...$path) 21 { 22 $result = [ 23 "check" => false, 24 "result" => false, 25 "message" => "" 26 ]; 27 28 // 処理 29 // 処理に成功した場合に 30 // $result['check'] = true; 31 $this->autoRender = false; 32 echo json_encode($result); 33 } 34 35 public function index(...$path) 36 { 37 } 38 39 /* 40 * CSV内容登録 41 */ 42 public function readDepRegist(...$path) 43 { 44 $result = [ 45 "check" => false, 46 "result" => false, 47 "message" => "" 48 ]; 49 50 // 処理 51 // 処理に成功した場合に 52 // $result['check'] = true; 53 $this->autoRender = false; 54 echo json_encode($result); 55 } 56}
回答3件
あなたの回答
tips
プレビュー