・前回までのあらすじ
大分前に書籍を買って勉強しようとしたけど、最初に書いてるbakeで何でコンソール使わにゃならんのだ的な気分になって投げだしてたのだけど、そーゆー話しを最近cake使ってる人にしたら「bakeとか使わなければいい」と言われて最もだと思ったので書籍は流し読みだけしてcakeのマニュアルみながらやってみる事にしたのでした。
前回って何だろう。
最近弄ってるbotで情報を管理する必要性が出てきたのだけど、コマンドで返すだけではどうにも味気ない感じになる。
そこで、せっかくなので表示するページを作ろうという事でcake phpを使いはじめたのでした。
後個人的にhtmlに<?phpって書くのが嫌いなので、smartyと連携させて使う事にした。
(この時は、その安易な決断が多大な労力を産むとは思ってもいなかったのです、、、
最初の問題はcake推奨のテーブル構造にしてなかったので、関連付けするのに四苦八苦したくらい。
modelに個別で設定する事で対処したけど、けっこうめんどう臭いねー。
後ページ作り始めて一番最初にイラッとしたのが、flagで持ってるデータを変換して出す手段が用意されていなかった点。
完全に正規化して、そのフラグを文字列にする為だけのテーブルを用意すべきなのかと悩んだ。
最終的にapp_modelのfindafterに処理を追加して、各Modelのプロパティに
var $replace_rule = array(
'type' => Array( 1 => 'トーナメント', 2 => '紅白' ),
'status' => Array( 0 => 'エントリー', 1 => '開催中', 2 => '終了', 3 => '中止' )
);
こーゆーのやら
var $replace_rule = array(
'rank' => '\tyobot\tyobot_dani::convertRankString'
);
こーゆーの書けば変換してくれるようにしてみた。
次に段位戦のエントリーを表示する機能を実装する為に検索機能を付けようとした。
最終的にcakephpを窓から投げ捨てようかと思った。
検索結果のページングする機能は用意されてるのに、そのpage以外のパラメータがデフォルト渡されないのにビックリした。
そもそも検索条件絡みとかは全部コントロールに手書きなサンプルばっかりだし。
cakephpには登録回りに便利なバリデータとかの処理が簡単に追加できて、良さげだなーと思ってたんだけど、そもそも今回はデータは既にあるのでその辺の便利機能は使えない。
かわりというわけじゃないけどサーチとか全部簡単に書ける感じになってるだろうからそこ使おうと思っていたので拍子抜けした。
という事で再びapp_mode.phpを修正して
var $search_rule = array(
'ps3id',
'characters' => array( '==' => 'character_code' ),
'rank' => array( 'b' => 'rank' ),
'pt' => array( 'b' => 'pt'),
);
みたいなプロパティをModelに追加して、特定のModelのメソッドをコントローラーから呼出せば自動で検索してページングとかもよしなに取り計らってくれるようなメソッドやらを作った。
(keyが引数、検索カラムが省略されるとキー名=カラム名として処理する。
キーワード検索だと以下みたいにしたり(複数文字のand検索、及び-のついてる項に関してはnand検索になるようなもの)
'keyword' => array( 'k' => Array( 'ps3id', 'character_code','rank' ) ),
また最初の例にある'b'はビトウィーン検索で2つの引数rankとrank2で範囲検索をする。
片方しか入っていない場合はそれぞれ大なり、小なり検索となる。
また例では完全一致(==)しか使ってないけど、部分一致、前方・後方一致、不一致検索等も使える。
後ここで必要無かったからまだ実装してないけど、多段に関連のあるテーブルの検索とか、日付の範囲検索を6引数から行なうのとかも実装したい所。
cakephp使って2~3日の段階でやるような部分じゃないと思うんだけど、それでも毎回それ用のコード書かないといけないような構造だと使う気にならないので最初に実装した。
cakephpを日常的な開発環境として使ってる人達も、そーゆーの独自実装で持ってたりするんだろうか。
それともクエリ(Conditions)を毎回書くのが普通なんだろうか。
ってか色々言いたい事やらがありすぎるんだけど、そもそも設計思想の違いなんだろうかな。
まぁapp_系の所を改造すれば何でも機能追加できそうなので、自分好みのcakephpをコツコツ形作っていってみるかなー。
それまでに飽きなければいいけども、、、
今悩んでいる所。
paginateを利用する場合のlinkにパラメータを持たせる際、view側で$paginator->optionsメソッドを使って設定するという点。
何故viewの方でこんな事をせにゃならんのか。
ググったら皆setでoptionsに渡したいデータをviewに渡した上でviewでメソッドにその変数渡すとかしてる。
コントローラーの方で設定出来れば無駄なコード減ると思うんだが、helperへのcontrollerからの繋りを作らない為なんだろうか。
そもそもgetパラメータで検索パラメータを渡す構造はURLが長くなりすぎるのでセッションとかに記憶させろやって感じなんかねぇ。
個人的にはgetパラメータで検索結果を静的リンクで出せると、リンク貼ったりしやすくて好きなんだけども。
内部的にそこまで自動でよしなに取り計らうようにサポートしてほしいんだけどなー。
controllerのpaginateの設定段階で設定する方法があるんじゃないかと淡い希望を抱いて調べてみてるけど、まだよく分からない。
マニュアルに乘ってない項目が多くて出来る気がしても、出来るのか出来ないのかも判然としない。
とりあえずマニュアルは飾りなのでリファレンスみろって感じならいいんだけど、リファレンスらしいリファレンスもコレしかない。
CakePHP: the rapid development php framework: Api : Home
皆ここ見て実装してんだろうか、、、
とりあえずココの情報も断片的だけど、リポジトリ上の実装ソースの当該行へのリンクがあるから最終的にはソース読むようにしてる。
うーん。
ソース読んで書くFWってどうなの。
そんだけ労力かかるんなら自前でフレームワーク作った方が早くね?(汗
俺なんてマニュアルとか他社がFW使って構築したサイト(そん時はsymphony)のソースちら見した段階でMVCモデル採用のフレームワークは窓から投げ捨てました・・・
ちょっと間違えた。
シンフォニーじゃなくてethnaでした。。。
早いかどうかは規模次第っすかねぇ。
会社でFW作ってるから、結局それが自分の理想系にほぼ近いものになってしまって自分で作るにしても車輪の再開発な感じになってモチベーションが保てない、、、