<?php
//「入力 → 確認 → 登録」専用アクションクラス
class ConfirmSubmitAction extends Action {
	/*
		初期化の際にモジュール配下のformsより、対応するHTML_Quickformオブジェクトを
		取得する
		
		module
		├actions
		├forms  ←ここになります。
		├views
		├templates
		 .....
		 
		 
		 ※モジュール名、アクション名は動的に取得し、hidden要素を作成の上、
		 組み込んでおく。
		 
		 processというhidden要素も合わせて組み込み、これを元に「入力、確認」の判断材料とする
	*/
    function initialize (&$controller, &$request, &$user) {
		$module =& $controller->getCurrentModule();
		$action   =& $controller->getCurrentAction();

		$formObjectName      = $action.'Form';
		$formObjectDirectory = BASE_DIR . 'modules/'. $module . '/forms';
		$formObjectFile         = $formObjectDirectory. '/' . $formObjectName . '.class.php';
		if (is_readable($formObjectFile)) {
			require_once($formObjectFile);
			$actionForm = new $formObjectName;
			$form = $actionForm->execute();
		    $form->addElement('hidden', 'module', $module);
			$form->addElement('hidden', 'action', $action);
			$form->addElement('hidden', 'process');
			$form->removeElement('submit');
			
			$request->setAttributeByRef('form', $form);
			return true;
		}
    }

    /*
    	送信されたデータをHTML_Quickformでチェック
    	合わせて送信された値もセッション内に保存
    */
    function validate(&$controller, &$request, &$user) {
    	$this->_saveInputs($controller, $request, $user);

    	$form =& $request->getAttribute("form");
    	if($form->validate()){
    		return true;
    	}
    	
    	//「確認」submitボタンを表示する必要があるので、戻り値は無視して処理だけを呼ぶ
    	$this->_executeInput($controller, $request, $user);
		return false;
    }

    /*
    	実行部分
    */
	function execute (&$controller, &$request, &$user) {
    	switch ($request->getParameter('process')) {
    		case 'confirm':
    			return $this->_executeConfirm($controller, $request, $user);
    		case 'submit':
    			return $this->_executeSubmit($controller, $request, $user);
    		default:
    			return $this->_executeInput($controller, $request, $user);
    	}
    }

    function getDefaultView (&$controller, &$request, &$user) {
    	return $this->_executeInput($controller, $request, $user);
    }

    /*
    	execute部分をPOSTのみ対象とする
    */
    function getRequestMethods () {
        return REQ_POST;
    }

    /*
    	userオブジェクトにモジュール名 + アクション名で入力値を全て保存
    */
    function _saveInputs(&$controller, &$request, &$user){
    	$form =& $request->getAttribute("form");
    	$attributeName = $controller->getCurrentModule() . $controller->getCurrentAction();
    	$user->setAttribute(
    		$attributeName,
    		$form->exportValues()
    	);
    }

    /*
    	「確認」submitボタンを含め、入力画面を表示
    */
    function _executeInput(&$controller, &$request, &$user){
    	$form =& $request->getAttribute("form");
    	$attributeName = $controller->getCurrentModule() . $controller->getCurrentAction();
    	$savedValues = $user->getAttribute($attributeName);
    	
    	if(is_array($savedValues)){
	    	foreach ($savedValues as $key => $value){
	    		$element =& $form->getElement($key);
	    		$element->setValue($value);
	    	}
    	}
    	
	   	$form->setConstants(array('process' => 'confirm'));
    	$form->addElement('submit', 'submit', '確認');

    	return VIEW_INPUT;
    }

    /*
    	「登録」submitボタンを含め、確認画面を表示
    */
    function _executeConfirm(&$controller, &$request, &$user){
    	$form =& $request->getAttribute("form");
	   	$form->setConstants(array('process' => 'submit'));
		$form->addElement('submit', 'submit', '登録');
		$form->freeze();
        return VIEW_SUCCESS;
    }
    
    /*
    	登録時に表示する画面などはオーバーライドしてもらう
    */
    function _executeSubmit(&$controller, &$request, &$user){
    	trigger_error('_executeSubmit(&$controller, &$request, &$user)はオーバーライドしてください', E_USER_ERROR);
    }
}

/***********************************************
継承するので、結果として「入力 → 確認 → 登録」は
ここのみが必要となる
***********************************************/
class InputAction extends ConfirmSubmitAction {

	/*
		結果表示
	*/
    function _executeSubmit(&$controller, &$request, &$user){
		$controller->forward('MemberRegist', 'Result');
		return VIEW_NONE;
    }
}
?>