<?php
/**
* パンくずリストコンポーネント
*
* PHP version 5
*
* @package    components.charcoal
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class BreadcrumbList implements IComponent
{
	var $_breadcrumbs;
	var $_format;
	var $_separator;

	const DEFAULT_FORMAT      = '<a href="%URL%">%CAPTION%</a>';
	const DEFAULT_SEPARATOR   = '&nbsp;&gt;&nbsp;';

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

	/*
	 * コンポーネント名を取得
	 */
	public function getComponentName()
	{
		return "BreadcrumbList Component";
	}

	/*
	 * コンポーネントを初期化する
	 */
	public function init( Config $config )
	{
		$this->_breadcrumbs = $config->getArray( "breadcrumbs" );
		$this->_format 		= $config->getString( "format" );
		$this->_separator 	= $config->getString( "separator" );
	}

	/*
	 * パンくずリストを生成
	 */
	public function makeList( $breadcrumbs )
	{
		// NULLチェック
		if ( !$breadcrumbs ){
			throw new NullPointerException( "breadcrumbs" );
		}

		// 配列チェック
		if ( !is_array($breadcrumbs) ){
			throw new ParameterException( "breadcrumbs", $breadcrumbs, "not array" );
		}

		// Linkerコンポーネントを作成
		$linker = DIContainer::getComponent( "charcoal:Linker" );

		// パンくずを生成
		$out = "";

		// フォーマットが無指定なら、デフォルトのフォーマットを指定
		$format = $this->_format ? $this->_format : self::DEFAULT_FORMAT;

		// セパレータが無指定なら、デフォルトのセパレータを指定
		$separator = $this->_separator ? $this->_separator : self::DEFAULT_SEPARATOR;

		// 階層別に出力
		foreach( $breadcrumbs as $b ){
			// パンくず設定を取得
			$setting = $this->_breadcrumbs[ $b ];
			// 設定がある場合だけ処理
			if ( $setting ){
				// キャプションと論理リンク名を取得
				$caption = $setting[ 'caption' ];
				$link = $setting[ 'link' ];

				// Linkerコンポーネントで物理アドレスに変換
				if ( $linker->hasLink($link) ){
					$url = $linker->getLink( $link );
				}
				else{
					$url = $link;
				}

				// マクロ展開
				$str = $format;
				$str = str_replace( "%CAPTION%", $caption, $str );
				$str = str_replace( "%URL%", $url, $str );

				// 追加
				if ( strlen($out) > 0 ){
					$out .= $separator;
				}
				$out .= $str;
			}
		}

		return $out;
	}
}
