ラベル cakephp の投稿を表示しています。 すべての投稿を表示
ラベル cakephp の投稿を表示しています。 すべての投稿を表示

2008年8月22日金曜日

cakephp.vimについて、CakePHPの中の人からメールが来た!!

codecheck.inのIRCにも来てくれて衝撃が走りました。
cakephp.vimはこれから進化していく予感です。
もちろん僕もお手伝いする予定。

ただ、英語力の無さを痛感しまくったので、これからマジで勉強しようと思います。
通訳してくれたみんな++

2008年6月6日金曜日

CakePHPのMVC間を動き回れるcakephp.vimを作ってみた

CakePHPのMVC間を動き回れるcakephp.vimを作ってみた。

http://trac.codecheck.in/share/browser/dotfiles/vim/cohtan/.vim/plugin/cakephp.vim

設計とかくそです。とりあえず、:help usr_41みながらまずは動くものをとこさえてみました。
appの中でvim . とかしないといけないくらいしょぼい(カレントディレクトリがapp内限定)ですが、


  • :CakecontrollerでModelやViewから該当のControllerへ移動。Viewからの場合は該当functionの先頭行へ飛ぶ

  • :CakemodelでControllerやViewから該当Modelへ移動

  • :CakeviewでControllerから該当Viewへ移動



とか、そんな感じです。
一人でコツコツCake使って書いているとMVC間をむっちゃ横断するので、少しでも手軽に横断出来ないものか。
と常々思っていました。

rails.vimにはまだまだ到底及びませんが、MVC間の移動が楽になっただけでも便利っぽいです。

ちなみにこれのEmacsバージョンをk1LoW氏が作っています

2008年3月2日日曜日

Cakephp1.2 特定のモデルのPaginate SQLをカスタマイズする

CakePHP1.2になって超絶便利になったController::paginate。
$this->paginate = array('limit' => 10, 'page' => 1);
$this->paginate(MODEL_NAME, Mixed);


こんな一行で勝手に10データ分ずつページネーションやってくれる優れもの。
大変便利な機能なんですけど、一つ欠点があります。

例えば、

IDuser_idlogin_date
112008-02-29
212008-03-01
322008-02-29
432008-02-29


こんな「logs」なんつーテーブルがあったとします。
ここで、user_idごとにlogin回数を集計したいとなった場合、GROUP BY 句を使う必要があります。
そのときにController::paginateメソッドではうまくページネーションすることができなくなってしまうというわけです。
うーむ、ここばっかりは自前でページネーション作るしかないかぁ。がっくし、と少し肩を落としながら該当部分のソースをごろごろ眺めていると、

cake/libs/controller/controller.php : LINE 957
if (method_exists($object, 'paginateCount')) {
$count = $object->paginateCount($conditions, $recursive);
} else {
$count = $object->findCount($conditions, $recursive);
}
$pageCount = intval(ceil($count / $limit));

となってました。
どうやらモデル内にpaginateCountというメソッドを用意してあげて、そいつが適切なカウント数を返してあげればGROUP BY句が入っていようが、きちんとページネーションしてくれるというわけでした!

モデル名はLogということにして試しに書いてみるとこんな感じ。
app/model/log.php
class LogModel extends AppModel {
var $name = "Log";
function paginateCount($conditions, $recursive) {
$result = $this->query('SELECT Log.user_id FROM logs as Log WHERE ' . $conditions[1]);
return count($result);
}
}

今回の検証ではconditionsは配列になっていて、[1]にController::paginateに渡したWHERE句が入っていました。
この辺はもうちょっと調べなきゃです。

と、このメソッドをモデルに突っ込んでおくだけで集計後の値でカウントしたいようなテーブルにおいてもpaginateが使用できます。なかなか素敵ですね。

ただ、
return count($result);

がなんかかっこわるいですw

SELECT COUNT ( SELECT Log.user_id FROM logs as Log WHERE HOGE GROUP BY Log.user_id );

とかいけそうな気がしたけど駄目でしたorz
あれー、こういう書き方ってダメなんだっけ。。

2008年2月13日水曜日

CakePHP 1.1.19.6305ではアンダースコアのついたテーブルのScaffoldingがおかしい

Can't scaffold a table named line_items in cake_1.1.19.6305
I had the same problem for baking
I check the problem, it seems like cakePHP doesn't like underscored
table name anymore

これで2時間くらい無駄にした気がする。

久しぶりにブログを書く

最初ログインできなくて焦った。 いや、ログインはできたのだが、ログイン後に自分のブログの管理画面に遷移できず、新しいブログを作成する画面になってしまったからビビッてしまった。 どうやら、Google+(現在はサービス終了)に紐づいたプロフィールを設定しているとこのような状況に陥る...