Yii Framework
PHPのフレームワーク。
下のサイトで色々勉強になりますよ。
・公式
・ふわふわな毎日
・MegaBlackLabel’s Log
・MT Systems
見つけ次第に足していきます(・∀・)
Yiiを紹介とかしてるスライドの紹介 | Yii Framework触るぜ日記(13.5)
4月 26th
なんとなく、yii を紹介してるスライドをいくつかまとめてみる。
スライドでの紹介とか見ると「へぇ~。やってみよっかな」ってなるよね。
なるよね?
Yii Introduction
英語ですが。
ソースコードが少し多めなんで理解を深めるのにどうぞ。
XOOPSのモジュールをYiiで開発
すげぇw
ってか日本語のスライド3つしか見つけられなかった(´・ω・`)
増えてったら逐次たす!多分。
guiのcrudツール”gii” | Yii Framework触るぜ日記(13)
4月 24th
giiはyiiのスキャフォールディングをweb画面上で行おうというもの。
イチイチ、sshで入ってゴニョゴニョしなくてもいい!
各フォームでフィールドにフォーカスするとそれに応じた説明も表示されるし、phpMyAdminでテーブルさわってmodel作り直しなどもweb上からだと気軽に出来ますよね!
ただこのgii、実はまだ正式実装はされていません。
Yii PHP framework 1.1.2からの実装予定らしいです。
今使うにはsvnで最新のtrunkをcheckoutしないとダメです。
えぇ、ガッツリ人柱ですね。
素直に1.1.2をワクテカしておきましょう(・∀・)
あと誰か日本語に翻訳してくれるとハッピーですよね。
エキサイト翻訳との往復は疲れる…
Widget試してみる Yii Framework触るぜ日記(12)
4月 18th
widgetって、何て読むのが正解なんでしょうね?
ゥィジェット?ガジェット?
そういえば、widthはウィドゥスでheightはハイト(ヘイト)・・・ですよね?
さらにさらにaタグのhrefはエイチレフでimgのsrcはエスアールシー。です・・・よね?
さて、今回はwidgetを試してみるテストです。
よくあるviewの共通部分を管理しようというものですよね。
正直、公式サイトにある日本語のポートレットについてのページがエラーになっててよくわかんないですけど。
とりいそぎ書き留めます。
エクステンション使ってみた Yii Framework触るぜ日記(11)
4月 3rd
Yiiにだって便利なエクステンションはあるんだい!
ってコトでいくつか使ってみました。
yii-userエクステンション
これは前に書いたや。
終わり。
ktaiエクステンション
ktai
微妙に使ってます。
というのも、自分で書いた携帯用viewファイル読み込み使いたかったし、SoftBankでのUTF8化に対応してなかったので。。
※SoftBank機だと書き込みフォームをUTF8にしないと絵文字送ってくれない機種などあります。
とか書いたけど携帯用サイトを構築するのに便利な機能が一通り揃ってますよ!
docomo向けにcssをインライン化してくれたり、絵文字に対応、携帯用viewファイルなど。
ただ、一個バグがあって連続した絵文字の表示が出来なかったです。
とはいえ一箇所修正するだけっぽいので自分で直しちゃいましょう。
filters.ktai.Emoji.phpの150行目あたりです。
static public function convert($str)
{
// $regexp = '/\[([ies]:[0-9]{1,3})\]/';
$regexp = '/\[([ies\*]):([\x21-\x7E]+)\]/';
return preg_replace_callback($regexp, array('Emoji', 'convert_callback'), $str);
}
これを下記のように。
static public function convert($str)
{
// $regexp = '/\[([ies]:[0-9]{1,3})\]/';
$regexp = '/\[([ies\*]):([\x21-\x7E]{1,3})\]/';
return preg_replace_callback($regexp, array('Emoji', 'convert_callback'), $str);
}
えぇ。
見て分かるようにアップデートされた際に量指定演算子付け忘れられたダケみたいです。
これで連続した絵文字も無問題になります。
firephp-logrouteエクステンション
firephp-logroute
ログ出力をFirePHPに対応したヘッダーで出すエクステンションです。
いや、別にCWebLogRouteでいいじゃん!って話もあるけど。
上記の携帯エクステンションと一緒に使うとログ部分がSJIS化されずに化けたりしますしね。
使い方はコチラでCoreファイルをDLしてvendorsに保存。
firephp-logrouteエクステンションもDLして保存。
あとはconfig/main.phpのlogの設定をかえるだけです。
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class' => 'ext.shiki.firePHPLogRoute.ShikiFirePHPLogRoute', // "ext" alias points to /protected/extensions
'fbPath' => 'application.vendors.FirePHPCore031.lib.FirePHPCore.fb', // set path to fb.php
),
),
),
これで画面は綺麗なまま、FireBugでログをチェック出来ます。
ヨカッタ(・∀・)
active-data-provider-with-scopesエクステンション
active-data-provider-with-scopes
これ。
前回のNameScopeの時には書かなかったけど、CDataProvidorでNameScopeが使えないという弱点を克服するものです!
まぁムチャすれば出来ないコトもなかったんですが、このエクステンションを使えばより直感的になります。
使い方は…DLしてcompornentsディレクトリにでも放り込んで下さい。
したら、ControllerでCをEに変更するだけです。
例えばCRUDしたIndexアクションの場合は下記のような感じだと思います。
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Post');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
これのCActiveDataProviderをEActiveDataProviderに変更するだけ。
これでNameScopeを使う準備はOKです。
雰囲気としては
$dataProvider=new EActiveDataProvider('Profile',array(
'criteria'=>array(
'scope'=>array('published'),
),
) );
やっほーい!
便利なNameScopeが更に便利に使えちゃいます!
おまけ:ムリにCActiveDataProviderにsocpeを使うネタ。
$dataProvider=new CActiveDataProvider('Profile',array(
'criteria'=>Post::model()->published()->getDbCriteria(),
) );
何か気持ち悪いよね!
Name Scopeってしゅごいねー Yii Framework触るぜ日記(10)
3月 30th
「しゅごいねー」は不朽の名作『赤ちゃんと僕』のミノル君からパクりました。
YiiにはName Scopeという便利機能があります。
cakeとかSymfonyにもあるのかな?Railsからパクったらしいです。
例えば
class model
{
public function scopes()
{
return array(
'scope1'=>array(
'condition'=>'status=:status',
'params'=>array(':status'=>'public',
'order'=>'created',
),
'scope2'=>array(
'limit'=>10,
),
);
}
こんな感じで設定しておけば、
$models = $model->scope1()->scope2()->findAll();
上記みたく書いたらscope1の条件とかscope2のlimitが反映されて検索してくれる。
さらに、リレーション時にも使えて
$model->scope1->with('comment:scope3')->findAll();
こんな感じでリレーションcommentで使うmodelにscope3が設定されてると、それが反映されて以下略、みたいな。
このName Scopeの素晴らしさはそれだけではなく、引数も扱えるんですよ。
class model{
function scopeHoge( $category ){
$this->getDbCriteria()->mergeWith(array(
'condition'=>'category='.$category,
));
return $this;
}
これで下記のように書けばcateogryが3のモノを取ってくる。
$model->scopeHoge(3)->findAll();
便利ですよね。
思わずRails先生の方向いて手をあわせました。
でも一個だけ弱点があって。。。
引数を取れる関数バージョン時とリーレションでの適用を同時に使えないんですよ。
$model->scope1()->with('comment:scopeHoge(3)')->findAll();
いや、引数取れないんだしいいじゃん!って話もあるんですけどね。
リレーションで使うName Scopeは素直にscopes関数で設定してあげましょう。
出来れば命名規則(プリフィックスでscopeとか)でもいいから関数対応してほしいナ。
あと、注意点としてwith()の返り値はmodel(CActiveRecode)じゃなくてCActiveFinderという別モノなので、with()からNameScopeにはチェイン出来ません。
かならず『モデル->スコープ->with->find』という流れにするように気を付けましょう(・∀・)コレで10分ハマッタ!
ヨッパゲついでに小話2 Yii Framework触るぜ日記(9)
3月 25th
ビール数杯と焼酎数杯でペロンペロンです。
こんなだと女の子に嫌われるゾ!
だからって酒飲まないのは負けみたいだし強くなろうね(・∀・)
さて、酔いついでに最近貯めていたYii PHP frameworkの小話を保存する。
Model名
Model名はYiiの公式サイトでは頭文字を大文字にする事を推奨ます。
と、あるんですがコレ、推奨じゃなくて必須(?)です。
便利なリレーションのwith()で入れ子にした際に一文字目を大文字で探されます。
$posts=Post::model()->with(
'author.profile',
'author.posts',
'categories')->findAll();
こんな感じでやった際に、author.profileのprofileなんかはProfile.phpで探されます。
(この例だとpostsもPosts.phpで探します)
ワイ、途中で全部大文字にしたがな!
Yii-userエクステンション
Yii-userエクステンション便利そうなんで使ってみました。
その際の注意点を。
まず・・・action名を省略して引数を持ったURLでアクセスするとurlManagerの設定(?)によってはエラーになります。
恐らくpathに設定してたせいですが…。
考えるのも面倒だったので下記の2箇所を修正しました。
これは新規登録時とパスワード忘れた時用のメールに記載されるURLです。
RegistrationController.phpの48行目の’/user/activation’を’/user/activation/activation’に。
RecoveryControllerも変更(確か・・・コレ・・・だったよーな・・・)。
あと、typoとか翻訳ファイル(元にはないけど/messages/jのファイル)に抜けがあるんで気をつけた方がいいです。
modules/user/models/RegistrationForm.php
こちらに、「users’s」ってのがありますが、これはtypoで正解は「user’s」のハズです(翻訳ファイルもそーなってる)。
あとは翻訳ファイルに
‘Manage Profile Field’を追加
‘This users\’s email adress already exists.’を追加
‘Update’を追加
これで使える気がします。
他にもあれば教えて下さい!
俺使ってるんで!
その他
あった気がしたけど・・・アタマが回らないので。
えー、今(2010/03/25)にYii PHP Framework試すならバージョン1.1.0がオススメです。
1.1.1だとbeforeFindがマトモに動かないのでちょっと厳しいかなと思います。
1.1.2で修正予定らしいのでそれが出たらそれで。
そんな感じです。
こーゆー感じなのでグダグダな感じなのでYii Framework触るぜ日記はいつ終わるかわかりません。
だけど、これだけ書いたら今度こそリセットしたくないなーとは思いました!
いつかYiiの情報が日本語で溢れる日を夢見て、今日もあと2,3杯呑んで寝るとします(・∀・)
アクション毎にCSSとかJavaScriptを使う Yii Framework触るぜ日記(8)
3月 25th
愚痴っただけでも何なので。
このページではhoge.cssを使いたい!
とかfoo.jsを読み込みたい!
ってのがあるんですよ。
ね。
そんなときの解決方法。
protected/view/layouts/main.phpを見てみると、な~んも書いてない。
「オレ、ここで指定されたCSSとかJavaScriptはくよ!」
そんな雰囲気がまったくない。
・・・あれ~っと思いつつAPIを見てるとそれらしきもの発見。
CClientScriptがそれです。
CWebApplicationのAPIに【clientScript: manages client scripts (javascripts and CSS).】
と書かれている。
CSSって書かれるし・・・。
ダメ元で試したら、やり方は簡単でした(さすがYii!)。
Controllerの当該actionで下記のように書くだけ。
Yii::app()->getClientScript()->registerCssFile( '/css/hoge.css' );
これで書いたactionの時のみ/css/hoge.cssを読み込みます!
CClientScriptのAPIを見れば他にどんな事ができるか一目瞭然です。
layouts/main.phpには何ら特別な記述されてないのにっ! 不思議!!
ソースを読もうかと思ったけどお酒が回ってるので諦めました。
まとめ
今日のお寿司は美味しかったです(・∀・)ひゃっほーい!
あれ? Yii Framework触るぜ日記(7.5)
3月 24th
日記というかただの愚痴なんで7.5です。
もしくはbug reportingですかね(・∀・)
CActiveRecode.phpのquery()のトコが気になる。
Yii PHP framework 1.1.0
private function query($criteria,$all=false)
{
$this->beforeFind();
$this->applyScopes($criteria);
$command=$this->getCommandBuilder()->createFindCommand($this->getTableSchema(),$criteria);
return $all ? $this->populateRecords($command->queryAll()) : $this->populateRecord($command->queryRow());
}
だったのが
Yii PHP framework 1.1.1
では
private function query($criteria,$all=false)
{
$this->applyScopes($criteria);
if(empty($criteria->with))
{
if(!$all)
$criteria->limit=1;
$this->beforeFind();
$command=$this->getCommandBuilder()->createFindCommand($this->getTableSchema(),$criteria);
return $all ? $this->populateRecords($command->queryAll()) : $this->populateRecord($command->queryRow());
}
else
return $this->with($criteria->with)->query($criteria,$all);
}
何か色々機能が増えてそうだね♪ って話じゃない。
$this->applyScopes($criteria)を呼ぶタイミングが変わってるんですよ。
$this->beforeFind()の前と後に。
でapplyScopes()は何と言うか、CDbCriteria(よーするにSQLクエリー)の情報を混ぜる役目っぽいのですよ。
新しいバージョン(1.1.1)ではbeforeFind()の前に呼ばれている。
これだと…そう、beforeFind()で条件を指定出来なくない!?
って話。
Yii Framework触るぜ日記(4)でやったshimiSoftDeleteが動いてなくて「あれ?俺、試してなかったっけ?」となっていたんですが…バグじゃね?
念の為にyii-1.1.0で試したらちゃんと動くじゃねーか!
仕様変更とも言えるかもしれないけど…検索条件さわれないbeforeFindに何の意味があるんですか(ノд`)俺の数時間返せ…
Yii PHP framework 1.1.2で修正される事を切に願います。
ってか誰か英語出来る人、本家に聞いてみてほしい(´・ω・`)
追記:速攻
issue見たらあった。。。orz
えー…なんなろこのキモチ(´・ω・`)
追記:one more thing!
えーっと、1.1.2が出るまで自力で修正する人は
CActiveRecode::query()の位置を変えるのと、CActiveFinder::query()の方も変更しないとwith()使った際にアレです。
これでさらに30分は使った。。。
urlManager Yii Framework触るぜ日記(7)
3月 18th
URLを変えたかったんです。
前にやった方法だと何だか長ったらしいじゃないですか。
http://shimi-zoo.com/member/view/id/1
上記のようなURLになるのを
http://shimi-zoo.com/member/1
こんな感じでアクセスしたいんです。
方法は簡単でapplication/protected/config/main.phpに設定するだけです。
公式の解説ページはコッチ。
'urlManager'=>array( 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( 'member/<id:\d+>'=>'member/view', 'member/<id:\d+>/<_a:\w+>'=>'member/<_a>', ), ),
これで$_GET['id']で取得出来るし見た目的にもいい感じかな、と。
6行目の指定で他のactionにも紐付けられる感じです。
URLの生成については
$this->createUrl('view',array('id=>1));
CHtml::link('リンクだよ', array('view','id'=>1) );
CHtml::link('リンクだよ', array('member/view','id'=>1) );
どれでやっても対応した形式のURLにしてくれます。
まぁ、それだけ。忘れる前にメモる!
追記:3/22
urlManagerつながりでココに追記しておく。
urlFormatをpathに設定するときはactionを省略してかつ、引数を持たせるとダメみたいですね。
たとえばbookコントローラーのdefaultアクションにid=5を渡す時。
/book/id/5
みたいなIDになってbookのactionIdを動かそうとするワケです。
普段は気をつければいいレベルだけどモジュールでそういうアクションを指定されてるとアウトですね。。。Yii-userとか。

