px-files/_sys/php/px.php
public function href( $linkto ){
		$parsed_url = parse_url($linkto);
		$tmp_page_info_by_id = null;
		if( $this->site() !== false ){
			$tmp_page_info_by_id = $this->site()->get_page_info_by_id($linkto);
			if( !$tmp_page_info_by_id ){
				$tmp_page_info_by_id = $this->site()->get_page_info_by_id(@$parsed_url['path']);
			}
		}
		$path = $linkto;
		$path_type = false;
		$path_type = $this->get_path_type( $linkto );
		if(
			is_array($tmp_page_info_by_id) && array_key_exists('id', $tmp_page_info_by_id) && 
			(@$tmp_page_info_by_id['id'] == $linkto || @$tmp_page_info_by_id['id'] == @$parsed_url['path'])
		){
			$path = @$tmp_page_info_by_id['path'];
			$path_type = $this->get_path_type( $path );
		}
		unset($tmp_page_info_by_id);

		if( preg_match( '/^alias[0-9]*\:(.+)/' , $path , $tmp_matched ) ){
			//  エイリアスを解決
			$path = $tmp_matched[1];
		}elseif( $path_type == 'dynamic' ){
			//  ダイナミックパスをバインド
			// $sitemap_dynamic_path = $this->site()->get_dynamic_path_info( $linkto );
			// $tmp_path = $sitemap_dynamic_path['path_original'];
			$tmp_path = $path;
			$path = '';
			while( 1 ){
				if( !preg_match( '/^(.*?)\{(\$|\*)([a-zA-Z0-9\_\-]*)\}(.*)$/s' , $tmp_path , $tmp_matched ) ){
					$path .= $tmp_path;
					break;
				}
				$path .= $tmp_matched[1];
				if(!strlen($tmp_matched[3])){
					//無名のパラメータはバインドしない。
				}elseif( !is_null( $this->req()->get_path_param($tmp_matched[3]) ) ){
					$path .= $this->req()->get_path_param($tmp_matched[3]);
				}else{
					$path .= $tmp_matched[3];
				}
				$tmp_path = $tmp_matched[4];
				continue;
			}
			unset($tmp_path , $tmp_matched);
		}

		$tmp_path = $this->fs()->normalize_path($path);
		$path_type = $this->get_path_type( $tmp_path );
		switch( $path_type ){
			case 'full_url':
			case 'data':
			case 'javascript':
			case 'anchor':
				break;
			default:
				// apply normalize_path()
				$path = $tmp_path;

				// index.htmlを省略
				$path = preg_replace('/\/'.$this->get_directory_index_preg_pattern().'((?:\?|\#).*)?$/si','/$1',$path);
				if( preg_match( '/^\\//' , $path ) ){
					//  スラッシュから始まる絶対パスの場合、
					//  インストールパスを起点としたパスに書き変えて返す。
					// $path = preg_replace( '/^\/+/' , '' , $path );
					$path = preg_replace('/\/$/', '', $this->get_path_controot()).$path;
				}
				$parsed_url_fin = parse_url($path);
				$path = $this->fs()->normalize_path( $parsed_url_fin['path'] );

				// パラメータを、引数の生の状態に戻す。
				if( array_key_exists('query', $parsed_url) && strlen($parsed_url['query']) ){
					$path .= '?'.$parsed_url['query'];
				}elseif( array_key_exists('query', $parsed_url_fin) && strlen(@$parsed_url_fin['query']) ){
					$path .= '?'.@$parsed_url_fin['query'];
				}
				if( array_key_exists('fragment', $parsed_url) && strlen($parsed_url['fragment']) ){
					$path .= '#'.$parsed_url['fragment'];
				}elseif( array_key_exists('fragment', $parsed_url_fin) && strlen(@$parsed_url_fin['fragment']) ){
					$path .= '#'.@$parsed_url_fin['fragment'];
				}
				break;
		}

		return $path;
	}
public function href( $linkto ){
		$parsed_url = parse_url($linkto);
		$tmp_page_info_by_id = null;
		if( $this->site() !== false ){
			$tmp_page_info_by_id = $this->site()->get_page_info_by_id($linkto);
			if( !$tmp_page_info_by_id ){
				$tmp_page_info_by_id = $this->site()->get_page_info_by_id(@$parsed_url['path']);
			}
		}
		$path = $linkto;
		$path_type = false;
		$path_type = $this->get_path_type( $linkto );
		if(
			is_array($tmp_page_info_by_id) && array_key_exists('id', $tmp_page_info_by_id) && 
			(@$tmp_page_info_by_id['id'] == $linkto || @$tmp_page_info_by_id['id'] == @$parsed_url['path'])
		){
			$path = @$tmp_page_info_by_id['path'];
			$path_type = $this->get_path_type( $path );
		}
		unset($tmp_page_info_by_id);

		if( preg_match( '/^alias[0-9]*\:(.+)/' , $path , $tmp_matched ) ){
			//  エイリアスを解決
			$path = $tmp_matched[1];
		}elseif( $path_type == 'dynamic' ){
			//  ダイナミックパスをバインド
			// $sitemap_dynamic_path = $this->site()->get_dynamic_path_info( $linkto );
			// $tmp_path = $sitemap_dynamic_path['path_original'];
			$tmp_path = $path;
			$path = '';
			while( 1 ){
				if( !preg_match( '/^(.*?)\{(\$|\*)([a-zA-Z0-9\_\-]*)\}(.*)$/s' , $tmp_path , $tmp_matched ) ){
					$path .= $tmp_path;
					break;
				}
				$path .= $tmp_matched[1];
				if(!strlen($tmp_matched[3])){
					//無名のパラメータはバインドしない。
				}elseif( !is_null( $this->req()->get_path_param($tmp_matched[3]) ) ){
					$path .= $this->req()->get_path_param($tmp_matched[3]);
				}else{
					$path .= $tmp_matched[3];
				}
				$tmp_path = $tmp_matched[4];
				continue;
			}
			unset($tmp_path , $tmp_matched);
		}

		$tmp_path = $this->fs()->normalize_path($path);
		$path_type = $this->get_path_type( $tmp_path );
		switch( $path_type ){
			case 'full_url':
			case 'data':
			case 'javascript':
			case 'anchor':
				break;
			default:
				// apply normalize_path()
				$path = $tmp_path;

				// index.htmlを省略
				$path = preg_replace('/\/'.$this->get_directory_index_preg_pattern().'((?:\?|\#).*)?$/si','/$1',$path);
				if( preg_match( '/^\\//' , $path ) ){
					//  スラッシュから始まる絶対パスの場合、
					//  インストールパスを起点としたパスに書き変えて返す。
					// $path = preg_replace( '/^\/+/' , '' , $path );
					$path = preg_replace('/\/$/', '', $this->get_path_controot()).$path;
				}
				$parsed_url_fin = parse_url($path);
				$path = $this->fs()->normalize_path( $parsed_url_fin['path'] );

				// パラメータを、引数の生の状態に戻す。
				if( array_key_exists('query', $parsed_url) && strlen($parsed_url['query']) ){
					$path .= '?'.$parsed_url['query'];
				}elseif( array_key_exists('query', $parsed_url_fin) && strlen(@$parsed_url_fin['query']) ){
					$path .= '?'.@$parsed_url_fin['query'];
				}
				if( array_key_exists('fragment', $parsed_url) && strlen($parsed_url['fragment']) ){
					$path .= '#'.$parsed_url['fragment'];
				}elseif( array_key_exists('fragment', $parsed_url_fin) && strlen(@$parsed_url_fin['fragment']) ){
					$path .= '#'.@$parsed_url_fin['fragment'];
				}
				break;
		}

		return $path;
	}
リンク先のパスを生成する。

引数には、リンク先のパス、またはページIDを受け取り、
完成されたリンク先情報(aタグのhref属性にそのまま適用できる状態)にして返します。

Pickles Framework がドキュメントルート直下にインストールされていない場合、インストールパスを追加した値を返します。

`http://` などスキーマから始まる情報を受け取ることもできます。

実装例：
<pre>&lt;?php
// パスを指定する例
print '&lt;a href=&quot;'.htmlspecialchars( $px-&gt;href('/aaa/bbb.html') ).'&quot;&gt;リンク&lt;/a&gt;';

// ページIDを指定する例
print '&lt;a href=&quot;'.htmlspecialchars( $px-&gt;href('A-00') ).'&quot;&gt;リンク&lt;/a&gt;';
?&gt;</pre>

インストールパスがドキュメントルートではない場合の例:
<pre>&lt;?php
// インストールパスが &quot;/installpath/&quot; の場合
print '&lt;a href=&quot;'.htmlspecialchars( $px-&gt;href('/aaa/bbb.html') ).'&quot;&gt;リンク&lt;/a&gt;';
// &quot;/installpath/aaa/bbb.html&quot; が返されます。
?&gt;</pre>

@param string $linkto リンク先の パス または ページID

@return string href属性値