Blog

2011.11.14 / Development

cakephp

CakePHPに関するメモ。

Model

SQLを直接実行する方法

//クエリ
$this->Model->query('SELECT * FROM examples');
//名前付きバインド可能(疑似らしいけど)
$this->Model->query('SELECT * FROM examples WHERE id = :id', array('id'=>1));

CakePHP 任意のSQLを書く – Shin x blog

トランザクション

$dataSource = $this->getDataSource();

$dataSource->begin($this);
// タスクの実行
if(/*全部うまくいったら*/) {
	$dataSource->commit($this);
} else {
	$dataSource->rollback($this);
}
でもこの方法だと個々のModelにトランザクション呼ぶことになって気持ち悪い。Singletonかstaticなほうがいいと思うのだが。

トランザクション :: モデル :: CakePHPによる開発 :: マニュアル :: 1.3コレクション
[CakePHP]トランザクションを使う | Ryuzee.com

HABTM

hasAndBelongsToMany (HABTM) :: 関連: モデルを結びつける :: モデル :: CakePHPによる開発 :: マニュアル :: 1.3コレクション
Cake PHP HABTMのデータをチェックボックスに表示する
“HABTMの保存方法” フォーラム – CakePHP Users in Japan
CakePHPのhasAndBelongsToMany(HABTM)をチェックボックスで関連付ける | webOpixel
Re: 中間テーブルのcreated、modifiedについて – 24時間CakePHP
標準のhabtmではできないらしい。hasmanyとbelongstoに分解するらしい。→できた。あとで書く。
CakePHPのHABTM – tsuge development page
CakePHPでHABTMを使う際の「with」と「joinTable」について – Sticker@Something

Validator

Validation(バリデ-ション) – CakePHPまとめ – livedoor Wiki(ウィキ)
単純ルール :: データのバリデーション(Data Validation) :: CakePHPによる作業の定石 :: マニュアル :: 1.3コレクション

1個のフィールドに複数のValidationルールを定義する

var $validate = array(
    'fieldName' => array(
        //このruleNameは任意でよい
        'ruleName' => array(
            'rule' => 'ruleName',
            // like on, required, 等、他のキーをここに書く...
        ),
        'ruleName2' => array(
            'rule' => 'ruleName2',
            // like on, required, 等、他のキーをここに書く...
        )
    )
);

hasAndBelongsToMany の関連テーブルの条件で絞り込み検索

$this->Photo->bindModel(array( 'hasOne' => array('PhotosTag', 'FilterTag' => array( 'className' => 'Tag', 'foreignKey' => false, 'conditions' => array('FilterTag.id = PhotosTag.tag_id') ) ) ) ); $conditions = array('FilterTag.name' => $keyword); $data = $this->find('all', array('conditions' => $conditions));

ここまで書くなら普通にSQL書く。。。

SQLのNOW()を使って、INSERT時の時間で保存する

$this->data['SomeModel']['your_datetime_field'] = DboSource::expression('NOW()'); $this->Model->save($this->data);

Model::saveAll()でINSERTしたIDを取得する

//Modelにメソッド追加
class AppModel extends Model{

     var $inserted_ids = array();

     function afterSave($created){
          if($created){
               $this->inserted_ids[] = $this->getInsertID();
          }
          return true;
     }
}

//Controllerから呼ぶ
if($this->Post->saveAll($posts)){
     $post_ids=$this->Post->inserted_ids;
}

Get previous insert IDs of saveAll in CakePHP


View

render()とset()の順序

//OK
$this->set(...);
$this->render(...);

//ERROR
$this->render(...);
$this->set(...);

任意の*.ctpの指定

$this->render(view名);

で指定する。
CakePHPで任意のviewファイルをrenderする方法 – 情熱は代行できない。大阪でRSSとiPhoneApp開発のベンチャー社長ログ
CakePHPのコントローラでrender関数を活用する | helog
render :: ビューとの連携 :: コントローラのメソッド :: コントローラ :: CakePHPによる開発 :: マニュアル :: 1.2コレクション

Controller

Paginator

Paginatorの使い方。CakePHP1.2 – CPA-LABテクニカル
CakePHP 1.3 で Paginate を最速で使う方法まとめ | ウェブル
新規投稿を追加 ‹ blog.ikekou.jp — WordPress
CakePHP Paginate Sort の使い方

Controller内からValidationを実行する

コントローラ(Controller)からデータのバリデーションを実行する :: データのバリデーション(Data Validation) :: CakePHPによる作業の定石 :: マニュアル :: 1.3コレクション

$this->ModelName->set( $this->data );
if ($this->ModelName->validates()) {
	// バリデーションが成功した場合のロジックをここに書く
} else {
	// バリデーションが失敗した場合のロジックをここに書く
}

// validationErrors 配列を含むデータを取得する
$errors = $this->ModelName->invalidFields();

SessionHelper

セッション :: 主要なコンポーネント :: マニュアル :: 1.2コレクション
『CakePHP』を使ってみる ~11~ セッションの使い方確認 – ざ・わーるど.jp@はてな

HtmlHelper

error :: Form 要素固有のメソッド :: フォーム :: 主要なヘルパー :: マニュアル :: 1.3コレクション

FormHelper

Modelの指定をしないでForm->createする

//falseを指定。nullとかと間違ってよくハマる。
$this->Form->create(false, $options);

登録前確認画面を作る

基本はSessionで受け渡せばいいのかな。
CakePHP:確認画面: マイペースでね!
CakePHP 入力フォームで確認画面を表示する方法 | Sun Limited Mt.
TransitionComponent for CakePHPで簡単確認画面実装 | Fusic Developers’ Weblog
それ用のコンポーネントがある。
CakePHPを使ったシステム構築(4:確認画面) – 海猫開発記
入力内容の確認画面をはさむ – PukiWiki

設定など

エラー・クエリ非表示

app/config/core.php
define('DEBUG', 1);

を変更する
CakePHPで高速Webアプリ開発:第11回 CakePHPの「DEBUG値」を極める!|gihyo.jp … 技術評論社

.htaccess

CakePHP内の処理を理解する(2/3):CodeZine
mod_rewriteについて :: CakePHPブログチュートリアル :: 開発例 :: マニュアル :: 1.2コレクション
CakePHPでmod_rewriteが有効な環境ではApp.baseUrlをコメントアウトする – 積み重ねた日々

database.php

localhostだとエラーで127.0.0.1だと大丈夫だったりする。謎。

bake

CakePHPを勉強するよ:2、Web2.0ビギナーズバイブルを読みながら – livedoor Blog(ブログ)

流れ

コマンド実行準備(この例ではMacのXAMPPで動かしてる)

export PATH=$PATH:/Applications/XAMPP/xamppfiles/bin
export PATH=$PATH:/Applications/XAMPP/xamppfiles/htdocs/[プロジェクトフォルダ名]/cake/console

を実行して

export

で確認する。でプロジェクトフォルダのルードに移動して

cake bake

でbake起動して、Model作る、Controller作る、View作る、みたいな順番でやるとよい。

小技

定数

パスのdefineは cake/config/paths.php に一覧がある。

リファラ取得

遷移元URLの取得 | 開発備忘録

$this->referer();

引っかかりポイント

リバースプロキシ

リバースプロキシ環境でかろうじて動くところまでは設定できたがFormHelperが出力するリンクがおかしいのが未解決。またその状態で使うとフォームに入力した値が消える。

参考図書

Amazon.co.jp: CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用: 掌田 津耶乃: 本
Amazon.co.jp: CakePHP徹底入門: イージーゲート: 本