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

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

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

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

jQuery

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

Q&A

解決済

2回答

1174閲覧

【CakePHP3】formにjQueryで送信するhidden要素を追加して送信したい

nnahito

総合スコア2004

CakePHP

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

jQuery

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

0グッド

0クリップ

投稿2018/03/15 07:10

編集2018/03/15 07:14

はじめに

CakePHP初心者です。
業務で使い始めました。

やりたいこと

CakePHP3.5.0でPOST通信するフォームに、
submitイベントをjQueryで拾ったときに、hidden要素を追加して送りたい。


流れ

(1)ユーザがページにアクセス。Form外のDOMを操作
(2)ユーザがフォームの送信ボタンを押下
(3)jQueryのon('submit', function)が formのサブミットを検知
(4)jQueryでDOMの必要な部分を取得
(5)フォームの送信データに(4)で取得したものをくっつけて送信

やったこと

とりあえずformを用意。

php

1<?= $this->Form->create(null, ['type' => 'post', 'url' => ['controller' => 'controller名', 'action' => 'メソッド名']]); ?> 2<button type="submit" class="button" id="output">送信</button> 3<input type="hidden" name="id" value="<?= $id ?>"> 4<?= $this->Form->end(); ?>

submit検知用JS

js

1$('form').on('submit', function () { 2 // 取得 3 let lines = $('table > tbody').find('tr'); 4 let form = $(this).parent().find('form')[0]; 5 6 // ユーザがいじったものをformに 7 $(lines).each(function (key, element) { 8 // 各行のテキストを取得 9 let name = $(element).find('.name').text(); 10 let value = $(element).find('.value').text(); 11 12 // フォームを擬似的に作成 13 $(form).append('<input type="hidden" name="' + name + '" value="' + value + '">'); 14 }); 15 16 $(form).submit(); 17 18});

アクセスした先のコントローラー

php

1// データをすべて取得 2$data = $this->request->getData(); 3 4debug($data); 5die; 6

上記コードで、403が帰ってくる。
ちなみに、アドレスに直接アクセスする(GETアクセスする)と、正常にページが表示されます。
原因はわかりません。。。


やり方をご存じの方がいらっしゃいましたら、
ご教示いただけますと幸いです。
よろしくお願いいたします。

参考

https://qiita.com/mkn_ppr/items/8c47cefb1934045481ff
https://www.sejuku.net/blog/31050
https://blog.s-giken.net/306.html
http://raining.bear-life.com/jquery/jquery%E3%81%A7submit%EF%BC%88%E3%82%B5%E3%83%96%E3%83%9F%E3%83%83%E3%83%88%EF%BC%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/15 23:51

Csrf モジュールをアンロードしたらどうなります?
guest

回答2

0

ベストアンサー

csrf ajax の話に見えるけど
post 403
get 200
なので

投稿2018/03/19 11:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nnahito

2018/03/19 15:07

ご回答ありがとうございました! miyabi-sun様も、考えていただき本当にありがとうございました!
guest

0

ん〜、PHPの仕様でPOST値を配列で受け取りたい時はname属性をhoge[]のように[]の指定をしましょう。
これが全部の原因かどうか分かりませんが、ひとまずはそれで対応してみてください。

また、HTML5ならformのお外だからといってわざわざjQueryで全ての値を取得する必要はありません。
下記のようにform属性にformのid値と同じモノを指定して上げれば、
そのformに属しているように動作します。

HTML

1<form id="hoge" method="post" action="./"> 2</form> 3<input form="hoge" name="piko" type="text" value="123" />

投稿2018/03/15 23:14

miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2018/03/15 23:22

csrf ajax の話に見えるけど post 403 get 200
nnahito

2018/03/19 09:47

ご回答ありがとうございます! csrf問題でした…… Laravelだと、CSRDのIDだけ投げればいいのに、Cakeだと要素まできっちり見てるんですね…… 勉強になりました。 ありがとうございます。 (asahina1979様はぜひ回答欄に書いていただけると嬉しいです……ベストアンサー押せないw)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問