CakePHP を crontab でバッチ処理をしたかったので調べてみると、いくつかの方法があるようだが理解しやすそうな方法を選んでみた。
crontabとCakePHPでバッチ処理をする
ちなみに対象は CakePHP2.0 となるので CakePHP1.3 を対象としている参考サイトでのパッケージ構成は変更されている。
Just another WordPress.com site
CakePHP を crontab でバッチ処理をしたかったので調べてみると、いくつかの方法があるようだが理解しやすそうな方法を選んでみた。
crontabとCakePHPでバッチ処理をする
ちなみに対象は CakePHP2.0 となるので CakePHP1.3 を対象としている参考サイトでのパッケージ構成は変更されている。
hasOne や hasMany などでアソシエーションを作っておくと、常にその関連テーブルは対象のModel にくっついています。
場合によっては対象のModel単体のpagenateを取得したいとき、アソシエーションの一時解除が可能です。
$this->Model->recursive = -1;
print_r($this->Model->pagenate()); // アソシエーションされない
$this->Model->recursive = 1;
print_r($this->Model->pagenate()); // アソシエーションされる(通常通り)
recursive についてはこちらを参照のこと ↓
recursiveの正しい理解CakePHP
AuthComponentを使っている場合、たまにログイン後の遷移先が http://…/favicon.ico となるケースが存在する。
また、Auth認証前に認証が必要なページにアクセスした際も、リファラ情報として保持されて再度Auth認証後の遷移先が意図しないケースも存在する。
そこで遷移先の固定化を図る。
Authコンポーネントで、ログイン後の遷移先を固定する
users_controller.phpにて
function beforeFilter(){
$this->Auth->loginRedirect = array('controller' => 'hoge', 'action' => 'view');
}
function login(){
$this->Session->delete('Auth.redirect');
}
$conditions への検索条件の追記では AND検索になるので OR条件での設定を調べてみた。
$conditions = array("Post.modified BETWEEN ? AND ?" => array($from,$to));
$conditions = $conditions + array('or' => array( array('Post.comment_cnt ' => '0'), array('Post.favarate_cnt ' => '0')));
$this->paginate = array('limit' => $limit, 'order' => array('Post.modified DESC'));
$data = $this->paginate('Post',$conditions);
$this->set('posts', $data);
非常に便利な helperを自作していただいたので転記する。
仮想化する僕たち
view側で簡単にpage関連の情報を扱うことができない。例えば現在のページとか、全部で何ページあるのかとか・・・。
まず、appフォルダ以下にapp_helper.phpを作成
params['paging'][$this->defaultModel()];
if($key == "start")
return ife($paging['count'] >= 1, ($paging['page'] - 1) * ($paging['options']['limit']) + 1, '0');
else if($key == "end"){
$start = ife($paging['count'] >= 1, ($paging['page'] - 1) * ($paging['options']['limit']) + 1, '0');
return ife(($paging['count'] Html->url(array('page' => $page));
}
}
/app/controller/action/$id のようにFormHelper::create() で作成するフォームにパラメータ $id を追加するには、第2引数の’url’ にハッシュを加える。
echo $form->create('...', array('url' => array($id)));
フォームにurl指定で id を自動追加したくない場合は以下のようにする。
echo $form->create('...', array('url' => array('id' => null, $id)));
paginator->numbers() も同様にパラメータを追加できる。
echo $paginator->numbers('...', array('url' => array($id)));