Transitionコンポーネント1.0をリリースします。

6/19追記:@k1LoWさんが紹介記事を書いてくれました。ありがとうございます!

概要

@k1LoWさんの多大な助力もあり、多くのバグフィックスと新機能の追加がありました。
トータルで89のテストケースがパスし、実践投入が現実的になりましたので、ここに1.0をリリースすることをお知らせします。

ダウンロード

http://github.com/hiromi2424/TransitionComponent/downloads
「1.0」をダウンロードしてください。

主な新機能

  • Session->setFlash()のパラメータが全て指定できるように、$flashParamsプロパティが導入されました。(k1LoWさんの提案)
  • mergedData()の引数に$callbackがつきました。これによりマージの仕方を好みに変更できます。デフォルトがSet::merge()になりました。(以前はarray_merge_recursive()で、これだとマージがうまく働かなかった)$callbackには、正しいコールバック形式か、'Set::pushDiff'のような文字列を渡すことが出来ます。
  • セッションに使う基本のキーが$sessionKeyプロパティで変更できるようになりました。
  • checkData()などでモデルにfalseを指定するとモデルバリデーションを行わなくなりました。
  • ユーザバリデーションとモデルバリデーションが同時に行えるようになりました。

バグフィックス

単純なtypoの他、モデルの読み込みの不具合など、特にcheckData()まわりは様々なケースに対応できるように修正されました。

サンプルコード

全ての機能を使いきるつもりで書き下してみます。

<?php

class RegisterController extends AppController {
	var $components = array(
		'Transition' => array(
			'automation' => array(
				'confirm' => array(
					'nextStep' => 'save',
					'models' => false,
					'validationMethod' => 'validateCaptcha',
					'prev' => array('register', 'profile'),
					'messages' => array(
						'invalid' => '修正が必要な情報があります。各ページに戻って、情報を修正してください。',
						'prev' => false,
					),
				),
			),
			'messages' => array(
				'invalid' => '修正が必要な情報があります。',
				'prev' => 'ページの遷移が不正です',
			),
			'flashParams' => array(
				'element' => 'show_error',
				'params' => array('class' => 'wizard'),
				'key' => 'wizard',
			),
			'models' => array('User'),
			'sessionBaseKey' => 'Wizard',
		),
	);

	function register() {
		$this->Transition->checkData('profile');
	}

	function profile() {
		$this->Transition->automate('confirm', 'Profile', 'register');
	}

	function confirm() {
		$this->data = $this->Transition->mergedData();
		$User = ClassRegistry::init('User');
		$User->create($this->data);
		$User->validate();
		$User->Profile->create($this->data);
		$User->Profile->validate();
		$this->set('captcha', createCaptcha());
	}
	
	function save() {
		$this->Transition->checkPrev(array('register', 'profile', 'confirm'));
		$this->Transition->deleteData('cofirm');
		$data = $this->Transition->mergedData('Set::pushDiff');
		if (ClassRegistry::init('User')->saveAll($data)) {
			$this->Transition->clearData();
			$this->redirect(array('controller' => 'page', 'action' => 'index'));
		} else {
			$this->redirect(array('action' => 'confirm'));
		}
	}
}

その他

動かないところなどあったらいつでもお知らせください。