2013年4月5日金曜日

[CakePHP]デフォルトのlayouto、styleのscaffoldを管理画面として使用する

簡単なWEBサービスの場合、管理画面を作るために、工数を割いていられない。
そんな時、デフォルトのscaffoldの画面はDBを管理するにはちょうどいいインターフェイスになっているので、管理画面として使用するにはうってつけだ。

Cake本家のドキュメントでも同じようなことをしているが、今回はこれを少し拡張した手順となっている。

 通常scaffoldを使用する場合、CSSスタイルシートは各controllerで指定している$this->layoutで指定しているレイアウトと、それが参照しているcssファイルが適用されることになる。
でも、Cakeのデフォルトのレイアウトとスタイルが見やすくて好きだし、考えなくてよいので楽だと思うのです。
また、管理画面にBASIC認証をかけたいとも思う。

そんなときどうするか。
CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zipだけど、他のバージョンも少し修正すればいけると思います。

1.デフォルトのレイアウト、default.ctpをコピーする。

/cake/libs/view/layouts/default.ctpをコピーして、
 /views/layouts/scaffold.ctpを作成します(ファイル名はなんでもよい) 。

2. core.phpに以下を追加。prefixとして'admin'を登録します。

Configure::write('Routing.prefixes', array('admin'));
prefixとはhttp://【mydomain】/【prefix】/【controller】/【action】のような位置で指定できるものです。
なので、これをすると、http://【mydomain】/admin/themes/indexみたいなURLでアクセスすることが可能になります。

3.app_controllerを以下のようにします。

class AppController extends Controller {
    var $scaffold = 'admin';//scaffoldのprefixに'admin'を指定
    var $components = array('Auth','Session','Security');//Basic認証のためSecurityコンポーネントを使う

    function beforeFilter(){
        $this->Security->validatePost = false;
        if(!empty($this->params['admin'])){
            if($this->params['admin']) {//ここで'admin'prefixつきのアクセスかを判別
                $this->layout = 'scaffold';//prefixが'admin'のアクセスの場合は、scaffold.ctpをlayoutとして使用する。 
                $this->paginate[$this->modelNames[0]]['limit']=20;//paginateのアイテム数はこうやって自由に変えられます。
                $this->Security->loginOptions = array(
                    'type'=>'basic',
                    'realm'=>'MyRealm'
                );
                $this->Security->loginUsers = array(
                    'ID'=>'PASSWORD'//IDとPASSWORDはお好きな文字列にする。
                );
                $this->Security->requireLogin();
            }
        }
    }
}

6行目の$this->Security->validatePost = false;をしているのは、Securityコンポーネントをロードした場合、formtagのチェックが有効になってしまうから。postのフォームをきちんとformタグが入るように生成している場合は問題ないが、自分はしていなかったので、falseにした。

4.route.phpに以下を追加

Router::connect('/admin',array('controller' => 'themes', 'action' => 'index','admin' => true));

これを追加しないと、http://【mydomain】/admin/themes/のようにアクセスしないといけないので。
http://【mydomain】/admin/のように短いurlで管理画面を表示できるようになる。



0 件のコメント:

コメントを投稿