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

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アプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

15756閲覧

CakePHP3の$this->autoRender = false; を指定すると何も表示されない

Babyloos

総合スコア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アプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/08/30 11:56

編集2016/09/01 10:07

###CakePHP3にて
該当コントローラーのアクション内にて$this->autoRender = false; を指定すると、viewファイルによる描画だけでなくecho "test"の内容も表示されません。
どなたかご教授お願い致します。

問題解決のためにできる限りシンプルな内容で作成しました。
以下、行ったことの一覧です。

  1. 「php composer.phar create-project --prefer-dist cakephp/app testapp」コマンドにて新しいプロジェクトを作成。
  2. mysql上に'testapp'データベースを作成。
  3. app.confのDatasources部を修正。
  4. 手書きにてTestsController.phpを作成。
  5. 表示を確認。

以下該当コードです。

php

1<?php 2 'Datasources' => [ 3 'default' => [ 4 'className' => 'Cake\Database\Connection', 5 'driver' => 'Cake\Database\Driver\Mysql', 6 'persistent' => false, 7 'host' => 'localhost', 8 /** 9 * CakePHP will use the default DB port based on the driver selected 10 * MySQL on MAMP uses port 8889, MAMP users will want to uncomment 11 * the following line and set the port accordingly 12 */ 13 //'port' => 'non_standard_port_number', 14 'username' => 'testapp', 15 'password' => 'testapp', 16 'database' => 'testapp', 17 'encoding' => 'utf8', 18 'timezone' => 'UTC', 19 'flags' => [], 20 'cacheMetadata' => true, 21 'log' => false, 22 23 /** 24 * Set identifier quoting to true if you are using reserved words or 25 * special characters in your table or column names. Enabling this 26 * setting will result in queries built using the Query Builder having 27 * identifiers quoted when creating SQL. It should be noted that this 28 * decreases performance because each query needs to be traversed and 29 * manipulated before being executed. 30 */ 31 'quoteIdentifiers' => false, 32 33 /** 34 * During development, if using MySQL < 5.6, uncommenting the 35 * following line could boost the speed at which schema metadata is 36 * fetched from the database. It can also be set directly with the 37 * mysql configuration directive 'innodb_stats_on_metadata = 0' 38 * which is the recommended value in production environments 39 */ 40 //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], 41 42 'url' => env('DATABASE_URL', null), 43 ],

php

1<?php 2namespace App\Controller; 3 4use App\Controller\AppController; 5 6class TestsController extends AppController 7{ 8 public function index() { 9 $this->autoRender = false; 10 echo "test"; 11 } 12} 13

よろしくお願い致します。

追記:
ご提示いただいたコードを参考にコードを作成しましたが、ブラウザよりアクセスすると「Controller actions can only return Cake\Network\Response or null.」というメッセージが表示され、
ajax経由でアクセスすると「500 (Internal Server Error)」というメッセージが帰ってきます。

ご教授お願い致します。

php

1<?php 2namespace App\Controller; 3 4use App\Controller\AppController; 5 6class TestsController extends AppController 7{ 8 public function index() { 9 $this->autoRender = false; 10 $returnData = array('test'=>'test'); 11 return json_encode($returnData); 12 } 13}

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

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

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

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

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

kunai

2016/08/31 04:40

action内の記述はこの通りになっていますか?これ以外の記述もあるが、関係ないと思える為に省略されているのであれば、提示可能な範囲で全て提示をお願いします。 また、controllerのクラス宣言部分+$components等のクラスプロパティも含め提示いただけますか
Babyloos

2016/08/31 10:32

ご指摘ありがとうございます。 新たにシンプルな内容の物を作成し、掲載致しました。 その他、掲載するべき内容がございましたらご指摘下さい。 よろしくお願い致します。
guest

回答1

0

最終的に testという文字を、ブラウザに表示したいということでしょうか?

だとすると、autoRenderを有効にして、コントローラに紐づくテンプレートに表示させたい文字を渡して、文字を表示するか、別のテンプレートに同じく表示させたい文字を渡して、レンダリングするしかありません

自分は、autoRenderを無効にするのは、以下のようなケースしかないと考えます
0. Ajax経由でコントローラのメソッドが呼び出されたため、画面の表示は不要
0. コントローラ内で処理を分岐し、それぞれ別のテンプレートで画面を表示する

CakePHPは、MVCというデザインパターンで構成されたフレームワークですので、一度MVCというデザインパターンを理解してみてはいかがでしょうか?

追記:(再編集しています)
CakePHP3でだいぶ動きが変わっていました。申し訳ありません。
自分の環境で動作を確認した処理を記述します。

CakePHP

1 2//routes.php 3Router::extensions(['json', 'xml']); // これを追加 4 5// Contoroller 6public function initialize() { // initializeメソッドがなければ追加 7 parent::initialize(); 8 $this->loadComponent('RequestHandler'); // これを追加 9} 10 11/** 12 * Ajaxの処理メソッド 13 */ 14public function AjaxTest() { 15 $returnData = array('test'=>'test'); 16 17 $this->set('data',$returnData); 18 $this->set('_serialize', ['data']); 19} 20 21// JavaScript 22$(function() { 23 $('#TestAjax').on('click',function() { 24 jQuery.ajax({ 25 type: "POST", 26 async:false, 27 url: '/cakephp3/test/AjaxTest.json', 28 dataType: 'text', 29 complete: function(XMLHttpRequest){ 30 set_data(XMLHttpRequest.responseText); 31 }, 32 error: function(XMLHttpRequest, textStatus, errorThrown) { 33 alert("Ajax通信エラー発生:"+errorThrown); 34 } 35 }); 36 }); 37}); 38 39function set_data(data) { 40 var res = eval('(' + data + ')'); 41 42 $('#messageText').text(res.data.test); 43 44}

Javascript側で受け取ったデータは、
{'data':{'test':'test'}}
という形式になっているので、evalで処理した後はres.data.testという形でデータを取り出します

投稿2016/08/31 10:53

編集2016/09/01 15:56
KatsumiTanaka

総合スコア924

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

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

Babyloos

2016/08/31 11:57

回答ありがとうございます。 今回、Ajax経由でのコントローラーのメソッドを呼び出したくてこのような処理を実現させたいと考えております。 最終的にはtestという文字列ではなく、jsonを出力したいと考えています。 数日前に同じ処理を書いた時には問題なく動作したのですが、あるときを境に表示されなくなってしまいました。 もしかしたら、cakePHPのプロジェクト外でのなにかしらの変更が影響しているのかもしれません・・・
KatsumiTanaka

2016/08/31 12:36

Ajaxの呼び出しで、json形式でデータを戻す処理のサンプルコードを追記しました ご参考までに
Babyloos

2016/09/01 10:11

お世話になります。 ご提示いただいたコードを参考にコードを作成しましたが、うまくいかないようです。 度々申し訳ないですが、ご教授頂ければ幸いです。
KatsumiTanaka

2016/09/02 13:55

すみません、Cakephp3になってからだいぶ仕様が変わっていたようです。 自分の環境で動作確認を行ったソースを追記しましたので、ご確認ください。
Babyloos

2016/09/04 07:00

度々すみません、ご提示頂いたコードの通りにroutes.phpとcontroller、javascriptコードを修正したのですが、Internal Server Errorが帰ってきてしまいます。 ajaxのアクセス先コントローラーにブラウザから直接アクセスしてもやはりMissing Templateが表示されてしまいます。 本来であればMissing Templateが表示されずに取得したjsonコードが表示されるはずなのでしょうか? ご教示お願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問