CSVを作るとか、サイトマップを作るとか、再利用性のある処理はいつもタスクに書いてしまいます。
そのタスクをコントローラーからでもモデルからでも呼べれば、「ブラウザのボタンクリックでCSVをDLする」ような処理をどこにでも簡潔に記述できそうです。
やってみる
fuel/app/classes/controller/item.php
public function post_download()
{
$time = \Date::forge()->get_timestamp();
$path = APPPATH.'tmp/export/item/'.$time.'.csv';
//
\Package::load('oil');
$bf= \Fuel::$is_cli;
\Fuel::$is_cli =true;
$_SERVER['argc'] = 1;
Oil\Refine::run('export_items', array($path) );
\Fuel::$is_cli = $bf;
if( file_exists($path) ){
File::download($path,sprintf('item-%s.csv',date('Ymd_Hi',$time)));
}
}
できた
ポイントは、
-
\Fuel::$is_cli
を偽装してCLI実行を装う(後で戻す) - 引数の数を
argc
で指定する
だがしかし
タスクは、戻り値がとれないので、タスク内でエラーが出てもよくわからないし、結果も取得できません。
なので、ファイルの場所を引数で指定するとか、結果を得る工夫は必要です。
あと、タスク内でechoとかされると画面に出力されてしまうので、ob_start()
するなりして回避しないとかもしれないです。