質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1074閲覧

【CakePHP、JavaScript】ポスト送信時スクリプトを挟むと、なぜ遷移が変わってしまうのでしょうか?

pecchan

総合スコア555

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/03/13 08:18

編集2019/03/14 01:19

cakephp(2.7.8)
PHP 5.6
MySQL 5.6

お問い合わせページを作りました。
1.入力画面
2.入力内容の確認画面
3.結果画面

1の入力画面にてお問い合わせ内容を入力、
2の確認画面にて送信するとメール送信し、
3の結果画面に遷移して終わりです。

ここで、2の確認画面にて送信ボタンが二重ポストできるため、
昨日こちらで色々と教えていただきスクリプトで制御を入れました。

【jQuery】2重ポスト禁止したい

ところが、
2の確認画面にて送信ボタンを押すと、
3の結果画面ではなく、1の入力画面に遷移してしまうようになりました。
※以前はちゃんと3の結果画面に遷移してました

そのため、ずっと入力画面と確認画面の永久ループです(_)?

?????
これは、内部でどういうことが起こっているのでしょう?
何が起きているのかだけでも教えていただければ幸いです。

宜しくお願い致します。

コントローラ

PHP

1<?php 2 3App::uses('User', 'Model'); 4 5class ContactsController extends AppController { 6 7 public $components = array('Session'); 8 9 public function contact() 10 { 11 12 13 $this->set('title', 'お問い合せ'); 14 15 if (!$this->request->is('post') || !$this->request->data) { 16 return; 17 } 18 19 $this->Contact->set($this->request->data); 20 21 if (!$this->Contact->validates()) { 22 $this->Session->setFlash('入力内容に不備があります。'); 23 return; 24 } 25 26 switch ($this->request->data['confirm']) { 27 28 //確認画面 29 case 'confirm': 30 31 //トークン生成 32 $tkn = $this->_getToken(); 33 34 //トークンをセッションに保存  35 $this->Session->write('contact_token', $tkn); 36 37 //トークンをviewに渡す 38 $this->set('contact_token', $tkn); 39 40 $this->render('contact_confirm'); 41 42 43 break; 44 45 //送信後画面 46 case 'send': 47 48 49 //不正アクセス、二重ポスト対策 50 if($this->request->data['Contact']['contact_token'] == null || 51 $this->request->data['Contact']['contact_token'] != $this->Session->read('contact_token')) 52 { 53 54 55 //セッションクリア 56 $this->Session->destroy(); 57 58 //トップページへ 59 header('Location:../'); 60 exit(); 61 62 } 63 64 65 $this->sendContact($this->request->data['Contact']); 66 67 $this->render('email_sent'); 68 69 break; 70 } 71 72 73 74 } 75 76 private function sendContact($content) 77 { 78 App::uses('CakeEmail', 'Network/Email'); 79 $email = new CakeEmail('contact'); 80 81 82 $email->to($content['email']); 83 $email->subject('【test】お問い合わせを受け付けました'); 84 $email->send(); 85 } 86 87 88 /* 89 * 90 * トークンを作成し返却する 91 */ 92 private function _getToken() 93 { 94 return md5(uniqid().mt_rand()); 95 } 96 97} 98 99

ビュー
1.入力画面

html

1 2<div class="container"> 3 4 <div class="row"> 5 <div class="col col-md-12"> 6 <div class="col-md-6 form-login "> 7 <?php 8 //echo $this->Session->flash(); 9 echo $this->Form->create('Contact'); 10 11 echo $this->Form->input('name', array( 12 'type' => 'text', 13 'label' => 'お名前', 14 'maxlength' => 255, 15 'value' => $User['User']['name'], 16 'class' => 'form-control input-sm chat-input' 17 ) 18 ); 19 20 echo $this->Form->input('email', array( 21 'type' => 'email', 22 'label' => 'メールアドレス', 23 'maxlength' => 255, 24 'value' => $User['User']['email'], 25 'class' => 'form-control input-sm chat-input' 26 ) 27 ); 28 29 30 31 echo $this->Form->input('body', array( 32 'type' => 'textarea', 33 'label' => '本文', 34 'maxlength' => 3000, 35 'class' => 'form-control input-sm chat-input' 36 ) 37 ); 38 39 echo $this->Form->button('確認する', array( 40 'type' => 'submit', 41 'name' => 'confirm', 42 'value' => 'confirm', 43 'class' => 'btn btn-primary btn-md' 44 ) 45 ); 46 47 echo $this->Form->end(); 48 49 ?> 50 </div> 51 </div> 52 53 </div> 54 55</div><!-- container end --> 56 57 58 59

ビュー
2.確認画面

html

1 2 3<div class="container"> 4 5 <div class="row"> 6 <div class="col col-md-12"> 7 <div class="col-md-6 form-login"> 8 <dl> 9 <dt>お名前</dt> 10 <dd><?php echo $this->request->data['Contact']['name']; ?></dd> 11 <br> 12 <dt>メールアドレス</dt> 13 <dd><?php echo $this->request->data['Contact']['email']; ?></dd> 14 <br> 15 16 <dt>お問い合せ本文</dt> 17 <dd><?php echo nl2br($this->request->data['Contact']['body']); ?></dd> 18 19 </dl> 20 21 <?php 22 echo $this->Form->create('Contact'); 23 24 25 echo $this->Form->hidden('contact_token', array('value' => $contact_token)); 26 27 foreach ($this->request->data['Contact'] as $name => $val) { 28 echo $this->Form->hidden($name, array('value' => $val)); 29 } 30 31 echo $this->Form->button('修正する', array( 32 'type' => 'submit', 33 'name' => 'confirm', 34 'value' => 'revise', 35 'class' => 'btn btn-primary btn-md' 36 )); 37 38 echo $this->Form->button('送信する', array( 39 'type' => 'submit', 40 'name' => 'confirm', 41 'id' => 'test', 42 'value' => 'send', 43 'class' => 'btn btn-primary btn-md' 44 )); 45 46 echo $this->Form->end(); 47 48 ?> 49 </div> 50 </div> 51 52 </div> 53 54</div><!-- container end --> 55 56 57

ビュー
3.結果画面

html

1 2<div class="container"> 3 <div class="row"> 4 <div class="col-md-6"> 5 <!-- <?php echo $this->Session->flash(); ?> --> 6 <h4>お問い合わせを受け付けました</h4> 7 <?php echo $this->Html->link('トップページへ', '../'); ?> 8 </div> 9 </div> 10</div><!-- container end --> 11 12 13

スクリプト

javascript

1$(function () { 2 $('form').submit(function () { 3 //alert("test"); 4 $("#test", this).prop("disabled", true); 5 6 }); 7});

【翌日追記】
翌日調べて分かったことを追記致します。

スクリプト経由でコントローラへ飛ぶと、コントローラのswitch文の部分、
$this->request->data['confirm']の値がNULLになっておりました。
そのためcaseで条件に引っかからず処理が下まで流れてました。

スクリプト経由せずコントローラへ飛ぶ場合、
$this->request->data['confirm']には、「前画面(確認画面)から来たよ。」
という意味での値'send'が入っております。

このため、case NULL:の時(スクリプト経由時)は、case 'send'と同じ処理を通るようにしてあげれば、とりあえずは、意図したように動きはしますが、NULLになるのは現象であって根本的な原因ではないと考えております。

なぜスクリプト経由だと、
$this->request->data['confirm']がNULLになってしまうのでしょう?
Webプログラム独学で初心者のため、これが「普通」、「当たり前の動作」なのかどうかも分からないでいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

disabled にするとその値は送られません。
前にも同様の回答をしていますので参考に

jQueryで2重サブミット対策を入れたら、フォームのバリューが受け取れなくなった
https://teratail.com/questions/111560

投稿2019/03/14 05:35

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2019/03/14 06:27

ありがとうございます。 既出の質問で申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問