2011年02月02日

日付絞り込みビヘイビア

お願いします♪いいねとかつぶやいたりして下さい
 
うーん。なんか強引な作りになったな。
でも、一応メモ。

だめだ。やっぱり、 find を拡張するべきだな。
beforeFindは使いづらい。

概要と流れ


[概要]データを検索するときにグーグルアドワーズ風な
0 => '全期間',
1 => '今日',
2 => '昨日',
3 => '今週',
4 => '先週',
5 => '先月',
6 => '過去30日間',
7 => '全期間'
で、データを絞り込む。

・hasMany対応。
・beforeFindするときに一括でfindを設定するのでいちいち設定する必要無し。



○ビヘイビア
<?php
/*
	グーグルアドワーズみたいに
	0 => '全期間',
	1 => '今日',
	2 => '昨日',
	3 => '今週',
	4 => '先週',
	5 => '先月',
	6 => '過去30日間',
	7 => '全期間'
	
	の日付でデータを絞り込めるビヘイビア
	日曜日 → 土曜日まで
*/
class SqlDateBehavior extends ModelBehavior
{
	var $sqlDate = 0;
	
	var $config = array(
		'field_name' => 'created'//cretedフィールドの名前
	);
	
	var $days = array(
			0 => '全期間',
			1 => '今日',
			2 => '昨日',
			3 => '今週',
			4 => '先週',
			5 => '今月',
			6 => '先月',
			7 => '過去30日間'
	);
	
	function setup(&$model, $config = array())
	{
		$this->config = array_merge($this->config, $config);
		
    }
	
	/*
		日付リストを一覧で返す
		@return array 日付のリスト
	*/
	function getDateList(&$model)
	{
		return $this->days;
	}
	
	/*
		指定された日付毎のcretedSQLを作成
		@params int $days_key daysのキー
		@return 0 (全期間以外は)created のSQLを返す
	*/
	function getDaysSql(&$model,$days_key = 0)
	{
		App::import('Helper', 'Time');
		$time = new TimeHelper();
		$q = false;
		switch($days_key){
			case 0:
				//全期間
			break;
			case 1:
				//今日
				$q = $time->dayAsSql(date('Y-m-d'),$this->config['field_name']);
			break;
			case 2:
				//昨日
				$q = $time->dayAsSql(date('Y-m-d',strtotime("-1 day")),$this->config['field_name']);
			break;
			case 3:
				//今週		
				$this_week[0] = date('Y-m-d',strtotime("last Sunday"));
				$this_week[1] = date('Y-m-d',strtotime("Saturday"));
				$q = $time->daysAsSql($this_week[0],$this_week[1],$this->config['field_name']);
			break;
			case 4:
				//先週
				$last_week[0] = strtotime("last Sunday")-604800;//-7日分
				$last_week[0] = date('Y-m-d',$last_week[0]);
				$last_week[1] = strtotime("Saturday")-604800;//-7日分
				$last_week[1] = date('Y-m-d',$last_week[1]);
				$q = $time->daysAsSql($last_week[0],$last_week[1],$this->config['field_name']);
			break;
			case 5:
				//今月
				$this_month[0] = date('Y-m-01');
				$this_month[1] = date(DATE_W3C, mktime(0, 0, 0, date('m')+1, 0, date('y')));
				$q = $time->daysAsSql($this_month[0],$this_month[1],$this->config['field_name']);
			break;
			case 6:
				//先月
				$last_month[0] = date('Y-m-01',strtotime('-1 month'));
				$last_month[1] = date(DATE_W3C, mktime(0, 0, 0, date('m'), 0, date('y')));
				$q = $time->daysAsSql($last_month[0],$last_month[1],$this->config['field_name']);
			break;
			case 7:
				//過去30日
				$last_month[0] = date('Y-m-d',strtotime('-30 day'));
				$last_month[1] = date('Y-m-d');
				$q = $time->daysAsSql($last_month[0],$last_month[1],$this->config['field_name']);
			break;
			
		}
		
		return $q;
	}
	
}

?>



使い方サンプル
○モデル
使いたいモデルで読み込み
var $actsAs = array(
    'Sqldate' => array(
        'config' => array('field_name' => 'created')//createdフィールドの名前
    )
);

//日付指定されていれば日付を指定してデータを取得
//今回は User モデルに PayモデルがhasManyされている場合で、Payモデルの日付を制限したいとき
function beforeFind($q)
{
    if($this->sqlDate != 0){
        $this->hasMany['Pay']['conditions'][] = $this->getDaysSql($this->sqlDate);//createdクエリが返る
    }
    
    return $q;
}



○コントローラー
//このdayskeyに 今日、明日などのキーを渡しとく
function mypage($days_key = 0)
{
    //日付リストを取得
    $days_list = $this->M->getDateList();
        
    //月別ならこのメソッドで月別に見られるようにするか。
    $this->M->sqlDate = $days_key;//日付絞り込みキーを渡す
    $res = $this->M->find('all');
}


○ビュー
<?
	//コントローラーに渡す days_key のリストを作成
	foreach($days_list as $key => $v){
		echo '<a href="/users/mypage/'.$key.'/">'.$v.'</a><br />';	
	}
?>


こんな感じ。
sqldateビヘイビアはただ単に指定した日付に応じた cretedの範囲を返すだけ。
もっとシンプルに作れたら良かったけどなぁ。。。
関連するタグ: PHP cakephp 配布
あなたにとって有用な記事でしたか?是非ブックマークしておくことをおすすめします。
 




ライブラリを配布しちゃったり
webデザイン
Fireworks
HTMLコーディング
CSS
Dreamweaver
携帯サイト
webプログラム
PHP
正規表現
cakephp
MYSQL
javascript
webマーケティング
adwords
analytics
windows7
ショートカットキー
おすすめ情報
サイト
facebook
ライブラリ
配布
アプリ
iphone
ipad
サーバー
さくらサーバー
全ての記事を読む




トップ - 最新の記事一覧 - お問い合わせ