CakePHPのscaffoldでdatetimeなどの日時形式をカスタマイズする

CakePHPホント便利。そろそろ2.x系に移行しなくちゃと思って勉強しつつ、移行コストが億劫で1.3系も現役なうです。特に管理画面はscaffoldで事足りちゃうぐらい簡単なのが嬉しいんですけど、海外製なのでところどころ不便な事があります。例えば日時。date,datetime,timestamp型の場合、自動生成されるプルダウンが「月-日-年」の順番っていうだけでも馴染みがないのに、月のプルダウンは1〜12じゃなくてJanuary〜Decemberの英語名!これじゃあ英語ネイティブでもないとサクサク入力できません。うむむ。

ところが!さすがCake先生、カスタマイズしやすいようちゃんと用意されてます。手順は下記の通り。

1.cake/libs/view/scaffolds/edit.ctpをapp/views/scaffolds/edit.ctpにコピー

2.コードを下記のように編集

echo $this->Form->create();

となっている1行を

$options = array(
‘inputDefaults’ => array(‘dateFormat’ => ‘YMD’, ‘timeFormat’ => 24, ‘monthNames’ => null)
);
echo $this->Form->create(null, $options);

に変更します。これだけでdate型のプルダウンは年月日の順になり、月は英語名から数字になり、時間はAMとPMの12時間から24時間になります。他のオプションも設定できるので、minYearやmaxYearあたりを適宜設定してあげると使いやすくなるかもしれません。

最近はPHPのフレームワークでもFuelPHPなんかが活発になってきていて、CakePHPの行く先を案じつつも、割と細かいところに手が届いてくれるこの子をまだまだ手放せそうにないこの頃です。

CakePHP 1.3のbakeで焼かれるビューをカスタマイズする方法

日本語ドキュメントを参考にしたら上手く動かないから、ソースコード読んで頑張った…そしたら元の英文ドキュメントには正しい事が書いてありましたorz

やっぱりドキュメントは原文を当たるのがセオリーのようです。よし学んだ!

手順

  1. app/vendors/shells/templates に好きなテーマ名でディレクトリを作成(※ユニークな必要があるので「default」以外の名前で)
  2. app/vendors/shells/templates/[themename] にviewsディレクトリを作成
  3. cake/console/templates/default/views の下に4つの.ctpファイルがあることを確認
  4. app/vendors/shells/templates/[themename]/views に4つの.ctpファイルをコピーする
  5. ctpファイルを自分の好みに編集する

いつも通りにViewをbakeすれば、途中でどのテーマを使うか聞かれます。「default」ではなく自分で作成したテーマを選択すれば、[themename]/views以下のctpファイルを元にviewが焼き上がります。テーマ名さえ違えばテーマは複数作れるようなので、フロントと管理系で分けたりできますね!

注意点

  • bakeするviewの元になるコントローラーがないと怒られる(そりゃそうか…)
  • bakeコンソールに入った状態でテーマを作成しても、テーマ選択が出てきませんでした。テーマを作成してからbakeコンソールを起動(実行)して下さい。

参考

CakePHPで管理画面用のレイアウトを設定する

  1. config/core.phpでRouting.prefixesの設定を有効にする(コメントアウト解除)
  2. app/app_controller.phpのbeforeFilterに下記のコードを設定する
  3. 以上

[php]
<?php
class AppController extends Controller {

function beforeFilter() {
if (isset($this->params[‘prefix’]) && $this->params[‘prefix’] == ‘admin’) {
$this->layout = ‘admin’;
}
}

}
[/php]

Routing.prefixesの値として”admin”を使用した場合の記述です。例えばprefixesに”manager”を設定した場合は、5行目の「== ‘admin’」の部分を「== ‘manager’」として下さい。

6行目、$this->layoutの方は自分がapp/view/layoutフォルダ内に作った管理画面用のレイアウトファイル名に合わせて下さい。manager.ctpという名前なら「$this->layout = ‘manager’」となります。

app/app_controller.phpがない場合は、cake/libs/controller/app_controller.phpからコピーした上で、app配下のファイルを編集しましょう。

※参考
php – Change admin layout in CakePHP – Stack Overflow