tableのprefixを動的に変更する。このエントリをはてなブックマークに追加
10 月 21, 2008

mysqlのmergeテーブルが使いたくて、半動的にsaveするときは、mergeしていないテーブルを読んで、findのときはmergeテーブル読むようにできなきかなーなんて思ってたんだけども、なんとかできた。

app_model.phpで、たとえばこんな感じ。

<?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

<?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のフォームから送られてくること前提で。

<?php
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。

<?php
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として返ってくるから、エラーのままースルーする。
から、ここにこんな感じで追加する。

<?php
    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ネタも増やしていきたいね。うん。

Pages: Prev 1 2 3 4 5