CakePHP1.3.6:Shellを使う。

CakePHPにはシェル(バッチ)機能がある。
CakeのモデルはORMとして魅力的なので、バッチで使えると重宝だと思う。

シェルの使い方については、CookBookの記事(など)が参考になる。

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' =>'入力してください'),

・・・・

}
?>