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

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

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

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

Q&A

解決済

2回答

3121閲覧

cakePHP3でフォームの値を受け取りクエリ実行後結果を画面出力をする

sea1kiki1

総合スコア14

CakePHP

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

0グッド

0クリップ

投稿2017/01/15 09:31

編集2017/01/15 23:01

○やりたいこと
controller のアクションで
formのPOST値(コントロール名は仮にkeywordと称する)を受け取り、その値を条件にして
クエリを実行。実行結果をformと同じ画面に表示

○環境
Server MAMP apache,php7,MySQL
cakePHP3.3

○現状
■controller action内

public function search() { if($this->request->is('ajax')) { $this->autoRender = false; // (1) $keyword 取得 // (2) $keywordでクエリ実行 // $this->find を使用 conditionに(1)を渡す // (3) (2)の実行結果が一件以上あれば (もしくはクエリが失敗していない場合) $success = true; // (4) (2),(3)の結果を配列にセット $res = array( 'result' => (2)の結果, 'success' => $success ); return json_encode(compact('res')); }

■view form内 method=post POSTバックしている
// myformはformのid

$this->Form->input('keyword'); $this->Form->button(__('Submit'),array('id'=>'to_submit'));

■view <script>タグ内

<script type="text/javascript"> $(document).ready(function(){ $('#testsubmit').click(function(e){ e.preventDefault(); var keyword = $('#keyword').val(); $.ajax({ type: 'post', url: '/(dir_name)/(controller_name)/search', dataType : 'json', data: { word: keyword} , success: function(response){ alert('success'); // (A) }, error: function(){ alert('error'); // (B) msg = errorHandler(arguments); alert(msg); } }); }); }); $('#myform').submit(function(){ return false; }); function errorHandler(args){ // エラー内容判定 return message; }

○エラーなど
現状は、submitボタンクリックイベントで(B)のダイアログが表示されます。

○補足
controller内で
public $components = array('RequestHandler'); を記述
jquery.min.jsは、<head>内で記述

解決策をご存知の方がおられましたら、お願いいたします。
不足内容があればご指摘ください。
よろしくお願いいたします。

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

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

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

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

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

popobot

2017/01/15 21:37 編集

質問のコードはMarkdownのコードブロック``` ```で囲ってください
guest

回答2

0

自己解決

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

icchiiさん
ご指摘のように、actionのreturnをechoに変更し、次行にexit;を追加
これで、controller側からJSON形式データの返却が確認できました。
ありがとうございます。

entry01さん
$this->request->is('ajax') のご指摘部分については、再掲になりますが、よくわかりませんでした。
よければもう少し詳しく教えていただけますでしょうか?

投稿2017/01/16 02:51

sea1kiki1

総合スコア14

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

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

popobot

2017/01/16 05:34 編集

自分の回答を参考にして解決したのであれば、できれば自分の回答をベストアンサーにしてください。また、何故かマイナス評価を受けているのでプラスしてほしいですね...。 ついでにcakephp内でexitを使うのはあまりよくないかもですね
guest

0

質問のコードが断片的なので、状況を再現するのは難しいので、調査方法を回答します。

  • logs/error.logにエラーが記載されていないか調べてください。

  • ブラウザのデベロッパーツールのネットワーク情報で、ajaxでPOSTしたリクエストのステータスがどうなっているか確認してください。また、レスポンスデータにエラー等が記載されていないか確認してください。


なお、ざっとコードを見た感じだと、Controllerでjson_encodeした結果をreturnしていますが、echoに変えればうごくかもしれません。

php

1echo json_encode(compact('res'));

投稿2017/01/15 21:19

編集2017/01/15 21:21
popobot

総合スコア6586

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

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

退会済みユーザー

退会済みユーザー

2017/01/15 23:06

その前に $this->request->is('ajax') の問題があるきがするが気のせい?
sea1kiki1

2017/01/15 23:44 編集

回答ありがとうございます。 未解決です。 が、以下の対応をしてみました。 (ア)対応 (1)action内でご指摘のように return していた箇所を echoに変更 (イ)確認したこと  (1)ブラウザFireFox 開発ツール → ネットワーク    要求ボディ inputコントロールで入力した値が以下のように表示     keyword=aaaa 現状は、jqueryのerror: error: function(data,status,errors){ alert('error'); alert(data); alert(status); alert(errors); msg = errorHandler(arguments); alert(msg); } の箇所で、msgの内容は searchController Not Foundです 本件で、この名前のcontrollerは存在しません 引き続き、宜しくお願いできればと思います。
popobot

2017/01/15 23:42 編集

Not Foundとでるなら、以下の部分の指定がおかしいのではないかと url: '/(dir_name)/(controller_name)/search',
popobot

2017/01/16 00:37 編集

> その前に $this->request->is('ajax') の問題があるきがするが気のせい? コメントありがとうございます。どこが問題なのかご自身で別途回答してください。 ajaxの場合、jsonを返したいという意図なので、別におかしくもないと思いますけど...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問