Archive for 2月, 2010

behaviorためしてみた Yii Framework触るぜ日記(4)

CSS NITE in KANSAI, LP1 プレセッション第二弾に間に合わなかった。
悔しいからいっそブログでも更新する。

今回は…behavior。
modelにbehaviorsメソッド作って配列で返したらいい。

	public function behaviors()
	{
		return array(
			'application.components.shimi.shimiSoftDelete'
		);
	}

そしてshimiSoftDelete.phpを用意してshimiSoftDeleteクラスを作る。

class shimiSoftDelete extends CActiveRecordBehavior
{
	private $delete_colum		= 'status';	//int型のフィールド
	private $delete_date_colum	= 'update_time';	//tiemstampかdatetimeか何か。

	public function beforeDelete( $event )
	{
		$this->getOwner()->{$this->delete_colum}	= 0;
		$this->getOwner()->{$this->delete_colum}	= new CDbExpression('NOW()');

		//保存する感じで。
		$this->getOwner()->update();

		//falseを返して物理削除を実行させない。
		//強制モードとかつけるならココでtrue返せば普通に削除してくれる。
		//ただしtrueを返さないとatferDeleteが動かないので注意。

		$event->isValid = false;
	}
	public function beforeFind( $event )
	{
		$this->getOwner()->getDbCriteria()->mergeWith( array('condition'=>$this->delete_colum.'=1') );
	}
}

まぁ、見てわかるようにbeforeDeleteとかbeforeFindの前処理を追加します。
その他にもafterDeleteとか各アクションの前後にあるんで好きなの使えばいいよ。

感想。
基本的にソフトデリート(倫理削除)じゃないと仕事で使えないじゃないですか?
で、今回はcrudで作ったmodelのdeleteアクションをソフトデリートにするbehaviorを用意してみたワケです。
もちろん、イチイチclass作らないでmodelにbeforeFindメソッドとか書いてもいいよ。

ちなみに、イチイチbeforeFindより簡単(?)にしたければScope使うのがいいと思うよ。
Scopeについては詳しくは公式みればOKです。

そんな感じで。
明日のCSS NITE in KANSAI, LP1はちゃんと間に合おうと誓った次第であります。

追記:忘れた頃に。
現在のYii PHP framework 1.1.1ではbeforeFind()が正常に動かないのでアレです。
あと、dataprovidorのpagerで利用される総数を取得するcount()でも適用されないです。
これは1.1.0でも同様です。
※だから総数が削除済みも含めた数になっちゃう。

そんな感じなのでsoftDeleteを実装する際には
[1] Yii 1.1.0を使うか、1.1.1のquery()を修正(applyScopesとbeforeFind順番を変える)する。
[2] dataprovidorを使う際にはcount()も修正する(applyScopesの前にbeforeFind()追加)。

defaultScope使えてのはナシな(・∀・)なんとなく!

日本人の知らない日本語

面白かったので紹介。

外国人の方達に日本語教えてる人の本です。
字のみのページも多々あるけど、基本マンガです。

こーゆーカルチャーギャップ的なの好きです!!

あと、確か『「お召し上がりください」は二重敬語で間違いた!』ってあったけど
文化審議会答申の「敬語の指針」によれば習慣として定着している言い方って事でOKっぽいです。
上の指針とかも見てると面白い(?)ですよ。
「お読みになる」「お読みになっておられる」はOKで「お読みになられる」アウト!
「伺っていただく」 -> 相手かコッチかどっちを立てとんねん!
とかも「へ~」ってなった。

しっかし、メールの時とかに「とりあえず”お・ご”つけたり”お願い致します”って書いとけばいいや!」ってやってたけどアレですね(><)
反省した。
プログラムだけでなく日本語も勉強しようと思いました(・∀・)まる!

何か罠ってか愚痴

まいった。
wordpressがおかしくなった。。
管理画面は「get_optionなんて関数ねぇよ!」って怒られて
通常ページは2,3回に1回見れたり「wp()なんてねぇよ!」って怒られたり。

なんだよ、見れたり見れなかったりって!?

最初は、require_onceが動いてないのかと思ったけど途中までは読み込んでる。
※ver_dump(__FILE__);exit;しながら追った
wp-config.phpが読まれないっぽい。
仕方ないから別ディレクトリにWordPress入れ直してwp-config.php設定して再挑戦。

 あうとーーーーー!!!

症状変わらず。
ファイルが壊れてたワケでもないっぽい。

何これ????

最終的にyumでphp関連を全てremoveしてphp 5.2.11を入れ直したら治った。
解決法も原因究明もオチもない、タダの愚痴でした。

小話 Yii Framework触るぜ日記(3)

ログイン処理に使うUserIdentity

ちゃんと見てないけど、ログインに使うUserIdentityはオブジェクトでセッションに保持されてるっぽい。
公式チュートリアルのをコピペしてたんですが、getId()をオーバーライドし忘れてたのに途中で気付いて関数を追加したのにいつまでたってもusernameを返して来る。
一度、ログアウトしてログインし直したらgetId()がオーバーライドした関数の挙動になりましたよ。

URIとか

あとパーマリンクというかURI関連はコチラに書いてるのが一番綺麗だと思った。
index.phpもなくなるから。

あとviewでリンクやるときは

echo CHtml::link('リンクだよ',array('member/index'))

こんな感じっぽい。
第二引数を配列の形式にすればcontrollerも変更。

配列じゃなかったら現在のcontrollerを維持。
他にオプション入れたかったら第三引数に配列用意するよろし。
CHtml::Link
CHTML::normalizeUrl

ログインチェック

ログイン済みかどーかの判定は

Yii::app()->user->isGuest

そんな感じっぽい。うん。

久しぶりにプログラムっぽい。
代理店とかユーザーの相手してるより楽しく感じる。
でもそろそろ帰って寝る(・д・)ノ

Validatorのお話 Yii Framework触るぜ日記(2)

使うよね。
バリデーター。

備忘録しとかないと忘れる(><)

使い方
modelのrulesの配列に突っこむ。
一つの要素に対してvalidatorを指定するんじゃなくて
「コレとコレとコレにこのバリデーションかける」
って感じで対象をカンマ区切りで指定する。

 array('name, email', 'required'),

一個目の引数が対象。
二個目がバリデーター。
あれば三つ目以降にオプションを指定する感じ。
何か新鮮。

二個目のバリデーターにどんな指定があるかってゆーと

http://www.yiiframework.com/doc/api/CValidator

ココみれ。

三個目のオプションはそれぞれのC○○Validatorの説明見れば書いてる。

 array('login_password', 'match', '/^[a-zA-Z0-9]$/','message'=>'半角英数字にしれ!'),

ってやってエラーメッセージも変えれるよ。

エラーメッセージ
‘language’=>’ja’を/app/config/main.phpの配列に設定したらエラー文言も日本語になる。
ちょっと気持ち悪い文言だったら(例:{attribute} は空白ではいけません。)変えちゃおう。
/yii/framework/messages/ja/yii.phpを好きにしちゃって下さい。
好きにしていいはず。

独自のバリーデーター
/app/extentions/に入れてrulesでapplication.extentions.hogeって指定すればOK.
例)
rulesに

array('name', 'application.extensions.shimiValidator'),

とシナリオをセットする。
/app/protected/extensions/shimiValidator.phpをおく。
shimiValidator.phpの中身は

<?php

class shimiValidator extends CValidator
{
	protected function validateAttribute($object,$attribute)
	{
		$value=$object->$attribute;
		if( $this->isEmpty($value) ){
			if( $this->allowEmpty ){
				return;
			}
		}
		if( ! preg_match("/shimizu/",$value) ){
			$message=$this->message!==null?$this->message:Yii::t('yii','{attribute} が[shimizu]じゃねぇ!!.');
			$this->addError($object,$attribute,$message);
		}
	}
}

こんな感じで。
メンバ関数validateAttribute($obj,$attr){}が必須なんでね。

そんな感じー。
これで安心かな(・д・)

Yii PHP framework触るぜ日記(1)

Yii PHP framework
なんか軽量らしい。
CakePHPもメジャー過ぎてなんか熱覚めたんで他のフレームワーク使いたくて探してみた。

「rhacoいいよ」的なアドバイスもあったけど何かアレじゃん?って事で。

Yii 素の画面

インストールの時に/requirements/にアクセスしてYii要求チェッカで2つ程「注意」が出た。
これって「不合格」と違うから放置しててもいいのかな?
対応する機能つかわなけりゃいいだけかな?
まぁ、結局全部「合格」にしちゃったんで詳細は不明。

あと、知らんかったけど5.1位からタイムゾーン指定しないとダメだったんだね。

date.timezone = Asia/Tokyo

php.iniにコレ設定しないとエラー画面ですた。

とりあえず、Yii触るぜ日記スタートする(・∀・)