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 用のレイアウトが使用できます。あくまでモバイル側の対応のみです。今後、レイアウトの強制変更を停止する方法を見つけたら、追記させて頂きます。
hiroさんのコメント
同様の現象が起きていて参考にさせていただきました。
ちなみに自分はcakephp1.3でしたが、以下のようにapp_controller内にbeforeRenderを定義することで対応しました。
function beforeRender()
{
if ($this->RequestHandler->isAjax()) {
$this->layout = ‘default’;
}
}
試していませんが、自作のajax通信時にレイアウトファイルを変更したい場合は、個別にコントローラでbeforeRender()を定義して変更すればうまくいくかと思います。