2011/11/30

[CakePHP] 子・孫まで。複数の入れ子になったモデルを連結して取得したい

cakePHPでデータを取得する際にhasManyなどの子のモデルに、更に孫のモデルをくっつけて取得したくなった。

・モデルで指定する場合
$recursive = 2; //これで2階層目まで取得する

・コントローラで指定する場合
$this->Model->find('first', array('recursive' => 2);
両方とも、数字を変更すれば取得しにいく階層の深さが変わる

参考:
CakePHPで3つ以上の複数テーブルを結合

[iPhone] タッチイベントとクリックイベント

iPhoneではタッチイベント→クリックイベントの順に処理されるみたい。

スマートフォン向けサイトで「ページ上部に戻る」ボタンを置いた。
クリックイベントだとAndroidでもっさりな動作に感じるので、touchendイベントで反応するようにした。

touchendイベント
↓
ページ上部にスクロール
↓
clickイベント
↓
スクロールしてるから、クリックした場所にはすでに別のモノが…
↓
その別のモノをクリック!

って感じになった。

なので今回はクリックイベントのみ処理するように変更した。

タッチエンドイベントをクリックイベントがわりにするとこまごまと引っかかる。
まあ、対処できないようなことではないのでいいんだけど…。

[CakePHP] 404ページを表示したい

CakePHPで404ページを出したい時は…

/app/view/errosディレクトリにerror404.ctpファイルを設置する。

だけ。


レイアウトを変更したい場合なんかは、app直下にerror.phpというファイルを作って、その中で色々と処理をすればいいらしい

コントローラー側では
$this->cakeError('error404');
と書く。

参考:
CakePHPで404エラー画面を作る

cakeのバージョンは1.3です

2011/11/28

ログを残すなら正常時でもログを残そう

バカみたいな話なんだけど…。

cronで毎日、データベース内で不要になったレコードを削除する処理をしていた。
処理が正常に動いているのは確認できていたので、レコードの不具合など、予想外のエラー時のみログを残すようにしていた。
それだと正常に削除されていた場合は記録が残さない。
なので、あるレコードが削除された日時を知りたいという話になって困った。

なぜ正常時のログを残さなかったのが、自分でも思い出せないんだけど…。
もしかして、ログのファイルがでかくなるのが嫌だとかそんな理由だったのかも。

一応何度も同じミスをする自分宛にメモ

2011/11/25

[JavaScript] スクロールの終了時にイベントを起動する

JavaScriptでスクロールが終わった時に、なにか処理をしたい時がある。
要はスクロールするとついてくるメニューの処理みたいな感じ
ああいうのはスクロール中もついてくるけど、今回のは終わるまで何もしない。

スマートフォン向けにブラウザの下部に出てくるバナーなんかで、スクロールすると消えて、スクロールが止まると表示されるやつ、あんな感じ。
var timeId;

window.addEventListener("scroll", function(){

 //解除
 clearTimeout(timeId);

 //時間をリセットしてセットし直す
 timeId = setTimeout(function(){
  //処理
 }, 500);
});

//最初に一回動かす
timeId = setTimeout(function(){
 //処理
}, 0);

iPhoneからのメールをデコードするとタイトルが文字化けする

メールで投稿できるブログシステムみたいなやつで文字化けすることがあるというので対応した。

文字化けするのはiPhoneからのメール
受信したメールを分解して処理しているのはPEARのMail_mimeDecode

調べてみるとiPhoneで送られるメールのタイトルと本文で文字コードが違うことが原因だった
Mail_mimeDecodeだとタイトルの文字コードは本文と同じものとして処理しているのかも。

結局Mail_mimeDecodeではなくZend_Mail_Partを使うことにした

参考:
iPhoneから送ったメールが文字化けする問題について

2011/11/24

高速化のためだけにアプリケーションキャッシュを使ってもいいのかな?

HTML5の新機能で、Webアプリケーションをオフラインでも使えるようにするための機能としてアプリケーションキャッシュってのがある。

必要なファイルをブラウザ側でキャッシュさせて、インターネットでファイルを読み込むんじゃなくて、キャッシュさせたファイルを利用する。

スマートフォン向けのサイトを作っていて、オフラインで使ってもらうことは考えてないんだけど、アイコン画像とかJavaScript、Cssファイルなんかもキャッシュさせとくと、ものすごく高速化できる。
通常の電話回線でもwifi以上の体感スピード。

でも、この高速のためにファイルをキャッシュさせるってのは、もともとのオフラインでアプリケーションを利用できるようにするための機能ってのとは全然違う使い方なんだけど…

いいのか?
うーん…わからん


参考:
[HTML5] アプリケーションキャッシュの使い方