CakePHP で jQuery Mobile を使用して Ajax を有効にした状態でページ遷移しようとすると真っ白な画面に undefined になる場合の解決方法

jQuery Mobile はデフォルトでページ遷移を Ajax で処理してくれます。ただ、CakePHP はデフォルトで Ajax を勝手に判断して Ajax のレイアウトを返してくれるように設計されています。そのため、いくら jQuery Mobile に対応させたモバイル用のテーマを作成したとしても、それが読み込まれないため、以下のように Undefined 表示されてしまいます。

だからといって jQuery Mobile の Ajax 機能を完全に停止してしまうのではなく、モバイルアクセス時のみ Ajax でレイアウトが変更されないように、CakePHP 側をなんとかして設定するのが良いのかなと思います。

ただ、現状 CakePHP の Ajax 時の強制的に ajax.ctp が使われるのを防ぐ方法が分からず、コアファイルも弄るのも微妙だったので Layout/ajax.ctp を作成して、その中に以下のような記述をして、ajax.ctp が使用されても、結果的に default.ctp を使うように設定しました。

1
include 'default.ctp';

ちなみに、jQuery Mobile を使用して CakePHP でサイトを作成する場合は、モバイル用テーマを作成すると思うので、PC などでは通常通り Ajax 用のレイアウトが使用できます。あくまでモバイル側の対応のみです。今後、レイアウトの強制変更を停止する方法を見つけたら、追記させて頂きます。

コメント

  1. hiroさんのコメント

    同様の現象が起きていて参考にさせていただきました。

    ちなみに自分はcakephp1.3でしたが、以下のようにapp_controller内にbeforeRenderを定義することで対応しました。

    function beforeRender()
    {
    if ($this->RequestHandler->isAjax()) {
    $this->layout = ‘default’;
    }
    }

    試していませんが、自作のajax通信時にレイアウトファイルを変更したい場合は、個別にコントローラでbeforeRender()を定義して変更すればうまくいくかと思います。