酔っぱらいスクリプターの備忘録。よく消える(意味ねぇ
Posts tagged Yii
携帯表示その1 Yii Framework触るぜ日記(5)
3月 2nd
ナウなヤングは携帯だって!
PCみたいなモン起動させてる間に携帯でいけますから!
ってか俺、携帯サイトばっかり触ってる人ですもんね。
javascriptで遊びたいよ、ママン(><)
そんなワケで携帯対応してみる。
とりいそぎ表示テンプレートを分ける程度の簡易対応です。
最初はCThemeとかCThemeManagerとか触るハメになるかと思ったけどそこまでしなくても大丈夫みたいです。
とはいえこれで正解か微妙ですが…。
やりたい事は、
- viewファイルを携帯なら携帯用のviewファイルを使いたい
- ディレクトリで携帯をわけるのヤダ(面倒)
- docomo_index.phpとかau_index.phpみたくしたい
- 3キャリア共通ならmobile_index.php使う
まぁ、よくあるっぽい感じにしたいんです。
実装はズバリ、application.components.Controllerに関数追加しました。
$breadcrumbsのメンバ変数を追加してるだけのヤツです。
いいよね?componentsに入ってるんだし。
resolveViewFile()をさわらないとファイル名での変更が厳しそうだったのでどうしてもControllerでやる必要があったんです。よ。
でも絵文字対応とかもあるんでちゃんと分離できればベストだなー。
やってるのは、コンストラクタでキャリア判別してファイル読み込み時にキャリアによって各ファイルをチェックする。
そんな流れ。
class Controller extends CController
{
/**
* @var array the breadcrumbs of the current page. The value of this property will
* be assigned to {@link CBreadcrumbs::links}. Please refer to {@link CBreadcrumbs::links}
* for more details on how to specify this property.
*/
public $breadcrumbs=array();
//以下、携帯対応
const FLG_MOBILE_DOCOMO = 'docomo';
const FLG_MOBILE_AU = 'au';
const FLG_MOBILE_SOFTBANK = 'softbank';
private $carrier = NULL;
public function __construct( $id, $module=null )
{
//キャリア判定
//面倒なんで未実装。
//pearのNet_UserAgent_Mobileとか使えばいいと思うよ。
$this->carrier = 'au';
//CControllerのコンストラクタ呼んであげる。
parent::__construct( $id, $module );
}
public function getCarrier()
{
return $this->carrier;
}
public function isMobile()
{
if( $this->carrier ){ return(true); }
else{ return(false); }
}
//携帯用viewファイル対応
public function resolveViewFile($viewName,$viewPath,$basePath)
{
$filename = parent::resolveViewFile($viewName,$viewPath,$basePath);
if( $this->isMobile() ){
$viewPath = dirname($filename).DIRECTORY_SEPARATOR;
$viewName = basename($filename);
switch( $this->getCarrier() )
{
case self::FLG_MOBILE_DOCOMO:
$tmpName = $viewPath.'docomo_'.$viewName;
break;
case self::FLG_MOBILE_AU:
$tmpName = $viewPath.'au_'.$viewName;
break;
case self::FLG_MOBILE_SOFTBANK:
$tmpName = $viewPath.'softbank_'.$viewName;
break;
}
if( is_file($tmpName) ){ return($tmpName); }
if( is_file($viewPath.'mobile_'.$viewName) ){ return($viewPath.'mobile_'.$viewName); }
}
return $filename;
}
}
キャリア判定つける前に力つきました。
もぅ帰る。
キャリア判定の他に絵文字の対応とかもいると思うけど、、
それはまた今度!
behaviorためしてみた Yii Framework触るぜ日記(4)
2月 26th
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使えてのはナシな(・∀・)なんとなく!
小話 Yii Framework触るぜ日記(3)
2月 21st
ログイン処理に使う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)
2月 20th
使うよね。
バリデーター。
備忘録しとかないと忘れる(><)
使い方
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)
2月 12th
Yii PHP framework
なんか軽量らしい。
CakePHPもメジャー過ぎてなんか熱覚めたんで他のフレームワーク使いたくて探してみた。
「rhacoいいよ」的なアドバイスもあったけど何かアレじゃん?って事で。
インストールの時に/requirements/にアクセスしてYii要求チェッカで2つ程「注意」が出た。
これって「不合格」と違うから放置しててもいいのかな?
対応する機能つかわなけりゃいいだけかな?
まぁ、結局全部「合格」にしちゃったんで詳細は不明。
あと、知らんかったけど5.1位からタイムゾーン指定しないとダメだったんだね。
date.timezone = Asia/Tokyo
php.iniにコレ設定しないとエラー画面ですた。
とりあえず、Yii触るぜ日記スタートする(・∀・)
