WHAT'S NEW?
Loading...

CakePHPのテーマ機能を使う 【CakePHP Advent Calendar 2011】

今年もやって参りました、CakePHP Advent Calender。
21日担当の俺でやんす。

俺のことはむしろどうでも良いのですぐに本題に入る訳よ。どうよ。

まずこの記事の対象となるCakePHPのバージョンは1.3なので、
1.2をお使いのモノノフがオレオレテーマ機能を自前で開発する方向性ならば、残念ながらこの場でサヨナラするか、素直に1.3を使うのが良策かと。

というわけで早速やってみよう。



まずはあなたが赴くままに好き勝手に作ったviewsフォルダ内を以下のような状態
だと仮定してみるところから始めるよ。
  • views
    • dashboards
      • index.ctp
    • elements
      • email
        • html
        • text
    • errors
      • error404.ctp
    • users
      • index.ctp
      • add.ctp
      • edit.ctp
      • view.ctp
よくある一般的なフォルダ構造だ。

一般的なのかどうかはあくまで俺の主観的な話なので、『こんなふうにはなってない、俺は!』とか、『これでいいのか!?俺は!』とか『海賊王に、俺はなる!』とか言う人は、もう面倒くさいからサヨナラだ!

それからcssファイルや画像ファイル、JavaScriptファイルなんかは、viewsフォルダではなくてwebrootフォルダ内に入れることになっている。
  • webroot
    • css
    • files
    • img
    • js
こんなふうになるよね。

で、今回テーマ機能を使うにあたって、予め決められた階層構造にしておかないと行けなかったりする。

どういうふうに決められているのか?だけど、それほど難しくない。

『views』フォルダの中に、『themed』というフォルダを作り、そこに自作のテーマを入れるという流れになるわけですよ。

例えばあなたが好き勝手気ままに付けたテーマ名が『kissmyass』だったとすると、
  • app
    • views
      • themed
        • kissmyass

という構造になる。
なかなか興味深いね。

で、このkissmyassだけど、この中身はどうなってるの?と思うかもしれない。
むしろ思ってくれ。

答えは簡単。

app/viewsの中身をそのまま再現

だ。

だから、先程説明した一般的な構造を、kissmyassテーマ内に再現するとしたら、このようになる。
  • app
    • views
      • themed
        • kissmyass
          • dashboards
            • index.ctp
          • elements
            • email
              • html
              • text
          • errors
            • error404.ctp
          • users
            • index.ctp
            • add.ctp
            • edit.ctp
            • view.ctp

viewsの直下にthemed/kissmyassが入るだけだ。
簡単だね、明瞭だね。問題ないね。

さて、テーマというからには、テンプレート+アセットを管理したいと思うだろう。
ctpファイルはテンプレートなので、画像などは含まれていない。
そういう場合、webrootもテーマ機能の監視下に置きたくなるはずだ。

しかしちょっとまたれい!チャタレイ夫人!

webrootはそもそもviews内に入れるものではなく、ドキュメントルートとして位置の変更はできないのではないか?と、疑問に思う人もいる筈だ。
いようがいまいが、俺は疑問に思った。

しかし俺およびあなたには、ここで安心する手段が残されている。
なんと、webrootをテーマ内に入れてしまうことができるのだ!!

つまり階層的にはこうなるゥ!!

  • app
    • views
      • themed
        • kissmyass
          • dashboards
            • index.ctp
          • elements
            • email
              • html
              • text
          • errors
            • error404.ctp
          • users
            • index.ctp
            • add.ctp
            • edit.ctp
            • view.ctp
          • webroot
            • css
            • files
            • img
            • js

何たるちや!サンタルチア!

これで、themed内のkissmyassフォルダだけにすべてが入ったことになる!
さすがCakePHP1.3!
俺達にできないことを
平然とやってのけるッ!
そこにしびれる!
憧れるゥ!
というわけで、これで終わった。
長く険しい戦いだった。
応援ありがとうございました!
オガーン先生の次回作に期待!
とは、ならない。
終わったというのはあくまでテーマ機能の準備の話。

テーマを作ったら、今度はコントローラに教えてやらないといけない。
ここは自動ではないんだ。残念だ。

コントローラ毎にテーマを設定するのは面倒臭いので、
ここではapp_controller.phpを用意し、その中のbeforeFilterメソッドで指定してしまおうと思う。
これなら他のコントローラにテーマに関する設定を書かないで済む。

というわけで、行ってみよう。

app/app_controller.php
$this->view = 'Theme';
$this->theme = 'kissmyass';

これで完了だ。
ブラウザで見ていただきたい。

意外にあっけなくできたはずだ。

これでもうあなたは、毎回ゼロから管理画面などのデザイン性が強く要求されないアプリのデザインを作る必要がなくなり、今後はワンソース管理されたデザインで統一することができるようになったはずだ。

ビューファイルは毎回同じではないと思うけど、usersやdashboardsなんかは(俺は)毎回似たようなものをこさえていたので、これでかなり便利になった次第。

そうそう、もしテーマがkissmyassだけじゃなく、『kickme』なんかもあるのであれば、
  • app
    • views
      • themed
        • kickme
        • kissmyass

などと並べてフォルダを置けば良い。
あとはコントローラ側での話だ。


唐突に終わるんだ。


CakePHP Advent Calender 2011
前の人:20th December
Migrationsプラグインの実践的運用
 @hiromi2424