CakePHP1.3.6:Shellを使う。
CakePHPにはシェル(バッチ)機能がある。
CakeのモデルはORMとして魅力的なので、バッチで使えると重宝だと思う。
シェルの使い方については、CookBookの記事(1、2など)が参考になる。
cakeコマンドは、
/cake/console
にあるので、chmod 755で実行権限を与える。
そして、
/app/vendors/shells
に(例えば)test.phpを作成すれば、/cake/consoleにcdして
cake test
でシェルが実行される。
/app/vendors/shells/test.phpは以下。以前作成したSaleとCustomerモデルを利用する。
<?php class TestShell extends Shell { var $uses = array('Sale','Customer'); function main() { $sales = $this->Sale->find('all'); //Print out each order's information foreach($sales as $sale) { $this->out('商品名: ' . $sale['Sale']['item_name'] . "\n"); $this->out('顧客名: ' . $sale['Customer']['name'] . "\n"); $this->out('売上日: ' . $sale['Sale']['purchase_date'] . "\n"); $this->out('金額: ' . number_format($sale['Sale']['amount'], 0) . "\n"); $this->out('----------------------------------------' . "\n"); $total += $sale['Sale']['amount']; } //Print out total for the selected orders $this->out("計: " . number_format($total, 0) . "\n"); } } ?>
結果は以下が画面出力される。
Welcome to CakePHP v1.3.6 Console --------------------------------------------------------------- App : app Path: /home/tetsuya/workspace_pdt/cakesample/app --------------------------------------------------------------- 商品名: 商品1 顧客名: 山田太郎 売上日: 2010/12/01 金額: 101 ---------------------------------------- 商品名: 商品1 顧客名: 豊臣秀吉 売上日: 2011/1/1 金額: 3,000 ---------------------------------------- 商品名: 商品1 顧客名: 豊臣秀吉 売上日: 2011/1/1 金額: 3,000 ---------------------------------------- 商品名: 商品2 顧客名: 織田信長 売上日: 2011/1/1 金額: 300 ---------------------------------------- 計: 6,401
ここで思わぬ誤算。モデルに独自バリデータを利用する際に、MyValidatorを使った(以下)が、ここで相対パスでrequireする部分が引っかかった。これは注意が必要だなぁ。
<?php require_once '../vendors/MyValidator.class.php'; class Sale extends AppModel { public $name = 'Sale'; public $belongsTo = array( "Customer" => array( 'className' => 'Customer', 'conditions' => '', 'order' => '', 'dependent' => false, 'foreignKey' => 'customer_id' ) ); public $validate = array( 'customer_id'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), ・・・・ } ?>