View Cache のキャッシュファイル名を変更する
久しぶりにCakePHPネタを。
ひとつのAPPで複数のサイトを運営しているAPPがあります。
bootstrap.php内でURL等を見てどのサイトかを判断しているのですが、キャッシュを設定して困りました。
aaa.example.com/index と bbb.example.com/index で生成されるキャッシュファイルが同じになってしまいます。
どちらへアクセスしても先にキャッシュされたファイルを表示してしまうのです。
しかたがないので、以下のようにキャッシュを生成することを試みました。
aaa_index.php
bbb_index.php
キャッシュヘルパーを上書きする
コアのキャッシュヘルパーをコピーする
コアのキャッシュヘルパーを、APP内にコピーします。
cp cake/libs/view/helpers/cache.php app/views/helpers
キャッシュヘルパーを書き換える
キャッシュヘルパーで書き換える箇所は1箇所です。
キャッシュを書き出している __writeFile() の↓に1行追加します。
# app/views/helpers/cache.php
# __writeFile()
$path = $this->here;
if ($this->here == '/') {
$path = 'home';
}
$path = Configure::read("subdomain") . "/" . $path; // この行を追加
$cache = strtolower(Inflector::slug($path));
subdomain はbootstrap.php にて設定してください。
この状態でURLにアクセスすると、aaa_index.phpのように、サブドメインが付加されてキャッシュファイルが作られます。
しかし、このままではdispatcherがキャッシュファイルを認識してくれません。
Dispatcher等を修正する
dispatcherの該当箇所を書き換える前に、dispatcherをコピーし、そのファイルを読むように変更しなくてはなりません。
CakePHP1.2であれば、この記事内のスライドが参考になります。
しかし、CakePHP1.3 (1.3.0)の場合、dispathcerはキャッシュしてくれないようです。
以下のように対処します。
DispatcherとBootstrapをコピーする
CakePHP1.3から登場のAPP/libsディレクトリに、コアのdispatcher.php とbootstrap.php をコピーします。
cp cake/libs/dispatcher.php app/libs cp cake/libs/bootstrap.php app/libs
Dispatcherを書き換える
cached() 内に、1行追加します。
# app/libs/dispatcher.php
# cached()
$path = $this->here;
if ($this->here == '/') {
$path = 'home';
}
$path = Configure::read("subdomain") . "/" . $path; // この行を追加
$path = strtolower(Inflector::slug($path));
次に、当Dispatcherを読み込むように修正します。
app/config/bootstrap.php にて、dispatcherの読み込み先を変更する
bootstrap.phpの最後の方に、下記を加えます。
# app/config/bootstrap.php
App::import('Lib', 'Dispatcher');
このままでは、コアのDispatcherも読みにいってしまうようですので、それを止めます。↓
Bootstrapを書き換える
コアからコピーしたapp/libs/bootstrap.phpを書き換えます。
(app/config内のbootstrap.phpではありません)
# app/libs/bootstrap.php # 最後の行をコメントアウト // require CAKE . 'dispatcher.php';
最後に、webroot/index.phpのbootstrap.phpの読み込みを変更します。
webroot/index.phpを書き換える
# app/webroot/index.php
# 次のように変更します
//if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) {
if (!include(APP_PATH . 'libs' . DS . 'bootstrap.php')) {
以上です。
もっとエレガントなやり方がありそうだけど、とりあえず。
CakePHP勉強会@東京(2010年5月)
CakePHP勉強会に行ってきました。
昨年10月末に行われたCakePHP Matsuri以来のイベント参加。
今回は、札幌・名古屋・福岡でサテライト会場ができ、どこも盛況だったもよう。
勉強会の申し込みもすぐにいっぱいとなり、今回の勉強会もひとつの祭りだったのではないでしょうか。
全体的な所感としては、@cakephperさんのテンポの良い司会と各発表者の発表の上手さがあって、あっという間の4時間でした。
テーマがCakePHP1.3ということで、非常に実践的な内容も盛りだくさんで、「勉強になった」という感じです。
CakePHP以外にも、Rackspaceというクラウドサーバーや、WAFというセキュリティソリューションの存在を知ったりと、CakePHPに関わっている人たちのCakePHPに限らないお話があって良かった。
次の日早速調べてみて、使いたくなったし。
PHP Matsuri by @yandoさん
資料
トップバッターはニューヨークから。
サテライト会場が全国規模で展開され、発表者は世界規模という、まさにグローバル。
(ちなみにNYは深夜1時すぎだそう)
発表された内容も、いきなりのビッグニュース。
なんと、前回のお祭りをスケールアップして、今年も行うらしい!
その名もPHP Matsuri
PHP5.3向けのLithiumがstable間近ということもあってか、冠から"Cake"がとれました。(symfonyとかも含まれていますよ)
前回同様CakePHPのコアデベロッパーに加え、今回はLithiumのコアデベロッパーの講演も開かれる予定とのこと。
これは胸が熱くなりますね!
開催概要をまとめると(現時点で予定していること)
-
名称
- PHP Matsuri
-
テーマ
- もっと交流、もっと刺激的に
-
開催期間
- 2010-10-02(Sat) - 2010-10-03(Sun) ※オールナイト!
-
場所
- 晴海グランドホテル(予定)
-
人数
- 100名程度
-
参加費用
- 2万円前後(食事・軽食・懇親会費用込み) ※早期購入は割引
-
内容
- コアデベロッパーによる講演
- ワークショップ(入門者向け・中級者向け・Lithium入門者向け)
- コンテスト(プラグイン・ライブラリ、ハッカソン、ドキュメント、パフォーマンス、etc)
-
主催者からのお願い
- 協賛企業・団体参加企業募集
- 参加チケットの早期購入
- コンテストへの参加
- 運営スタッフ募集
- Twitter ID
まず何といっても今回は土日を通してのイベントであるということに驚きました。
プログラムは夜遅くまで組まれていて、夜通し開発(まさにハッカソン!)できる環境とのことです。
興味のある講演を聴きつつ、他の時間で隣のエリアで実践する。
素敵ですね!
しかも場所は晴海。
自宅から至近です。徒歩圏内とまではいかずとも自転車で楽々行けます。車なら数分。
近隣の地理にも明るいので、何かお手伝いできることがあれば是非協力したいな。
と思っていたら運営スタッフ(お祭りなので「青年団」)募集とのこと。
協賛企業にはなれなそうだが、他の3つは協力できますので、よろしくお願いしますー。
ともかく楽しみなイベントの告知から始まった勉強会なのでした。
CakePHP1.3の概要 by @cakephperさん
資料
さて本題のCakePHP1.3のお話。
会場アンケートではまだまだ1.3の開発経験がない方も多く、「何が変わった?」というところに興味が集中しているようです。
変更点がまとまっていて、すぐにでも導入できるということが分かったのではないでしょうか?
私としては、一番はRoutingだと思っていて、Routingの改善が、その他に良い影響を及ぼしている箇所が随所に見られます。
CakePHP1.2ではどうしても力技で解決しなくては行けなかったことも、普通に使えるようになっていることが多いのです。
あとは、plugin周りも整備されている印象です。
1.3からplugins/xxx/webroot以下にcssや画像を置けるようになり、配布・利用がより簡単になっています。
さすがCakePHP1.x系の最終バージョンといえると思います。
CakePHPでの開発経験があり、1.3を使ったことがない方は、次の案件からは1.3をお勧めします。
Ktai Library on CakePHP1.3 by @ecworks_masapさん
資料(PDF on ecworks.jp)
Ktai Library 勉強会でもお世話になってる、作者さんです。
Ktai Library は、現在は、CakePHP1.3上で開発されているため、もし1.2のアプリケーションを1.3に移行するという場合であっても、Ktai Library周辺は変更点はありません。
この辺は実際に双方で開発してみて経験済み。
安心して使えます。
根幹部分はライブラリ化する前から使っているものとのことで、十分に安定していますし。
今回は今後のバージョンアップ予定の機能を、多数、発表していました。
個人的には、早期にplugin化が希望です。
(branchがあれば、協力できることは協力します!)
コアライブラリのエレガントなハック by @hiromi2424さん
資料
今回一番男前な発表をしたのは、CakePHP界での多大な貢献者の@hiromi2424さん。
twitterでの発言や今回の発表を聞いていて感じるのは、CakePHPの中身についての調査をとことんやっているということ。
何事も仕様を理解するというのは重要ですが、表面的なところだけさらって終了することが私は往々にしてあります。コアのコードもちょっと読んで終了とか。
ですが、このかたは、深いところまで理解している。
だからこそ、どうしても必要なこと(ハック)にあたったときに、どのようにやるかということを、「分かりやすく」説明できるのでしょう。
CakePHP触って間もない人は多少振り切られた方もいるかもしれませんが、間違いなく、今回の発表資料は保存版といえます。
今すぐブックマークを!
twitterとcloud serverとcakeで新規サービス by @takamunetaniiさん
資料
つづいて、Ktai Library 勉強会でもご一緒している@takamunetaniiさんの発表。
こんなにためになる事例紹介が過去あったか?というくらい今の私にはためになりました。
タイムリーだったのは、Twitter API / Cloud Server あたり。
ちょうど勉強し始めたところだったので。
あと発表が面白い。惹き付けるなあ。
Rackspace は、Lithium実行環境として最適かも。
最安$10ちょいですって、奥さん。
インスタンスをオフれたり、保存したイメージをコピーできたら最強だなあ。
Twitter API は、GAEで実行しても面白いと思う。
ということでPython勉強中。
(CakePHPユーザーにこそお勧めできる>python)
起業するとのことです。
ぜひ今後もよろしくお願いしますー。
ライトニングトークス
そしてLTの時間。
もう盛りだくさんの内容。LTじゃなくて通常の発表枠でいける内容ばっかり!
最後に@cakephperさんから恒例のIRC集会の案内があって終了。
ちなみに次回は2010年6月11日(金) 15:00-19:00と後日発表されました。
IRCサーバーが変更になっているので注意が必要です。
初めての方もぜひ。気軽に参加できる素敵な会です。(業務中に参加できる方限定ですがw)
懇親会
私の場合、勉強は2の次で、飲むために行っているようなものです。
#cake_beer というタグもあります。
今回は会場の机といすを片付けて、その場で懇親会開始。
ほとんどの人が参加したのではないでしょうか?
ついにはビールが底をつきました(笑)
懇親会中に@sizuhikoさんのテストについての発表あり。
テスト書いておくことで1.2 -> 1.3 への移行も楽ということが分かった。
横着せずにヘルパーとかもテスト書かねば。カバレッジ低いからなあ。。。
毎度思うのが、CakePHPな人たちと飲むのは楽しい。
CakePHPに限らずいろんな話題が出てきてためにもなる。
徐々にCakePHP飲み会や勉強会後の懇親会でご一緒した人が増えてきて、それもまた嬉しい。
サテライトの人たちとも交流できたらいいなあ。
チャンスは他地域勉強会とPHP MatsuriかCakeFest2010か。
その後、懇親会は終了。(会場を貸していただいたトライコーンさんに感謝!主催者の方々、とくに@kaz_29さんおつかれさまでした!)
ぞろぞろと2次会へ。
2次会ではテーブルごとに分かれて交流。
飲み会や勉強会でお世話になってる@cakephperさんや@yashioさんらと飲む。
(もうひとりのかた、忘れてしまった。ごめんなさいい<twitterやってたら連絡ください)
他テーブル含めて雰囲気(うまく変換できた)が良い。
今年はいろんな勉強会に行ってみよう。
興味の幅を広げねば。
そこで仕入れた話をすれば、みんなハッピーになれるかもだし、いつまでも話を聞いてばかりじゃ申し訳ないし。
まとめ
最近いろいろあって疲れる日々もあったが元気出てきた。
今回交流できた方々、次回お会いしましょう。
交流できなかった方々、次回こそ是非!
Ktai Library 勉強会 #1-2
Ktai Library 勉強会に行ってきました。
といっても、第1回が3月8日(月)で第2回が4月16日(金)でしたので、もうかれこれ1ヶ月近く経とうとしていますが。。。
でも、ちっちゃいことは気にしないで、両日を通して学んだことをまとめつつ、感想などを。(遅ればせながら)
準備編
せっかく作者の@ecworks_masapさんが来るわけですから、できるだけ準備をしておこうというわけで、とりいそぎセットアップを。
CakePHPは1.2を使用しました。
(当日聞いたら1.3でも普通に使えるということで、第2回からは1.3を使用)
Ktai Library は、今後のバージョンアップに備えて、gitで持ってくる。
$ git clone http://github.com/MASA-P/KtaiLibrary.git
(app/vendors/ecw となるように、KtaiLibrary/vendors/ecwをコピーする)
絵文字アイコンが必要なので、それもダウンロード
$ cd app/webroot/img $ wget http://start.typepad.jp/typecast/download/emoticons.zip $ tar xfvz emoticons.zip
Ktai Library で必要なファイルを、app内にコピーします。
以下は、シンボリックリンクで代替。
$ cd app/config $ ln -s /path/to/KtaiLibrary/app/config/ktai_session.php . $ cd ../../app/controllers/components $ ln -s /path/to/KtaiLibrary/app/controllers/components/ktai.php . $ cd ../../../app/views/helpers $ ln -s /path/to/KtaiLibrary/app/views/helpers/ktai.php .
app_controller.php内で、redirect()を上書きするため、KtaiLibrary/app/controllers/ktai_app_controller.phpの内容を、写す。
(ver0.2.2以前の場合で、リバースルーティングに配列を渡している場合は、コレを追加)
すべてのcontroller,viewでktaiコンポーネントとktaiヘルパーを使用する場合はapp_controller内の var $componentsとvar $helpersにKtaiを追加する。
また、以下を環境に合わせて追加
# app/app_controller.php
var $ktai = array(
'use_img_emoji' => true,
'input_encoding' => "UTF-8",
'output_encoding' => "UTF-8",
);
NamedParamsのセパレータを変更
# app/config/routes.php
Router::connectNamed(array(), array('argSeparator' => '~'));
FireMobileSimulator
すでにメインブラウザをGoogle Chromeに完全移行したのですが、いかんせんChromeの拡張機能では、現状ではFireMobileSimulatorのようなものを作れません。
というわけで、ケータイからのアクセスをシミュレートするFireMobileSimulatorをFirefoxにアドオンします。
初めて使ったのですが、超絶便利でした。しかもbetaながら、タブごとに別々のuser_agentに切り替えるバージョンまであり、開発スピードが段違い。素晴らしい!
Hello Ktai Library !
ここまでできたら、Ktai Library の教科書Chapter4のリスト04-04、04-05および04-06を参考に、サンプルページを表示します。
以下、Ktai Library 開発用デモサイトソースより一部改訂して引用
# app/controllers/mypages_controller.php
function index() {}
# app/views/layouts/default.ctp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<?php if($ktai->is_iphone()){ ?><meta name="viewport" content="width=260"><?php } ?>
<title><?php echo $title_for_layout; ?></title>
</head>
<body>
<?php if(!$ktai->is_ktai()){ ?><div style="width: 240px;"><?php } ?>
<?php echo $content_for_layout; ?>
<div align="center">
<hr width="90%" size="1" color="#333333" noshade>
(C)2009 <a href="http://shop.example.com/">MyShop</a>
</div>
<?php if(!$ktai->is_ktai()){ ?></div><?php } ?>
</body>
</html>
# app/views/mypages/index.ctp
<center><?php $ktai->emoji(0xe753); ?>Hello, ktai Library!<?php $ktai->emoji(0xe753); ?></center>
絵文字付きでHello, Ktai Library!と表示されたら準備完了です。
このブログは記憶を頼りにまとめているので、記述をそのままやっても動かない場合もあると思います。
動かない場合はtwitterでお知らせください。
勉強会 #1
じつは、勉強会の1回目は、第4章を実践することがテーマだったので、準備万端で臨むと、もう終わってたりします(笑)
というわけで私は、今後の開発がしやすいように、いろいろとカスタマイズしていくことにしました。
Themeを使って、KtaiからのアクセスとPCからのアクセスで、表示を分ける
CakePHPのTheme機能を使って、Ktaiからのアクセスの場合は、themed/ktai を使用し、PCからのアクセスの場合は、通常のviewを使用するケースです。
まず、Ktaiからのアクセスかどうかを判別して、必要に応じてテーマを使用するようにします。
Ktaiからのアクセスかどうかは、 Ktaiコンポーネント(かKtaiヘルパー)のis_ktai()を使用します。
# 使用例
if ($this->Ktai->is_ktai()) {
debug("Ktaiからのアクセスです");
}
Themeを分ける場合は、beforeRender()あたりがよさそうですので、app_controller.php内のbeforeRender()を変更します。
# app/app_controller.php
function beforeRender() {
if ($this->Ktai->is_ktai()) {
$this->view = "Theme";
$this->theme = "ktai";
}
}
これでThemeの使用ができますので、必要なファイルを作成します。
まずは、必要なディレクトリを作成しましょう。
app/views内に、themed/ktaiディレクトリを作成し、その中に、layoutsやelements、今回の場合はmypagesを作成します。
$ cd app/views $ mkdir -p themed/ktai/layouts $ mkdir -p themed/ktai/elements $ mkdir -p themed/ktai/mypages
そして、レイアウトファイルを移動します。
$ cd app/views $ mv layouts/default.ctp themed/ktai/layouts
ここで、いったん動作確認。
ケータイによるアクセスとPCからのアクセスで、別々のレイアウトファイルが使われていれば成功です。
mypages/index.ctpも忘れずに移動します。
$ cd app/views $ mv mypages/index.ctp themed/ktai/mypages
その他
elementsでヘッダーやフッターを作ったりして、初日終了。
感想など
@yashioさんの呼びかけで始まったKtai Library 勉強会@関東ですが、非常に素敵な会でした。
まず何といっても雰囲気がよい。少人数故なのかどうかは分かりませんが、堅苦しくなくて良かったです。
また、講義を聞くスタイルではなくて、実践形式で進めるというのが、振り返ってみて良かったなと。講義を聞いて、その場で分かったつもりになって、実践しないでほったらかす人種のわたしとしては、手を動かす絶好の機会となりました。
なかにはセットアップに苦労していた方もいましたが、そういったことも含めて、実際にやってみることの大事さを再確認することができました。
最後は、みんなで歓談し、CakePHPやそれ以外のことについて情報交換。
『ゼッタイに第2回も参加しよう』と心に誓った第1回でした。
勉強会 #2
そして、第2回。今回は第5章ということで、非常にボリュームがあります。
しかし、その多くはPCによる管理画面の作成ですので、ケータイで作る部分はさほど多くない。
ひととおり読み込んで準備して、、、と思ったが、タイミング良く入っているケータイサイトのお仕事を進めないと進捗が遅れていることに気づく。
内容的にはフォームの作成で、サンプルと一緒の画面遷移なので、第5章を参考にしつつ作成しました。
teltoリンク
Ktai Library には、便利なmailto()というメソッドがある。これはいわゆるmailtoリンクを、キャリアに合わせて作成してくれるもの。
# 使用例 (for CakePHP 1.3)
// Site.mail はメールアドレスが入っています
// 第3引数で件名を第4引数で本文を指定可能です
$this->Ktai->mailto("メール",Configure::read('Site.mail'),"携帯サイト問合せ");
telto()もあるかなとリファレンスを見たが、なさそうなので急ごしらえした。
function telto($telno = "") {
if (empty($telno)) {
$telno = Configure::read('Site.tel');
}
$telnoWithoutHyphen = str_replace("-","",$telno);
return "<a href=\"tel:{$telnoWithoutHyphen}\">{$telno}</a>";
}
なんでHtmlヘルパー使ってないんだっけか?相対URLになっちゃうんだっけかな?
おかげで$optionsも指定できないからあんまり意味ないかも。
ハイフンを消す必要があるかどうかも不明だけど、確認するの面倒だからまあ良し。
あと対応できない端末があるかもなあ。
その他
主に見栄えのところを調整した。
Ktai Library には、スタイル調整用の機能があります。
# app/app_controller.php
var $ktai = array(
'style' => array(
'h2' => "color:#ffffff;background-color:#0000ff;",
),
);
としておき、viewで
# view on CakePHP1.3
<div style="<?php $this->Ktai->style("h2"); ?>">見出し文字列</div>
のように使います。便利ですね。
自ヘルパー内で拡張して、divでラップしても面白いかもしれませんね。
感想など
外は雨模様。帰りにはみぞれになっていた。4月なのに。
そんな悪天候の中、参加者は全員出席だったそう。それだけ注目のKtai Libraryであり、Ktai Library 勉強会ということでしょう。
帰ってから実機で確認してみると、キャリアによって細かい動作が違ってくるものがあるということも分かった。
携帯サイトはノウハウの集積が不可欠だと思っていたが、それでもその大部分を担ってくれるKtai Libraryを使うかどうかで、開発効率は大きく違ってくるでしょう。
そして。
Ktai Library を使っても、なお、知っておかなくてはならないことが多いのが、携帯サイトの開発だと気づく。
だからこそ、Ktai Library の教科書では、題材に『ショッピングサイト』を選んだのではないだろうか。
幅広い機能が必要となるため、それを実践することで、必要なノウハウも(多数)身についていくのですから。
続きは次回。
では。
さくらインターネットでbakeする前に
自分用にメモです。
さくらインターネットでCakePHPのbake等を利用する前に、bashへのパスを変更する必要があります。
CakePHPのバージョンアップの時に注意が必要です。
#!/usr/local/bin/bash
以上です。
CakePHPのdatetime validation
かゆいところに手が届くCakePHPですが、バリデーションルールにdatetimeがありません。
(私が知らないだけ?)
ということで、オリジナルメソッドとして、作成しました。
現在テスト中なので、完全ではありません。
# model
var $validate = array(
'any_field_name' => array(
'datetime' => array(
'rule' => array('datetime' ,'ymd'),
'message' => '日付の形式が間違っています',
'allowEmpty' => true,
),
),
function datetime($data ,$format) {
$datetime = current($data);
$s = strrpos($datetime ," ");
$date = substr($datetime ,0 ,$s);
$time = substr($datetime ,$s + 1);
$Validation =& Validation::getInstance();
$result = $Validation->date($date ,$format) && $Validation->time($time);
return $result;
}
(ひとりごと1)突っ込み歓迎(twitterで)
(ひとりごと2)app_model.phpにおくと動かないな。。。
CakePHPのバージョンを取得する方法
CakePHPでプラグインを作っていると、現在稼働中のCakePHPのバージョンが1.2なのか1.3なのか知る必要がでてくるかもしれません。
そんなとき、どうやってCakePHPのバージョンを取得するのだろうと思って、IRCで聞いたら、教えてもらいました。
CakePHPのバージョン取得
debug( Configure::version() ); # ex : 1.2.3.8166
Configureクラスを見てみると、どうやら、coreのconfig/config.phpに値がある様子。
で、ソースを見てみると、、、
<?php return $config['Cake.version'] = '1.2.3.8166'; ?>
コメント除くとこれだけでした。