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

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

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

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

Q&A

解決済

2回答

3714閲覧

CakePHPの404ページViewをPCとスマホで分けたい

smnsmn

総合スコア175

CakePHP

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

0グッド

0クリップ

投稿2016/05/10 12:19

CakePHP2系です。

スマホ用URLの場合、スマホに合わせた404エラーページを表示したいです。
1系の古い情報しかなく、うまくいかないため質問させて頂きました。
スマホの場合◯◯/smart/〜〜というURLになるので、下記のように判定させていますが、PCのエラーページが表示されてしまいます。

app_error.phpの記述がおかしいのだと思いますが、調べても理解できず、お力をお借りしたく存じます。
何卒、アドバイスよろしくお願い致します。

PHP

1//app/app_error.php 2<?php 3class AppError extends ErrorHandler { 4 5 public function error404($params) { 6 if (isset($this->params['prefix']) && $this->params['prefix'] == 'smart') { 7 $this->controller->layout = 'smart_error'; 8 parent::error404($params); 9 } else { 10 $this->controller->layout = 'pc_error'; 11 } 12}

Viewは端折っていますが下記のようになっています。

HTML

1//View/Errors/smart_error400.ctp 2<?php $this->layout = "smart_error"; ?> 3 4 <h2 class="title">404 ご指定のページは見つかりませんでした</h2> 5 6 <p class="message">エラー:このページは存在していないURLです。</p>

Layout

HTML

1//View/Layouts/smart_error.ctp 2<!doctype html> 3<html> 4<head> 5<meta charset="utf-8"> 6<?php echo $this->element('smart_header'); ?> 7</head> 8<body> 9 10<div id="container"> 11 12<?php echo $this->element('smart_header_menu'); ?> 13 14<?php echo $this->fetch('content'); ?> 15 16<?php echo $this->element('smart_footer'); ?> 17</div> 18</div> 19 20</body> 21</html>

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

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

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

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

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

guest

回答2

0

自己解決

質問者です。

力技かもしれませんが、404エラーページをスマホとPCで分けることが出来たので記載します。
以下、ちゃんとリファレンスを読み解けておりませんので、間違いがあったらすみません。

まず、質問に書いていた下記ですが、これはCakePHP1系の記述方法のようです。
2系のエラー用Viewファイルがerror400.ctpであることにもっと早く気づくべきでした。

PHP

1!これは1系のやり方! 2//app/app_error.php 3public function error404($params) { 4 if (isset($this->params['prefix']) && $this->params['prefix'] == 'smart') { 5 $this->controller->layout = 'smart_error'; 6 parent::error404($params); 7 } else { 8 $this->controller->layout = 'pc_error'; 9 } 10}

前述しましたが、2系で404エラーのViewとしてデフォルトとなっているのは/View/Errors/error400.ctpです。
400系エラーの場合はこちらが呼び出されるようですが、それを行っているのが、下記です。

PHP

1//cakephp/lib/Cake/Error/ExceptionRenderer.php 2 public function error400($error) { 3 $message = $error->getMessage(); 4 if (!Configure::read('debug') && $error instanceof CakeException) { 5 $message = __d('cake', 'Not Found'); 6 } 7 $url = $this->controller->request->here(); 8 $this->controller->response->statusCode($error->getCode()); 9 $this->controller->set(array( 10 'name' => h($message), 11 'message' => h($message), 12 'url' => h($url), 13 'error' => $error, 14 '_serialize' => array('name', 'message', 'url') 15 )); 16 $this->_outputMessage('error400'); //ここがエラー用Viewファイル名 17 //$this->_outputMessage('smart_error400'); に変更するとスマホ版が表示できました 18 } 19

上記の、$this->_outputMessage('error400');の部分を条件分岐でスマホとPCで切り替えようとしたのですが、上手く行かず・・・
読込み場所とか、呼び出し順の関係でしょうか。コア部分をいじるのは怖いので、ここは諦めました。

###結局どうしたのか
CakePHPのテーマ機能を使いました。
テーマのルールに沿って、/View/Themed/Smartというディレクトリを作ります。
Smartディレクトリ以下に、/View/Errorsをコピーします。

こんな感じのディレクトリ構造です。
View/
├ Themed/ (新規作成)
│ └ Smart/ (ここは名前はなんでもOK(キャメル記法))
│ └ Errors/ (コピーしてきたもの)
│ ├ error400.ctp (これがスマホ用エラーViewになります)
│ └ error500.ctp

├ Errors/
│ ├ error400ctp (こっちがPC用エラーView)
│ └ error500.ctp

だいたいこんな感じで、スマホ用のエラーをテーマで分けてしまいます。
その後は、スマホ用コントローラーがある場合は、そのコントローラーで$useや$components同様に
public $theme = 'Smart'; で読み込むか、

私はAppControllerのbeforeFilter()内でスマホかどうかの判定をしているので、そこで
$this->theme = 'Smart'; で読み込んでいます。
この書き方の場合は、アクション別に使用したい時などにも使えます。

以上です。
あくまで力技なので、推奨されない方法かもしれません。
良き方法があればご指摘下さい。
ありがとうございました。m(__)m

投稿2016/05/10 15:42

smnsmn

総合スコア175

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

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

0

質問に質問を重ねるようで申し訳ありません。

ここってどうなってんだろう。怪しいな。レベルで書いています。

  1. $this->params['prefix']

これって値何が帰ってきています? var_dumpやらlogにだして確認をしていただきたいです。きっと、smartでは帰ってきていますかね。

  1. オーバーライドするなら
    if (isset($this->params['prefix']) && $this->params['prefix'] == 'smart') {
    $this->controller->layout = 'smart_error';
    parent::error404($params);
    } else {
    $this->controller->layout = 'pc_error';
    parent::error404($params);
    }

ただ、上でだめだといっているので。
parent::error404($params); // このメソッド変えてきてくれるのかしらん。。。
if (isset($this->params['prefix']) && $this->params['prefix'] == 'smart') {
$this->controller->layout = 'smart_error';
} else {
$this->controller->layout = 'pc_error';
}

回答になっていませんが、試していただければ。

投稿2016/05/10 12:54

t1una

総合スコア10

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

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

smnsmn

2016/05/10 15:03

コメントありがとうございます。 > 1.$this->params['prefix'] これって値何が帰ってきています? こちらに関しては、プレフィックスルーティングを設定しておりまして、 'smart'が返ってくるようになっています。 試してみましたが、だめでした。 力技ではありますが、自己解決出来たので回答を記載させて頂きます。m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問