<?php
/**
* 単純なフォームを実装するクラス
*
* PHP version 5
*
* @package    forms
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/


class SimpleForm extends CharcoalComponent implements IForm
{
	var $_dto;
	var $_model;
	var $_transformer;

	/*
	 * コンストラクタ
	 */
	public function __construct()
	{
		parent::__construct();
	}

	/*
	 * フォームを初期化する
	 */
	public function init( Config $config )
	{
		$model_class                = $config->getString( s('model_class') );
		$transformer_name           = $config->getString( s('transformer_name') );
		$this->_auto_input_request  = $config->getBoolean( s('auto_input_request') );
		$this->_auto_output         = $config->getBoolean( s('auto_output') );

		// フォームモデルを作成
		$this->_model = ClassUtil::newInstance( $model_class );
		
		// トランスフォーマを作成
		$this->_transformer = Factory::createTransformer( $transformer_name );

		// モデルからDTOを生成
		$this->_dto = $this->_model->createDTO();
	}

	/*
	 * フォームモデルを取得
	 */
	public function getFormModel()
	{
		return $this->_model;
	}

	/*
	 * フォームデータを取得
	 */
	public function get( $key )
	{
		return $this->_form_values[ $key ];
	}

	/*
	 * フォームに関連付けられたDTOを取得
	 */
	public function getDTO()
	{
		return $this->_dto;
	}

	/*
	 * リクエスト自動入力するか
	 */
	public function isAutoInputRequest()
	{
		return $this->_auto_input_request;
	}

	/*
	 * 自動出力するか
	 */
	public function isAutoOutput()
	{
		return $this->_auto_output;
	}

	/*
	 * フォームバリデーションを行う
	 */
	public function validate()
	{
		return true;
	}

	/*
	 * DTOからフォームの入力を行う
	 */
	public function inputDTO( DTO $dto, IModel $model = NULL )
	{
		// 変換元DTOから、FormModelへの変換を行う
		if ( $model ){
			$dto = $this->_transformer->transform( $dto, $model, new DTO(), $this->_model );
		}

		$this->_dto = $dto;
	}

	/*
	 * Eventからフォームの入力を行う
	 */
	public function inputEvent( IEvent $event )
	{
		$conv = EncodingConverter::fromString( 'HTML_TO_PHP' );

		$model = $this->_model;
		$dto = new DTO();

		$fields = $model->getFieldList();
		if ( $fields ){
			foreach( $fields as $field ){
				$value = $event->get( s($field) );

				if ( is_string($value) ){
					$value = $conv->convertEncoding( $value );
				}

				$dto->$field = $value;
			}
		}

		$this->_dto = $dto;
	}

	/*
	 * フォームの値をDTOに変換する
	 */
	public function toDTO( IModel $model )
	{
		// 変換元DTOから、FormModelへの変換を行う
		return $this->_transformer->transform( $this->_dto, $this->_model, new DTO(), $model );
	}

	/*
	 * HTMLオブジェクトに変換
	 */
	public function toHTMLObject( $read_only = FALSE )
	{
		return HTMLFormFactory::create( $this->_model, $this->_dto, $read_only );
	}
}

return __FILE__;