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

class PHPTALRenderer implements IRenderer
{
	var $_template_files;
	var $_repository;

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

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

	/*
	 * レンダラーを初期化する
	 */
	public function init( Config $config )
	{
		// テンプレートファイルマッピング
		$this->_template_files	= $config->getArray( 'template_files' );

		// リポジトリ
		$this->_repository = $config->getString( 'repository', TRUE );
	}

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

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

		try{

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

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

			// PHPTALオブジェクトを作成
			$template = new PHPTAL( $template_file );

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

			// テンプレートパスを設定
			$template->setTemplateRepository( $this->_repository );

			// レンダリング
			echo $template->execute();

		}
		catch ( Exception $e ){
			throw new RendererException( $proc_key, "rendering failed", $e );
		}

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