tableのprefixを動的に変更する。
10 月 21, 2008
mysqlのmergeテーブルが使いたくて、半動的にsaveするときは、mergeしていないテーブルを読んで、findのときはmergeテーブル読むようにできなきかなーなんて思ってたんだけども、なんとかできた。
app_model.phpで、たとえばこんな感じ。
class AppModel extends Model { function save($tablePrefix, $data = null, $validate = true, $fieldList = array()) { $this->tablePrefix = $tablePrefix; $result = parent::save($data, $validate, $fieldList); return $result; } }
手元に環境がないので、未確認ですが、save関数にひとつ引数加えて、保存するときにtableのPrefixを指定するという方法です。
まーあまり格好よくはないけど、なんかで使えるんじゃないかなぁ。とか思ったり。
手元の環境ができ次第、mergeテーブルと合わせた方法を紹介したいと思います。
cakephpのmodelのminLength,maxLengthが微妙。
10 月 17, 2008
ちょっとだけ。
今日、modelのvalidation使って、minLengthとmaxLengthを使おうとしたのだが、挙動が微妙。
ソースを見てたらこんな感じ。
CAKE_PATH/libs/validation.php
function minLength($check, $min) { $length = strlen($check); return ($length >= $min); } function maxLength($check, $max) { $length = strlen($check); return ($length <= $max); }
なるほどな。stlenか。そりゃおかしいわけだ。海外ってマルチバイト対応しなくていいのかなーというかどの環境でも動くようにという配慮かな。
とりあえず回避策として・・・validation.phpにマルチバイト対応の関数を追加。SJISのフォームから送られてくること前提で。
function mbminLength($check, $min) { $check = mb_convert_kana($check, "KVA", "SJIS-win"); $length = mb_strwidth($check); return ($length > $min); }
ついでにreturn部分の「>=」から「>」に変更した。
そっちのほうが都合がよさそうだったので。
あとはmodelのvalidationで rule=>”mbminLength”と指定すればOK.
動作保障はないよ!
iKnow API KICK OFF!!
10 月 15, 2008
ぼくの大好きなiKnowでiKnowのAPIを使ったプログラミングコンテストが行われるようです!!!
概要
http://www.iknow.co.jp/landing/api
賞金はいらないけど、なんか作ってみようかなー
ちょっと考えたネタはあるんだけど、形にできるかどうかーってところ。
Missing database Connection
10 月 14, 2008
今日cakeで、DBに接続できなかったときのエラー処理がしたくて四苦八苦していたときのメモ。
なんか「これバグじゃね?」的な感じ。
config/database.phpで適当なホスト名を入れるとエラーで終了するんだけど、app_model.phpで受け取れないかなーなんて思ってたんだけど、そういうレベルじゃないみたい。
問題は、cakeの本体/libs/model/model.php L.2509あたりのsetDataSource。
function setDataSource($dataSource = null) { $oldConfig = $this->useDbConfig; if ($dataSource != null) { $this->useDbConfig = $dataSource; } $db =& ConnectionManager::getDataSource($this->useDbConfig); if (!empty($oldConfig) && isset($db->config['prefix'])) { $oldDb =& ConnectionManager::getDataSource($oldConfig); if (!isset($this->tablePrefix) || (!isset($oldDb->config['prefix']) || $this->tablePrefix == $oldDb->config['prefix'])) { $this->tablePrefix = $db->config['prefix']; } } elseif (isset($db->config['prefix'])) { $this->tablePrefix = $db->config['prefix']; } if (empty($db) || $db == null || !is_object($db)) { return $this->cakeError('missingConnection', array(array('className' => $this->alias))); } }
一見なんともなさそうなんだけど、このプログラム今日見たところだと、cakeErrorの部分通らない。
$dbの値はMysqlのDriverがobjectとして返ってくるから、エラーのままースルーする。
から、ここにこんな感じで追加する。
if (empty($db) || $db == null || !is_object($db) || empty($db->connection)) { return $this->cakeError('missingConnection', array(array('className' => $this->alias))); }
最後の、emptyのところね。
成功したときと、しないときでそこの値しか変わりないみたい。
まぁ本体修正するのはどうかと思うけど、これで適当な名前のホスト名でつなげば、「Missing Database Connection」のエラー画面が出るはず。
しかし!このエラー画面罠があります。
こういうエラーメッセージが出ると思う。
If you want to customize this error message, create ****/views/errors/<strong>missing_database.ctp</strong>
これうそだから!マジだから!いくら作っても読み込まないから!
正解はmissing_connection.ctp。
もう本体のエラーメッセージが間違えてるから・・・んもう。まいったぜ。
新しくはじめます。
10 月 11, 2008
ドメインとったついでに、WordPressでブログもはじめてみる。
普通のネタとかはmixiやらなんでも書けるので技術まわりについていろいろ書いていくつもり。
Cakeネタも増やしていきたいね。うん。