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


class charcoal_SimpleForm implements charcoal_IForm
{
	var $_dto;
	var $_model;
	var $_transformer;

	/*
	 * コンストラクタ
	 */
	public function __construct()
	{
		$this->_dto = new charcoal_DTO();
	}

	/*
	 * フォーム名を取得
	 */
	public function getFormName()
	{
		return "SimpleForm form";
	}

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

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

	}

	/*
	 * フォームモデルを取得
	 */
	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( charcoal_DTO $dto, charcoal_IModel $model )
	{
		// 変換元DTOから、FormModelへの変換を行う
		$dto = $this->_transformer->transform( $dto, $model, new charcoal_DTO(), $this->_model );

		$this->_dto = $dto;
	}

	/*
	 * Requstからフォームの入力を行う
	 */
	public function inputRequest( charcoal_Request $request )
	{
		$conv = charcoal_EncodingConverter::fromString( 'HTML_TO_PHP' );

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

		$fields = $model->getFieldList();
		if ( $fields ){
			foreach( $fields as $field ){
				$value = $request->get( $field );
				if ( is_string($value) ){
					$value = $conv->convertEncoding( $value );
				}
				$dto->$field = $value;
			}
		}

		$this->_dto = $dto;
	}

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

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