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

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

ただいまの
回答率

90.45%

  • PHP

    24646questions

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

  • HTML

    11937questions

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

  • CakePHP

    2558questions

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

  • Ajax

    1358questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,697

Babyloos

score 2

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
 'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            /**
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            'username' => 'testapp',
            'password' => 'testapp',
            'database' => 'testapp',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,

            /**
             * Set identifier quoting to true if you are using reserved words or
             * special characters in your table or column names. Enabling this
             * setting will result in queries built using the Query Builder having
             * identifiers quoted when creating SQL. It should be noted that this
             * decreases performance because each query needs to be traversed and
             * manipulated before being executed.
             */
            'quoteIdentifiers' => false,

            /**
             * During development, if using MySQL < 5.6, uncommenting the
             * following line could boost the speed at which schema metadata is
             * fetched from the database. It can also be set directly with the
             * mysql configuration directive 'innodb_stats_on_metadata = 0'
             * which is the recommended value in production environments
             */
            //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],

            'url' => env('DATABASE_URL', null),
        ],
<?php
namespace App\Controller;

use App\Controller\AppController;

class TestsController extends AppController
{
    public function index() {
        $this->autoRender = false;
        echo "test";
    }
}

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

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

ご教授お願い致します。

<?php
namespace App\Controller;

use App\Controller\AppController;

class TestsController extends AppController
{
    public function index() {
        $this->autoRender = false;
        $returnData = array('test'=>'test');
        return json_encode($returnData);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kunai

    2016/08/31 13:40

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

    キャンセル

  • Babyloos

    2016/08/31 19:32

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

    キャンセル

  • この投稿は削除されました

回答 1

0

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

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

自分は、autoRenderを無効にするのは、以下のようなケースしかないと考えます

  1. Ajax経由でコントローラのメソッドが呼び出されたため、画面の表示は不要
  2. コントローラ内で処理を分岐し、それぞれ別のテンプレートで画面を表示する

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

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

//routes.php
Router::extensions(['json', 'xml']); // これを追加

// Contoroller
public function initialize() { // initializeメソッドがなければ追加
    parent::initialize();
    $this->loadComponent('RequestHandler'); // これを追加
}

/**
 * Ajaxの処理メソッド
 */
public function AjaxTest() {
        $returnData = array('test'=>'test');

        $this->set('data',$returnData);
        $this->set('_serialize', ['data']);
}

// JavaScript
$(function() {
    $('#TestAjax').on('click',function() { 
        jQuery.ajax({
            type: "POST",
            async:false,
            url: '/cakephp3/test/AjaxTest.json',
            dataType: 'text',
            complete: function(XMLHttpRequest){
                set_data(XMLHttpRequest.responseText);
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert("Ajax通信エラー発生:"+errorThrown);
            }
        });
    });
});

function set_data(data) {
    var res = eval('(' + data + ')');

    $('#messageText').text(res.data.test);

}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/31 20:57

    回答ありがとうございます。
    今回、Ajax経由でのコントローラーのメソッドを呼び出したくてこのような処理を実現させたいと考えております。

    最終的にはtestという文字列ではなく、jsonを出力したいと考えています。

    数日前に同じ処理を書いた時には問題なく動作したのですが、あるときを境に表示されなくなってしまいました。

    もしかしたら、cakePHPのプロジェクト外でのなにかしらの変更が影響しているのかもしれません・・・

    キャンセル

  • 2016/08/31 21:36

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

    キャンセル

  • 2016/09/01 19:11

    お世話になります。

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

    キャンセル

  • 2016/09/02 22:55

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

    キャンセル

  • 2016/09/04 16:00

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

    キャンセル

  • 2016/09/04 18:58

    自分の環境でも、
    http://localhost/cakephp3/tags/AjaxTest
    でアクセスすると、Missing Templateとなりますが、
    http://localhost/cakephp3/tags/AjaxTest.json
    でアクセスすると、jsonで返却されたデータが表示されます
    アクセスするURLはどのようになっていますか?

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24646questions

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

  • HTML

    11937questions

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

  • CakePHP

    2558questions

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

  • Ajax

    1358questions

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