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

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

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

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

3313閲覧

ajaxでjsonにpost送信する

usuallyi

総合スコア41

CakePHP

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2016/10/24 07:50

編集2016/10/25 06:14

cakephp2.0でjsonを変換しており、
jQueryのajaxでjsonに変換したデータを非同期通信にて、
画面遷移なしでformから送信したデータを
ホームに反映したいのですが、
既にjsonに変換してあるものはホーム反映されますが、
formの内容がjsonに変換されず、ホームに反映されません。

json

1{ 2user_id: "14", 3my_id: "353", 4json_data: [ 5{ 6Tweet: { 7id: "24579", 8tweet_id: "14", 9name: "353", 10tweet: "Hello", 11tweettime: "2016-10-23 14:25:47" 12} 13}, 14{ 15Tweet: { 16id: "24563", 17tweet_id: "14", 18name: "353", 19tweet: "Hi", 20tweettime: "2016-10-21 03:40:17" 21}.... 22] 23}

php

1 <?php 2 echo $this->Form->create('Tweet'); 3 echo nl2br($this->Form->textarea('tweet', array('cols'=>100, 'rows'=>4,'required' => false,'error'=>false))); 4 echo $this->Form->hidden('tweet_id',array('value'=> $user['id'])); 5 echo $this->Form->hidden('name',array('value'=> $user['username'])); 6 echo $this->Form->submit('投稿',array(/*'onclick'=>'index',*/'name' => 'submit')); 7 echo $this->Form->end(); 8endif; 9 <h3>ホーム</h3> 10 <div id="output"> 11 <div id="delite"></div> 12 </div> 13?> 14

javascript

1var user_id; 2 var my_id; 3 4$(document).ready(function(){ 5 tweet_load(); 6 7 $(document).on('click','button',function(){ 8 alert('deliteをクリックしました!'); 9 }); 10 $(document).on('click','div.submit',function(event) { 11event.preventDefault(); 12var time =new Date(); 13var params = $('#form').serialize(); 14 $.ajax({ 15 type:'post', 16 url: '/cakephp/users/json_data', 17 dataType: 'json', 18 data : [{"Tweet":[{'tweet_id': user_id ,'username': my_id, 'tweet' : $('textarea').val()}]}], 19 timeout:10000, 20 success: function(data) { 21 console.log(user_id+' '+my_id+' '+$('textarea').val()+' '+time); 22 //console.log(parms); 23 tweet_load(); 24 }, 25 error: function(XMLHttpRequest, textStatus, errorThrown) { 26 alert("error"); 27 } 28 }); 29});}); 30/* 31$(function(){ 32 //1秒ごとに読み込み 33 setInterval(update, 1000); 34});*/ 35/* 36function ajaxPostFunc(param1, param2){ 37 $.post("post.php", {input1:param1, input2:param2}, 38 function(json){alert("パラメータを2つPOSTしました");}); 39}*/ 40 41function tweet_load(){ 42$.ajax({ 43 type: "POST", 44 url: '/cakephp/users/json_data', 45 dataType: 'json', 46 timeout: 10000}) 47 .done(function(data){ 48 for(var i in data.json_data){ 49 $("#output").append('<a href='+data.json_data[i].Tweet.name+'>'+data.json_data[i].Tweet.name+"</br>"); 50 $("#output").append(data.json_data[i].Tweet.tweet+"</br>"); 51 $("#output").append(data.json_data[i].Tweet.tweettime+"</br>"); 52 if(data.my_id==data.json_data[i].Tweet.name){ 53 $("#output").append('<button type="button" name="delite" id="delite" value='+data.json_data[i].Tweet.tweet_id+'>削除</button></br>'); 54 } 55 $("#output").append("</br>"); 56 user_id = data.user_id; 57 my_id = data.my_id;} 58}) 59 .fail(function(){ 60 //通信失敗時の処理 61 alert('通信失敗'); 62 });}

php

1public function json_data(){ 2 // $this->autoRender = FALSE; 3 $this->loadModel('Tweet'); 4 $this->loadModel('Follow'); 5if($this->request->is('ajax')){ 6 if(isset($this->data['tweet_id'])){ 7 $this->Tweet->save($this->request->data); 8 //$this->redirect(array('action'=>'json_data')); 9} 10 $id=$this->Auth->user('username'); 11 $user_id=$this->Auth->user('id'); 12 //フォロワーをfind指定 13 $all_follow=$this->Follow->list_all_follow($id); 14 $json_data=$this->Tweet->json_alluser_tweet_all($all_follow,$id); 15 //debug($json_data); 16 $this->viewClass = 'Json'; 17 $this->set('my_id',$id); 18 $this->set('user_id',$user_id); 19 $this->set(compact('json_data')); 20 $this->set('_serialize',['user_id','my_id','json_data']); 21} 22/* } 23else { 24 throw new BadRequestException(); 25}*/ 26}

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

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

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

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

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

popobot

2016/10/24 08:58

どこでうまく行っていないか切り分けられているのでしょうか? ajaxでformの内容をpostする処理はうまく行っているということですか? その後tweet_load()を再度実行していますが、レスポンスにpostしたformの内容がないということですか?
usuallyi

2016/10/24 11:47 編集

ajaxでformの内容をpostする処理がうまくいっておりません。
popobot

2016/10/24 20:17

ajaxではないpostはうまく動いたのでしょうか
usuallyi

2016/10/25 00:15

上手く動いていました。
guest

回答2

0

ベストアンサー

formをjs側から取得しやすいようにidを設定する

php

1echo $this->Form->create('Tweet', ['id' => 'form']);

js側はformのsubmitの動作を以下のように書き換えればうまくいくかと
※原則すべてのパラメータはform($this)から取得するようにしています。

javascript

1$(document).ready(function(){ 2 $('#form').submit(function(event) { 3 event.preventDefault(); 4 $.ajax({ 5 url: $(this).attr('action'), 6 type: $(this).attr('method'), 7 data: $(this).serialize(), 8 dataType: 'json', 9 timeout:10000, 10 success: function(data) { 11 tweet_load(); 12 }, 13 error: function(XMLHttpRequest, textStatus, errorThrown) { 14 alert("error"); 15 } 16 }); 17 }); 18});

詳しい説明は、jQueryでフォームをAjax送信する際の基本パターンのチュートリアルという記事がよさそうでしたので、よく読んでください。

投稿2016/10/25 00:41

popobot

総合スコア6586

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

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

usuallyi

2016/10/25 06:12

postは、cakephpのコントローラの方のプログラムを改善したら、 データベースにデータがはいりましたが、 リロードしなければデータが反映されず困っています。
popobot

2016/10/25 06:23

tweet_load();が再度実行されているかとか、その時postしたデータがレスポンスに含まれているかとか確認してみたらどうでしょうか。
usuallyi

2016/10/25 07:03 編集

jsonには、反映されているみたいですが、 tweet_loadで表示がうまくいっていないみたいです。
popobot

2016/10/25 08:00

どううまくいっていないのでしょうか? consoleにエラーが出ますか? appendなので重複しちゃうかもしれないので、一旦#outputを空にした方がいいかもしれませんね。
usuallyi

2016/10/25 08:05

consoleにはエラーがでず、consoleでappendのiの変数をカウント表示させましたが、 投稿後はカウント値が+1ふえているのですが、 ホームの表示が前の投稿状況のままです。
usuallyi

2016/10/25 08:52

#outputをemptyにした場合、うまく反映できました。
popobot

2016/10/25 08:55

やりましたね! 解決できて良かったです!!
usuallyi

2016/10/25 08:57

icchiiさんがいなければ、絶対解決できない問題でした。 ありがとうござました!! 上手く、状況説明できるように頑張ります!
popobot

2016/10/25 09:04

自分で原因を見つけられるようになっていくと、自力で前に進んでいけるようになると思うので、なるべく自分でよく調べて、わからなければ質問するといいと思いますよ!! ※原因がわかれば解決方法を見つけるのは実は意外と簡単ですから
usuallyi

2016/10/25 09:08

ありがとうございます。 最近、授業以外のプログラミングをはじめたばかりなので、 とても、勉強になっております。
guest

0

テスト環境がよくわからないので該当しないかもですが、

[JavaScript] iOSでdocumentに張ったclickイベントが発火しない
http://qiita.com/jshimazu/items/f9c148fa5e08f109179f

というものがありました。
その、documentのdivタグに張ったサブミットは発火していますか?

投稿2016/10/25 00:20

akio221

総合スコア716

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

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

popobot

2016/10/25 00:48

横からですが補足しておきます。Cakeの以下のコードは echo $this->Form->submit('投稿',array('name' => 'submit')); 以下のようなHTMLに置き換わります。 <div class="submit"><input type="submit" name="submit" value="投稿"></div> なので、投稿ボタンではなく、この外側のdivで発火するようになっちゃってますね...
akio221

2016/10/25 00:52

おー・・。なるほど。 Cakeはさっぱりなので、見当違いでしたね。ご指摘ありがとうございます。勉強になります。
usuallyi

2016/10/25 07:55

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問