Hatena::ブログ(Diary)

bobchinの日記 このページをアンテナに追加 RSSフィード

2009年09月01日(火)

[]CakePHP情報。使えるものもある? 08:12 CakePHPの情報。使えるものもある? - bobchinの日記 を含むブックマーク

http://d.hatena.ne.jp/bobchin/searchdiary?word=*[CakePHP]

CakePHP情報が見れます。

最近ウォッチしていないけど、参照されていることもままあるみたい。

特に、

しかし、未だにトランザクションとかの情報ってないのかなぁ。

2009年01月13日(火)

[][]paginator のカスタマイズ 21:25 paginator のカスタマイズ - bobchinの日記 を含むブックマーク

paginate する対象がテーブルやそのカラムと1対1なら かなり簡単に使えるんだけど、

たとえばソートキーが複数カラムに渡る場合とかになるとちょっとカスタマイズがいる。

コントローラ内で

$this->paginate('Model');

とすると、通常は

Model::find('count');

Model::find('all');

がコールされて paginate する。

※all は通常の場合。controller の default プロパティインデックス0に type 指定するとそれを使用できる。


該当のモデルに「paginateCount」「paginate」メソッドが定義されていると

こちらがコールされる。引数は以下の通り。

Model::paginateCount($conditions, $recursive, $extra);

Model::paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra);

$extra は controller の default プロパティで指定したキーのうち 'conditions', 'fields', 'order', 'limit', 'page', 'recursive' 以外のものが入る。


という感じなので、ソートキーが複数カラムに渡る場合なんかは

Model::paginate() を定義してその中で対処すればいい。


[][]paginator のソート指定 21:40 paginator のソート指定 - bobchinの日記 を含むブックマーク

通常は sort のキーとして指定できるのは対象テーブルのフィールド名のように思われる。

でもいろいろいじってて対象テーブルではなく関連テーブルのフィールド名を使う必要がでてきた。

なんとかならないかと思ってたけど以下で解決。(でもやっていいかどうかはわからない)

sort のキーとして判定されるには以下の2つの条件のどちらかの場合。

  1. 対象モデルでそのモデルエイリアス名をプロパティとするモデルフィールドである場合
  2. 対象モデルフィールドである場合
class SampleController extends AppController {
    public $uses = array('User', 'Blog');
    public $default = array(
        'Blog' => array(
            'extra' => 'hoge',
        ),
    );

    public function paginate()
    {
        $this->Blog->Blog = $this->User;
        $this->paginate('Blog');
    }
}

こうすると通常は Blog モデルフィールド名を sort キーとして使用しなきゃならないけど

User モデルフィールド名が使えるようになるはず。

2009年01月09日(金)

[][]read() するとエラーがクリアされてしまう 14:04 read() するとエラーがクリアされてしまう - bobchinの日記 を含むブックマーク

主キーがあるときって、モデルの read() は便利ですよね?

でも注意が必要かもです。


データ更新の場合次のような構造になることが多いんですが、

public function edit($id = null)
{
    if (!empty($this->data)) {
         $this->Model->save($this->data);
    }

    $this->Model->read(null, $id);
    // $this->Model->find('first', array('conditions'=>array($this->Model->primaryKey=>$id)));
}

この場合に save() 時のバリデートでエラーがあった場合に

エラー内容をビューで表示しよう($form->error())と思ってもうまくいきません。

read() 時に $this->validationErrors = array(); でエラー情報がクリアされてしまうからです。

find() であればうまくいきます。指定が面倒になるんだけど。。。


データ取得系は find() に集約しているからそっち使えってことなのか?

ソースをみると $this->id を元にして取得する感じから set() で設定したデータを元にって場合なのか?

いや、$this->find() の使い方からみると find() 集約以前(V1.1?)の遺物な気がしてきた。。。


なので AppModel にこんなのがあるとちょっと幸せ。

引数の順序はこっちの方がいいと思うんだけど。$id は必須だし。。。

    public function myread($id, $fields = array())
    {
        $conditions = array(
            'conditions' => array($this->primaryKey => $id),
        );
        if (!empty($fields)) {
            $conditions['fields'] = $fields;
        }
        return $this->find('first', $conditions);
    }

DEXDEX 2009/05/12 22:23 今日はまりました。ありがとうございます。
ただ、「id」が重複していると怒られたので、モデル名を指定するようにしました。
$conditions = array(
'conditions' => array($this->alias . '.' . $this->primaryKey => $id),
);