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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

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回答

9523閲覧

【cakePHP3】ajaxのurl指定がうまくいかない

k499778

総合スコア599

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

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/03/19 07:36

編集2016/03/19 07:38

この投稿は前回の続きになります。
ajaxのurlをphpタグで書きたい https://teratail.com/questions/30151

素晴らしき回答者様のおかげでphpタグを読み込むことはできたのですが、
いくつか問題が起きました。

1.ajaxのurlをurl: "<?php echo $this->Html->url('/Sample/sample/', true); ?>",またはurl: "<?php echo $this->html->url(array('controller' => 'Sample', 'action' => 'sample')); ?>",にすると挙動がおかしくなる。
以下のようにindex.ctpが読み込まれてしまう。
イメージ説明
もちろんurl: "http://localhost/cakephp3/Sample/sample",だとうまくいきます。

2.index.ctpのidsample.jssample_jssampleにして、それに合わせてsample.jsのajax内も url: $('#sample_js').data('url'),のように書き換えるとなぜかajaxが失敗する。

イメージ説明

もしこの2つの挙動についてわかる方がいらっしゃたら教えて下さい。お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

一連の質問を拝見していると、WEB アプリの基本的な仕組みをきちんと理解されたうえで作ってらっしゃるのか疑問に思ってしまうところがあります。「PHP はサーバ側で解釈され、ブラウザには HTML, css, js, 画像ファイル, JSON などの形で送信される(したがって PHP のコードは残っていない)」「JavaScript はブラウザ側で実行される」という辺りの基本は大丈夫でしょうか。

さて、(1) は、挙動からすると .ajax() に渡している url の値がおかしいわけです。予想としては url が空になっているので現在のページへのリクエストが飛んじゃっているのかな、と思いましたが、ともかくこの url がどうなっているか確かめる必要があると思います。調べ方としては、(1) ブラウザが表示しているページのソースを確認する、(2) ajax 呼び出しをキャプチャしてどの URL に飛んでいるか調べる、などが考えられます。

(2) は 404 Not Found になっている URL は http://localhost/cakephp3/ の後に<pre class= が付いているみたいですね。
個人的には jQuery でカスタムデータ属性 data-xxx にアクセスするときには .data('xxx') ではなく .attr('data-xxx') を使った方がバグが入りにくいと考えていますが、実際はどうなのでしょう。

投稿2016/03/19 08:10

編集2016/03/19 08:21
unau

総合スコア2468

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

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

k499778

2016/03/19 08:49

unauさん、回答有り難うございます! まだまだ青二才ですが、上記のサーバー側、フロント側の認識、PHPコードが実際にソースには残らないことは認識しています。 2点とも回答ありがとうございます。 少し試してみてから返答したいと思います。 2点目について、dataメソッドによるバグなら「id=sample.js」のときなぜいけたのか気になります。 とにかく一度試してみます。
k499778

2016/03/19 08:54

2点目に関しては「.attr('data-xxx')」を使ってもajaxのエラーに入ってしまいますね。
k499778

2016/03/19 09:00 編集

1点目に関して、ブラウザのソースを見たのですが、どうやらエラーが起こっていますね。 <script id="sample.js" src="js/sample.js" data-url="<pre class="cake-error"><a href="javascript:void(0);" onclick="document.getElementById('cakeErr56ed14702c21b-trace').style.display = (document.getElementById('cakeErr56ed14702c21b-trace').style.display == 'none' ? '' : 'none');"><b>Warning</b> (512)</a>: Method Cake\View\Helper\HtmlHelper::url does not exist [<b>CORE/src/View/Helper.php</b>, line <b>140</b>]<div id="cakeErr56ed14702c21b-trace" class="cake-stack-trace" style="display: none;"><a href="javascript:void(0);" onclick="document.getElementById('cakeErr56ed14702c21b-code').style.display = (document.getElementById('cakeErr56ed14702c21b-code').style.display == 'none' ? '' : 'none')">Code</a> <a href="javascript:void(0);" onclick="document.getElementById('cakeErr56ed14702c21b-context').style.display = (document.getElementById('cakeErr56ed14702c21b-context').style.display == 'none' ? '' : 'none')">Context</a><pre id="cakeErr56ed14702c21b-code" class="cake-code-dump" style="display: none;"><code><span style="color: #000000"><span style="color: #0000BB">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">__call</span><span style="color: #007700">(</span><span style="color: #0000BB">$method</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$params</span><span style="color: #007700">)</span></span></code> <span class="code-highlight"><code><span style="color: #000000"><span style="color: #0000BB">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">{</span></span></code></span> <code><span style="color: #000000"><span style="color: #0000BB">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trigger_error</span><span style="color: #007700">(</span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">'Method&nbsp;%1$s::%2$s&nbsp;does&nbsp;not&nbsp;exist'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">),&nbsp;</span><span style="color: #0000BB">$method</span><span style="color: #007700">),&nbsp;</span><span style="color: #0000BB">E_USER_WARNING</span><span style="color: #007700">);</span></span></code></pre><pre id="cakeErr56ed14702c21b-context" class="cake-context" style="display: none;">$method = &#039;url&#039; $params = [ (int) 0 =&gt; [ &#039;controller&#039; =&gt; &#039;Sample&#039;, &#039;action&#039; =&gt; &#039;sample&#039; ] ] $this = object(Cake\View\Helper\HtmlHelper) { &#039;helpers&#039; =&gt; [ (int) 0 =&gt; &#039;Url&#039; ], &#039;theme&#039; =&gt; null, &#039;plugin&#039; =&gt; null, &#039;fieldset&#039; =&gt; [], &#039;tags&#039; =&gt; [], &#039;implementedEvents&#039; =&gt; [], &#039;_config&#039; =&gt; [ &#039;templates&#039; =&gt; [ [maximum depth reached] ] ] }</pre><pre class="stack-trace">Cake\View\Helper::__call() - CORE/src/View/Helper.php, line 140 Cake\View\Helper\HtmlHelper::url() - APP/Template/Sample/index.ctp, line 12 include - APP/Template/Sample/index.ctp, line 12 Cake\View\View::_evaluate() - CORE/src/View/View.php, line 992 Cake\View\View::_render() - CORE/src/View/View.php, line 952 Cake\View\View::render() - CORE/src/View/View.php, line 587 Cake\Controller\Controller::render() - CORE/src/Controller/Controller.php, line 611 Cake\Routing\Dispatcher::_invoke() - CORE/src/Routing/Dispatcher.php, line 120 Cake\Routing\Dispatcher::dispatch() - CORE/src/Routing/Dispatcher.php, line 87 [main] - ROOT/webroot/index.php, line 37</pre></div></pre>" ></script> エラー理由を検証してみます。
unau

2016/03/19 09:00

WEB アプリの基本的な知識について、失礼いたしました。 一応補足しておきます。data() メソッドについては、バグがあるという話ではありません。jQuery の仕様ははっきりしているのですが、カスタムデータ属性を data() を使ってアクセスすると勘違いからバグを生みやすいと考えている、という話です。 次の記事に書かれているようなことです。 http://qiita.com/Kta-M/items/2eda39750abd10df9801
k499778

2016/03/19 09:10 編集

いえいえ。 なるほど。リンク先を読むと、data()を使ってアクセスすると、思いもよらないところで型が設定されてしまったりするようですね。
unau

2016/03/19 09:26

グローバル汚染するのであまりかっこうよくないですが、カスタムデータ属性を使わずに View 内で url に値を代入するだけの JavaScript を挿入する、というのもありかもしれません。 <?php $moreUrl = $this->Html->url('/Sample/sample/', true); echo $this->Html->scriptBlock("var mySampleMoreListUrl = '$moreUrl';"); ?>
unau

2016/03/19 09:28

貼っていただいたページのソースを見れば、2 点目のエラーの理由もわかると思います。script タグの data-url 属性あたり、です。
unau

2016/03/19 09:31

エラーは HTML ヘルパーに url というメソッドがないよ、って言ってますね。Cake のバージョンとかですかね。
k499778

2016/03/19 12:40

次のような書き方でエラーは消えました。 data-url="<?php echo $this->html->link('',['controller' => 'Sample', 'action' => 'sample']); ?>" しかし依然取れてくるデータはindex.ctpのもののようです
k499778

2016/03/19 12:56

アドバイス頂きたいのですが >、(2) ajax 呼び出しをキャプチャしてどの URL に飛んでいるか調べる というのはどのようにするのでしょうか? もしよろしければお教えいただけないでしょうか?
unau

2016/03/19 12:57

ブラウザでページのソースを確認して、data-url が何になっているか、確認してみてください。
unau

2016/03/19 13:12

ajax 呼び出しをフックしたりキャプったりする前に、ブラウザのソースを確認するとよいと思います。 が、今後も WEB 開発していくのであれば、ajax 通信をキャプるノウハウを知っていても損はないでしょうね。(1) いちばん簡単なのは最近のブラウザについている開発用ツールを使うことです。たとえば Chrome のデベロッパーツールなら Network タブで通信が見られます。(2) HTTP に関わらず全通信をキャプるのでリッチすぎますが、私は HTTP 以外でもしばしばパケットを調査するので WireShark 使います。(3) 最近は全然使っていませんが、WEB アプリをバリバリに開発していた 7, 8 年前頃は fiddler も手放せない道具でした。 通常は (1) で十分だと思います。
k499778

2016/03/19 13:34

ブラウザでは以下のように表示されており、ちゃんと<a href="/cakephp3/sample/sample">になっていました。 <script id="sample.js" src="js/sample.js" data-url="<a href="/cakephp3/sample/sample"></a>" ></script> ただデベロッパーツールのコンソールに表示されているように、 ajaxでは以下のURLに飛んでいるのだと思います。 POST http://localhost/cakephp3/%3Ca%20href= 404 (Not Found) って少し返答がずれてしまいましたね。(^_^;) デベロッパーツールのネットワークでajaxをキャプるのですね。 何度かネットワークを見ていたのですが、もう一度見てみます。
k499778

2016/03/19 13:39

先ほどまでネットワークをjsで絞っていたら表示されなかったのですが、 Allにすると404で返ってきているものが表示されました。 toolbar.jsの90行目でエラーになっています。 やはりphpタグ内のcakeの書き方がおかしいのかなあと思っています。 再度調べてみます。
unau

2016/03/19 13:52

誤:data-url="<a href="/cakephp3/sample/sample"></a>" 正:data-url="/cakephp3/sample/sample" HTML ヘルパーを使っているのが間違いではないですか。
guest

0

いろいろ検証した結果以下のことがわかりました。

1.url: "<?php echo $this->Html->link('/Sample/sample/', true); ?>",または<?php echo $this->html->link('',['controller' => 'Sample', 'action' => 'sample']); ?>",にすると欲しいURLが取れてきておらず、文字化けしている。
イメージ説明

2.index.ctpがid=sample.jsの場合、sample.jsではそのままの書き方ではjQueryのセレクタで受け取れない。そのためurlが空文字になり、現在のページを呼び出すことになる。そのため「もっと見る」ボタン押下時、index.ctpの内容が追加されていた。
それを解決するには、sample.jsではurl: $('#sample\\.js').data('url'),のようにエスケープする必要があった。

残りの問題は1.の書き方のどこが違うかの検証。
・書き方自体が違うのか
・文字化けを防ぐためにエスケープしなければいけないのか

投稿2016/03/19 13:28

k499778

総合スコア599

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

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

unau

2016/03/19 13:45

1. の方ですが、具体的に url の値は何になっていますか。ここで ”%3Cpre%20class=" となっているところは文字化けではなく CakePHP のエラーメッセージの一部ですよね。エラーをつぶす必要があると思います。 文字化けとおっしゃっているのは URL エンコードのことではないですよね?
k499778

2016/03/19 14:02 編集

>ここで ”%3Cpre%20class=" となっているところは文字化けではなく CakePHP のエラーメッセージの一部ですよね これが文字化けだと思っていました。URLエンコードというものなのですか? >1. の方ですが、具体的に url の値は何になっていますか。 デベロッパーツールのネットワークでキャプると Name : %3Ca%20href= Initiator : toolbar.js:90 となっています。 このNameの箇所をクリックすると詳細が表れますが、 具体的なURLはそこにある Request URL:http://localhost/cakephp3/%3Ca%20href= でしょうか。 もし違っていたら教えていただきたいです。
unau

2016/03/19 14:57

私の回答のほうにコメントしましたが、こちらにも同じコメントをしておきます。 誤:data-url="<a href="/cakephp3/sample/sample"></a>" 正:data-url="/cakephp3/sample/sample" HTML ヘルパーを使っているのが間違いではないですか。
k499778

2016/03/19 15:32

ブラウザのソースでは data-url="<a href="/cakephp3/sample/sample"></a>" となっていたのですが、 sample.jsの中で$('#sample\\.js')の中身を見てみると <script id="sample.js" src="js/sample.js" data-url="<a href=" cakephp3="" sample="" sample"=""></a>" ></script> アンカータグの中身がおかしなことになっていました。 さらに$('#sample\\.js').attr('data-url')の中身を見ると "<a href=" となっていました。 まだまだ問題がありそうです。
k499778

2016/03/19 15:50 編集

cakePHP3のHTMLヘルパーを使うとできませんでしたが、 URLヘルパーを使うとできました! index.ctp <script id="sample.js" src="js/sample.js" data-url="<?php echo $this->Url->build([ 'controller' => 'Sample', 'action' => 'sample', ]); ?>" ></script> これでURLのみを生成することができ、もっと見るボタンも正常な動きをするようになりました。 HTMLヘルパークラスを使ってやる方法やなぜjs側で受け取る値が変になるかなど細かい踏み込んだ内容はまだまだ不明ですが、とりあえずcakePHP3を使ってURLを指定する方法はわかったのと、 data-urlにアンカータグを指定してはダメで、URLだけを指定しないといけないとわかったので一旦解決とします。 最後まで相談に乗っていただきありがとうございました。感謝しています。
k499778

2016/03/20 04:18 編集

URLを出力する際、cakePHP3系と2系での書き方変わっています。 3系 URLヘルパーを使います。 --------------------------------------- echo $this->Url->build([ "controller" => "Posts", "action" => "view", "bar" ]); // 出力結果 /posts/view/bar --------------------------------------- http://book.cakephp.org/3.0/ja/views/helpers/url.html#id1 2系 HTMLヘルパーを使います。 --------------------------------------- echo $this->Html->url(array( "controller" => "posts", "action" => "view", "bar" )); // 出力結果 /posts/view/bar --------------------------------------- http://book.cakephp.org/2.0/ja/core-libraries/helpers/html.html#HtmlHelper::url 前回cakePHP3の質問だったのでてっきりcakePHP3の書き方で教えてくださったのかと思っていました。あとバージョンでいちいち変わりますね、書き方が。cakePHP
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問