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

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

解決済

2回答

2418閲覧

cakephp2系 サーバから最新の値を取得し表示する方法

milkif

総合スコア16

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クリップ

投稿2016/05/29 22:27

編集2016/05/30 22:13

###前提・実現したいこと
動画再生後、モーダルを出現させ、モーダル内にチェックボックスを表示させチェックを入れて送信ボタンをクリックすると親画面に戻り次の動画の表示とajaxで送られてきた値をサーバ保存し、そこで加算された最新のポイントを表示させたい。

###発生している問題・エラーメッセージ
ajaxを使い次の動画の取得、サーバへの保存まで出来るようになったのですが、ajaxにてサブミット後、ページをリロードしないようにreturn false;しているので、次の動画は表示され、サーバに値を保存するまではできているのですが、そのサーバに保存された最新の値は、手動でブラウザのリロードを行わないと最新のポイントが反映されません。
ajaxのreturn false;を外せば、値の保存と、ポイントは最新の値を表示してくれますが、動画の表示が元の動画に戻ってしまいます。

###該当のソースコード

javascript

1$(".a").on("click",function(){ 2 var check_count = $("[name='check[]']:checked").length; 3 if (check_count == 0 ){ 4 return false; 5 }else{ 6 var checked=[]; 7 $("[name='check[]']:checked").each(function(){ 8 checked.push(this.value); 9 }); 10 11 $.ajax({ 12 type: "POST", 13 url: "", 14 dataType: "text", 15 data: { 16 "a": a, 17 "b": b, 18 "point":point, 19 "checked" : checked, 20 }, 21 success: function() { 22 $('#a').modal('hide'); 23 if(index < videos.length-1){ 24 index++; 25 getElements(); 26 } 27 }, 28 error: function(XMLHttpRequest, textStatus, errorThrown) { 29 alert('Error : ' + errorThrown); 30 } 31 }); 32 return false;//サブミット後、ページをリロードしないようにする 33 } 34});

controller.php

1 public function beforeFilter() { 2 3 $id = $this->Auth->user('id'); 4 $data = $this->Point->find('all', 5 array( 6 'conditions'=> array('Point.id' => $id), 7 'fields' => array('sum(point) as point'), 8 ) 9 ); 10 $point = $data['0']['0']['point']; 11 $this->set('point',$point); 12 13 } 14 15 public function index() { 16 $this->set('videos', $this->Video->find('all')); 17 $checked = array(); 18 if ($this->request->is('ajax')){ 19 $this->autoRender = false; 20 $p_checked = $this->request->data['checked']; 21 $p_checked = json_encode($p_checked); 22 $data = array( 23 'Point' => array( 24 'a' => a, 25 'b' => b, 26 'point' => $this->request->data['point'], 27 'checked'=> $checked 28 ) 29 ); 30 $this->Point->create(); 31 $this->Point->save($data); 32 exit; 33 } 34 }

###試したこと
ajaxのreturn false;をtrueにする。(動画が反映されない)。
Sessionにポイントの値を変数にして入れてみる。
書き方が悪いのか取得できない。

###補足情報(言語/FW/ツール等のバージョンなど)
XAMPP 5.6.14-0
cakephp-2.7.8
jquery 1.11.0
10.0.17-MariaDB

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

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

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

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

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

guest

回答2

0

こんにちは。

画面に表示されている値はHTMLとして読み込まれた時点のものですので
$.ajax()によって非同期でやりとりする時は、
その処理の中で画面上のポイント部分の要素を書き換える必要があるかと思われます。

リクエストを受け取るPHPでは
最新のポイントを返すようにします。
(※私の知識はCakePHP2.4のため2.7.8だと若干違う恐れがあるかもしれません)

php

1public function index() { 2 // 省略します 3 if ($this->request->is('ajax')){ 4 // 省略します 5 // exit; // ↓次のようにjsonで最新のポイントを返すように変えます 6 $this->viewClass = 'Json'; 7 $point = // 最新のポイント; 8 $this->set(compact('point')); 9 $this->set('_serialize', array('point')); 10 return; 11 } 12}

javascript側では
ポイントを受け取って表示したい箇所にポイントをいれます。
例えば、ポイントを表示している要素が<span class="point"></span>のような場合、

javascript

1success: function(res) { 2 $('#a').modal('hide'); 3 if(index < videos.length-1){ 4 index++; 5 getElements(); 6 } 7 // ↓次のようにjsonで受け取った最新のポイントをclass="point"の要素にいれます 8 if (res && res.point) { 9 $('.point').text(res.point); 10 } 11},

ご参考までに。

投稿2016/05/30 00:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

milkif

2016/05/30 01:54

分かりやすく、丁寧な回答を頂き感謝いたします。先程から試しているのですが、jsファイルのコンソールでUncaught ReferenceError: res is not definedと出てしまい,ctpファイルは<span class="point"></span>で何も表示されていない状態です。 お時間のある時で構いませんのでアドバイスをいただけたら幸いです。
退会済みユーザー

退会済みユーザー

2016/05/30 03:31

ふーむ、、、見落としていましたが、$.ajax()でのdataTypeを 今の `dataType: "text",` から `dataType: "json",` に変えてみてください。
退会済みユーザー

退会済みユーザー

2016/05/30 03:34

その後、 Chromeをお使いでしたら、右クリック⇒検証⇒Networkタブにて、念のためPreserve logにチェックを入れた状態で操作するとajaxでリクエストした際の記録が見られます。 ajaxでリクエストした際の記録をクリックし、Responseタブを見てみると `{"point":12}` のようなデータが返ってきていればPHPからはポイントが返ってきていることの確認は行えるかと思われます。
milkif

2016/05/30 04:14

貴重なお時間を頂きご返事有難うございます。dataTYpeを'json'とすると「Error : SyntaxError: Unexpected token < in JSON at position 1」のアラートが出てしまうため'text'にしました。 chromeの検証ではポイントが返ってきていません。 見当違いかもしれませんが、ctpファイルで var points=JSON.parse('<?php echo $point; ?>');してjsファイルでconsole.log(point);すると値が返ってきていることは確認できました。 お手数をお掛けして恐縮です。
退会済みユーザー

退会済みユーザー

2016/05/30 07:05

$this->viewClass = 'Json';の指定はありますか?バージョンによって挙動が異なるのかもしれませんがデータビュークラスを指定するとctpが呼ばれることは無いと思われます。
milkif

2016/05/30 12:44 編集

何度もご回答頂き有難うございます。 上記省略 exit; //処理を終わります $this->viewClass = 'Json'; $point = $data['0']['0']['point'];// 最新のポイント; $this->set(compact('point')); $this->set('_serialize', array('point')); return; } やはりdataTYpeを'json'とするとError : SyntaxError: Unexpected end of JSON inputが出てしまいます。
milkif

2016/05/30 12:43 編集

上記コードの訂正しました。
guest

0

自己解決

投稿2016/06/01 07:53

編集2016/06/03 14:16
milkif

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問