簡単な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で管理画面を表示できるようになる。