jsファイル内で生成した変数をcakephpの変数に渡したい
- 評価
- クリップ 0
- VIEW 1,255

退会済みユーザー
前提・実現したいこと
外出ししたjsファイルでクリックイベント毎に変数を生成し、cake2(var.2.7)に渡してPHPの変数としても使用したい。
ネットで調べながらコーディングしています。ajaxを使っていますが方法は問いません。
発生している問題・エラーメッセージ
クリックイベントで通信確認用のアラートは機能したのですが、cakephpのコントローラー内の書き方がわからず、index.ctpに変数が反映されなくて困っています。
該当のソースコード
<ajaxTest.js>
var val = 0;
$(function() {
$(document).on('click', '#next', function() {
val++;
$.ajax({
url: "http://localhost/ajaxtest/users/index",
type: "POST",
data: { name : val },
dataType: "text",
success : function(data){
//通信成功時の処理
alert(data);
},
error: function(){
//通信失敗時の処理
alert('通信失敗');
}
});
})
});
<index.ctp>
<p>現在の変数「$index」の値:<?php echo $index;?></p>
<p id="next">ここをクリック</p>
<UserController.php>
<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
public function index() {
if($this->request->is('ajax')) {
$this->autoRender = true;
//echo $this->request->data["name"]." :controller内のリクエスト確認用";
//$data = $this->request->data("name");
$data = $this->request->data["name"];
$this->set('index', $data);
}else{
$this->set('index', 0);
}
}
}
試したこと
ネットを参考に色々試しましたが、ajaxから渡ってきたdata["name"]をphpの変数に置き換える書き方がわかりません。よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
いろいろ方法がありますが、簡単なのは下記かと思います。
コントローラーのアクションで以下のようにします
Configure::write ('debug', 0);
$this->autoRender = false;
$data=array('abc'); //渡したいデータの配列など
return new CakeResponse (
array (
'body' => json_encode ( $data )
));
また、echoやデバッグ出力があると正しいフォーマットにならないのでデバッグ出力はOFFにします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
$this->autoRender = FALSE;
これだとindex.ctp
は使われませんし、TRUE
にしたところで、$this->set('index',$index);
が書かれていないので、index.ctp
には何も渡されません。
ちょっと何をしたいのか分からないのですが・・・
追記
<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
public function index() {
if($this->request->is('ajax')) {
$this->autoRender = true;
//echo $this->request->data["name"]." :controller内のリクエスト確認用";
//$data = $this->request->data("name");
$data = $this->request->data["name"];
$this->set('index', $data);
}else{
$this->set('index', 0);
}
}
}
じゃないですか?
jsonじゃなくて、htmlとしてレンダリングされますが、いいんですかね?
やっぱりイマイチやりたいことが分からない・・・
なぜ、ajaxで呼び出しながら、htmlの結果を返すのでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
ajax,jsonをネットで調べて見ましたが今ひとつ理解できませんでした。解決策として使用したいデータをjson.encodeとjson.paseして、jsファイルのグローバル変数で受け取り、jsファイルからdocument.getElemntIdを使ってctpファイルを書き換えることでctpファイルとjsファイル内の値の整合性?をとってみました。
ご回答いただいた方には大変感謝しています。せっかく回答いただいたのに無にしてしまい済みませんでした。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-2
解決していませんが、自分のphp,ajax,jsonの知識不足ために回答が理解出来ていないので、そこからやり直して、再度頂いた回答を参考にさせていただきます。回答有り難うございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2016/05/05 00:20 編集
現行のコードではajaxのアラートはコントローラ内の echo $this->request->data["name"];と連動し出力できているのですが、
$index=$this->request->data["name"];などで単純にajaxからの値をphpの変数($index)に置き換えられないのでしょうか?
2016/05/05 18:31
$this->layout= false はdefault.ctpを使わないという意味です。必要なら入れてください。
<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
public function index() {
if($this->request->is('ajax')) {
$this->layout= false;
echo $this->request->data("name")." :controller内のリクエスト確認用";
$data =$this->request->data("name");
$this->set('index', $data);
}else{
$this->set('index', 0);
}
}
}
/users/index.ctp
<?php
echo $index;
?>
こんな感じじゃないですか?
2016/05/05 20:55
回答有り難うございました。