コンソールアプリケーション Yii Framework触るぜ日記(6)

シェルからコマンド打ってガー!
というヤツです。
cronから動かしたりメール受信した際に処理させたりと意外と使う。
今回はコレをYiiでやってみるテストです。

参考にしたのはモチロン(?)choco & moca Yiiのcron jobの作成法公式です。
今回は公式の方のタイプでやってみましたよ。

流れ

protected/直下にエントリースクリプトを置く。
protected/commands/直下にコマンドクラスを置く。
シェルからGO!!
という流れになります。

エントリースクリプト

まぁ、下記の内容でいいっす。

<?php
defined('YII_DEBUG') or define('YII_DEBUG',true);

require_once('/path/to/framework/yii.php');
$config = dirname(__FILE__).'/config/main.php';

Yii::createConsoleApplication($config)->run();

これを適当な名前でprotected直下においてくださいな。
とりあえず今回はcui.phpとして保存しました。

コマンドクラス

CConsoleCommandを継承したコマンドクラスを用意します。
このコマンドクラスをprotected/commands/の下に置く。
クラス名にCommand付けないとアレです。

<?php
class sampleCommand extends CConsoleCommand
{
	public function run( $args )
	{
		echo('sample'."\n");
	}
}

これをprotected/commands/sampleCommand.phpとして保存。
ファイル名にもCommandが必要です。

シェルからGO!

あとはシェルから入れればOKです

php ./protected/cui.php sample

これでsampleって表示されるよ!

おまけ

main.phpに設定するとCommand付けるとかいう気持ち悪さ(?)から開放されます。
protected/config/main.phpに設定を追加。

	'commandMap'=>array(
		'sample'=>'application.commands.sample'
	),

これでクラス名やファイル名にsampleってつけなくてよくなりますよ。
クラスファイルを設置するディレクトリも自由になります。

まぁ、Commandつける方が早いけどね!!!

携帯表示その1 Yii Framework触るぜ日記(5)

ナウなヤングは携帯だって!
PCみたいなモン起動させてる間に携帯でいけますから!
ってか俺、携帯サイトばっかり触ってる人ですもんね。
javascriptで遊びたいよ、ママン(><)

そんなワケで携帯対応してみる。
とりいそぎ表示テンプレートを分ける程度の簡易対応です。
最初はCThemeとかCThemeManagerとか触るハメになるかと思ったけどそこまでしなくても大丈夫みたいです。

とはいえこれで正解か微妙ですが…。

やりたい事は、

  1. viewファイルを携帯なら携帯用のviewファイルを使いたい
  2. ディレクトリで携帯をわけるのヤダ(面倒)
  3. docomo_index.phpとかau_index.phpみたくしたい
  4. 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)

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はちゃんと間に合おうと誓った次第であります。

日本人の知らない日本語

面白かったので紹介。

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

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

あと、確か『「お召し上がりください」は二重敬語で間違いた!』ってあったけど
文化審議会答申の「敬語の指針」によれば習慣として定着している言い方って事で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触るぜ日記スタートする(・∀・)