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

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

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

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

CakePHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

4095閲覧

CakePHP3+Ajaxで検索結果を表示する

gekota

総合スコア8

PHP

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

CakePHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2017/11/05 07:59

###前提・実現したいこと
CakePHP3.5 + Ajaxで検索を行い、検索結果を一覧表示する。
検索項目に更に入力すると絞り込み検索でリアルタイムで結果が変わる様にしたい。イメージとしてはGoogle検索バーの様な感じです。

###発生している問題・エラーメッセージ
indexページでは、postsのデータは全て表示されています。
しかし、検索内容を入力しても、リアルタイムで絞り込み出来ません。
Enterキーを押すと絞り込み結果の画面にジャンプして絞り込み出来ている。

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

PHP

1# View/Cell/PostCell.php 2 3<?php 4namespace App\View\Cell; 5 6use Cake\View\Cell; 7 8class PostCell extends Cell { 9 public function ajaxSearch() { 10 $this->loadModel('Posts'); 11 12 $keyword = (string)$this->request->query('keyword'); 13 14 $posts = $this->Posts->find('all', [ 15 'conditions' => [ 16 'post_status' => 'publish', 17 'post_title LIKE' => "%$keyword%", 18 ], 19 'limit' => 20, 20 ]); 21 22 $this->set('posts', $posts); 23 } 24}

PHP

1# Template/Cell/Post/ajax_search.ctp 2 3<ul> 4 <?php foreach ($posts as $post): ?> 5 <li><?= $this->Html->link($post->post_title, '/?p=' . $post->ID) ?></li> 6 <?php endforeach ?> 7</ul>

PHP

1# Template/Posts/index.ctp 2 3<?php 4$this->assign('title', '[CakePHP] AJAX リクエストを受けるアクションの実装例'); 5?> 6<div class="content"> 7 <h1>[CakePHP] AJAX リクエストを受けるアクションの実装例</h1> 8 <?php 9 echo $this->Form->create(false, [ 10 'type' => 'get', 11 'id' => 'ajax-search-form', 12 'url' => ['action' => 'ajax_search'], 13 ]); 14 echo $this->Form->input('keyword', ['label' => '記事名で検索']); 15 echo $this->Form->end(); 16 17 $fragment = $this->cell('Post::ajaxSearch')->render(); 18 ?> 19 <div id="ajax-search-result"><?= $fragment ?></div> 20</div> 21<?= $this->Html->script('ajax') ?>

PHP

1# Template/Posts/ajax_search.ctp 2 3<?= $this->cell('Post::ajaxSearch')->render() ?>

PHP

1# Controller/PostsController.php 2 3<?php 4namespace App\Controller; 5 6use App\Controller\AppController; 7use Cake\Network\Exception\ForbiddenException; 8 9class PostsController extends AppController { 10 11 public function index() { 12 } 13 14 public function ajaxSearch() { 15 if (!$this->request->is(['ajax'])) { 16 17 } 18 $this->viewBuilder()->layout(false); 19 } 20}

参照のデータベース

SQL

1CREATE TABLE `posts` ( 2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 `title` varchar(255) DEFAULT NULL, 4 `body` text, 5 `created` datetime DEFAULT NULL, 6 `modified` datetime DEFAULT NULL, 7 `post_title` varchar(50) DEFAULT NULL, 8 `post_status` int(11) DEFAULT NULL, 9 `name` varchar(50) DEFAULT NULL, 10 PRIMARY KEY (`id`) 11) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

###試したこと
下記サイトを参考に作成してみました。
https://mbstring.com/techniques/ajax/

###補足情報(言語/FW/ツール等のバージョンなど)
CakePHP3.5
VirtualBox
Vagrant

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

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

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

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

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

guest

回答2

0

ajaxということはjavascriptから呼び出すわけですが、ajaxからphpを呼び出しているjavascriptのソースはどこでしょうか?
参考URLの「webroot/js/ajax.js」に当たる部分です。このままだと普通にPOSTしているだけのように見受けられます。
本来ですと、javascriptからphpに検索条件を送る部分、phpから実行結果を受け取って結果を表示する記述(javascript)が必要なはずです。

検索項目に更に入力すると絞り込み検索でリアルタイムで結果が変わる様にしたい。イメージとしてはGoogle検索バーの様な感じです。

とのことなので、検索項目のonchange(form自体のonchangeの方が良いかもしれませんが)でajax通信を発生させるイベントをjavascriptで書かなければならないはずです。
※参考URLはあくまでsubmit時なのでボタンなどでsubmitさせないと動作しないようになっています。

javascript

1$(function(){ 2 $("#ajax-search-form").on("change",function(){ 3 //検索条件受け取り 4    //検索条件をPHPへ渡す(AJAX通信) 5    //successでPHPから取得した検索結果でHTMLを書き換え 6 }); 7}); 8 9

投稿2017/11/05 08:24

m.ts10806

総合スコア80850

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

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

0

自己解決

ご教授ありがとうございます。
確かに.jsファイルが抜けておりました。
それと、indexページにライブラリーを指定されていないのが原因でした。

java

1// webroot/js/ajax.js 2 3 +function($) { 4 var $form = $('#ajax-search-form'); 5 var $result = $('#ajax-search-result'); 6 7 8 // フォーム送信イベント 9 $form.on('keyup', function() { 10 var url = $form.attr('action'); 11 var data = $form.serialize(); 12 console.log('■■keyup'); 13 // ここで AJAX リクエストを実行しています。 14 $.get(url, data).done(function(data) { 15 $result.html(data); 16 }); 17 18 return false; 19 }); 20 21 // キー入力中も一定間隔で送信するようにしています。 22 var t; 23 $form.find('[name="keyword"]').on('input', function() { 24 clearTimeout(t); 25 t = setTimeout(function() { 26 console.log('■■自動'); 27 $form.triggerHandler('submit'); 28 }, 300); 29 }); 30 }(jQuery);

php

1<?php 2$this->assign('title', '[CakePHP] AJAX リクエストを受けるアクションの実装例'); 3?> 4<div class="content"> 5 <h3>[CakePHP] AJAX リクエストを受けるアクションの実装例</h1> 6 <?php 7 echo $this->Form->create(false, [ 8 'type' => 'get', 9 'id' => 'ajax-search-form', 10 'url' => ['action' => 'ajax_search'], // AJAX リクエスト送信先のアクション 11 ]); 12 echo $this->Form->input('keyword', ['label' => '記事名で検索']); 13 echo $this->Form->end(); 14 15 // 初期表示用の HTML の断片を得るために AJAX セルを実行しています。 16 $fragment = $this->cell('Post::ajaxSearch')->render(); 17 ?> 18 <div id="ajax-search-result"><?= $fragment ?></div> 19</div> 20 21<!-- 追加 --> 22<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 23 24<?= $this->Html->script('ajax') ?>

投稿2017/11/05 22:54

gekota

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問