<?
/**
* Smartyレンダラ
*
* PHP version 5
*
* @package    renderers
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
require_once( 'Smarty/Smarty.class.php' );

class charcoal_SmartyRenderer implements charcoal_IRenderer
{
	var $_template_files;
	var $_smarty;

	/*
	 *	コンストラクタ
	 */
	public function __construct()
	{
		$this->_template_files = array();
		$this->_smarty = new Smarty();
	}

	/*
	 * レンダラー名を取得
	 */
	public function getRendererName()
	{
		return "Smarty Renderer";
	}

	/*
	 * レンダラーを初期化する
	 */
	public function init( charcoal_Config $config )
	{
		$this->_smarty->caching 		= $config->getBoolean( 'caching' );
		$this->_smarty->compile_check 	= $config->getBoolean( 'compile_check' );
		$this->_smarty->template_dir 	= $config->getString( 'template_dir', TRUE );
		$this->_smarty->compile_dir 	= $config->getString( 'compile_dir', TRUE );
		$this->_smarty->config_dir 		= $config->getString( 'config_dir', TRUE );
		$this->_smarty->cache_dir 		= $config->getString( 'cache_dir', TRUE );

		// テンプレートファイルマッピング
		$this->_template_files	= $config->getArray( 'template_files' );
	}

	/*
	 * テンプレートファイル名を取得
	 */
	private function getTemplateFile( $template_name )
	{
		$template_file = $this->_template_files[ $template_name ];
		if ( !$template_file ){
//$this->_config->dump();
			throw new charcoal_TemplateFileNotFoundException( $template_name );
		}
		return $template_file;
	}

	/*
	 * レンダリングを行う
	 */
	public function render( $proc_key, charcoal_ProcedureContext $context, charcoal_Response $response )
	{
		log_info( "system",  "SmartyRendererによるレンダリングを行います。", __FILE__, __LINE__ );

		try{

			// Smartyオブジェクトを取得
			$smarty = $this->_smarty;

			// レスポンスデータをすべてSmartyにassignする
			$keys = $response->getKeys();
			foreach( $keys as $key ){
				$value = $response->get( $key );
				$smarty->assign( $key, $value );
			}

			// 論理テンプレート名
			$template_name = $context->get( 'smarty_template' );

			// テンプレートファイル名に変換
			$template_file = $this->getTemplateFile( $template_name );

			// テンプレートを展開、表示
			$smarty->display( $template_file );
		}
		catch ( Exception $e ){
			throw new charcoal_RendererException( $proc_key, "rendering failed", $e );
		}

		log_info( "system",  "SmartyRendererによるレンダリングを行いました。", __FILE__, __LINE__ );
	}
}
?>