こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

jqueryの変数にリクエストデータを代入したい

現在独学でcakephpを使ってブログの作成をしています。
その中でjqueryをつかっているのですが、jqueryの変数に$this->request->dataを代入することは可能でしょうか?
たとえば、
var one = '<?php echo $this->request->data('Post.1.title'); ?>';
こうした場合はalertでうまく表示されたのですが、
var two = $('input#title').attr('class');
var three = $('input#title').length;
var one = '<?php echo $this->request->data("Post.' + three + '.' + two + '"); ?>';
こうするとalertではなにも表示されません。(真っ白です)
書き方が違うんだろうなとは思うんですが、仕事が休みの日に家でやっているため質問できる相手もおらず、ネットで検索してもイマイチ分からず・・・
初歩的な質問で申し訳ないのですが、どなたかご指摘等をよろしくお願いいたします。

投稿日時 - 2015-04-13 15:22:02

QNo.8954923

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

CakePHPとかjQueryの前に、Webプログラミングの基礎を理解されていないように思います。
プログラミングが始めての方なのでしょうか…。

CakePHPやPHP・Java・JSPなどはサーバーサイドで実行されます。
jQueryやJavaScriptはクライアント再度で実行されます。

サーバーサイドで実行されたプログラムは、サーバーで実行が終了しHTMLを出力し、インターネットを介してパソコンに送信され、受信した後ブラウザで表示されます。その表示処理の中で、jQueryやJavaScriptが実行されるのです。


あなたはCakePHPとjQueryをごちゃ混ぜに書いても、言語に関係なく上から実行されると思っているのだと思います。しかしそんなわけはなく、必ず先にCakePHPを解釈しようとし、それが終了した後にjQueryが実行されるのです。


だからこのコードだったら
# var one = '<?php echo $this->request->data('Post.1.title'); ?>';

# var one = '【送信されたタイトル】';
というコードをサーバーで出力したあとにJavaScriptが実行されるので正しく実行できるのです。

しかし以下は
# var two = $('input#title').attr('class');
# var three = $('input#title').length;
# var one = '<?php echo $this->request->data("Post.' + three + '.' + two + '"); ?>';

この部分で
# var one = '<?php echo $this->request->data("Post.' + three + '.' + two + '"); ?>';
サーバーのPHPが「three」「two」を解釈できないので正しく処理できないのです。


ユーザーからの入力を受け付けて動的に処理をしたいのなら、Ajaxで処理するのがいいとは思いますが。その前に基礎的な部分の勉強がいろいろ必要だと思います。

投稿日時 - 2015-04-14 17:00:44

ANo.4

もうちょっとお勉強が必要そうですねぇ。
cakephpのフォームの登録辺りを見直してみてください。

実装の雰囲気としては以下のような感じです。
DBに保存されたタイトルから変更があったかどうかはjsのみで判断するのが普通ですかね。phpでも判断できますが時間かかるので。

・ctp
<form>
<input id="title" type="text" value="<?php echo $title ?>">
<input type="submit" value="送信">
</form>

・js
$(function(){
// データベースに登録されてるタイトルは
// 画面表示時に変数としてもっとく
var title = $('#title').val();
$('form').on('submit', function(){
// submitするときに比較
if (title === $('#title').val()) {
alert('タイトル一緒やで');
// submitをキャンセル
return false;
}
});
});

投稿日時 - 2015-04-14 01:28:57

ANo.3

ユーザーがなにをして、どうなる処理でしょうか。

処理の概要と処理の詳細をもうちょっと教えてください。

投稿日時 - 2015-04-13 22:26:05

補足

すみません、ありがとうございます。
ブログの内容の編集ページでのことなんですが、
編集用のタイトルのフォームにはデータベースからとってきた$this->request->data['Post']['1']['title']が表示されている

ユーザーがタイトルを編集するために、表示されていたものを一度消して新たに入力をする

jqueryで$this->request->data['Post']['1']['title']と新たに入力されたものが一致するかチェックし、一致したらメッセージ表示

という流れです。
タイトルだけでなくサブタイトルなど、他の項目もチェックしたいので、['1']['title']の部分をjqueryでclassを取得するなりして変数に代入することはできるのか?と考えたのです。
更新の際にバリデーションでユニークのチェックをしていたのですが、ちょっとjqueryの勉強を始めたいと思っていたので・・・。

説明が下手くそで申し訳ありません。
よろしくお願いいたします。

投稿日時 - 2015-04-13 23:38:27

ANo.2

jsの中にphpの変数を書くのはよろしくありません。
使用したい場合は一度htmlとして書き出した後に取得します。

postした値をjsで受け取ってどういう処理をしたいのでしょう?

投稿日時 - 2015-04-13 19:55:55

補足

ご回答ありがとうございます。
そうなんですか・・・。ネットで探してもこのような例が見られないのは、あまりよくないからなのですね。

phpでデータベースからとってきたブログのタイトル($this->request->data['Post']['1']['title'])をフォームに表示し、そのタイトルが消されたあと入力された値をjqueryで取得し、もし一致したら~・・・という処理をしたいのです。
よりいい方法はもちろんあるのでしょうが、この場合にうまくいかないのは何故?とスッキリしなくて質問させていただきました。
もしよろしければ、もう一度ご回答いただければ幸いです。
よろしくお願いいたします。

投稿日時 - 2015-04-13 22:05:12

まずはクライアント(ブラウザ)側で処理されるものと
サーバ側で処理される(php)ものをきちんと理解したほうが良いと思う。

jsはphpで生成されたソースがブラウザに返された後に動く。

投稿日時 - 2015-04-13 16:02:48

お礼

ご回答ありがとうございます。
まだあまりきちんと理解できていないままいろいろ試そうとしていました。
phpの変数を直接代入した場合はうまくいくから、書き方に問題が?と悩んでいました。
勉強不足ですね。精進します。
ありがとうございました。

投稿日時 - 2015-04-13 21:56:59

あなたにオススメの質問