SOY2HTMLで繰り返し表示 - HTMLList編で繰り返し表示に限らず、各所でリンクを生成したい。

例えば、上のキャプチャのように各ページの詳細ページへのリンクを出力したい場合、

PHPでリンクのパスを組み立てて、そのパスをaタグのhref属性に挿入して出力しなければならない。


ここで便利なのがHTMLLinkクラスで、

$this->createAdd("detail_link", "HTMLLink", array(
	"text" => "詳細",
	"link" => SOY2PageController::createLink("Site.Pages.Detail." . $entity->getId())
));

このようにaタグで挟まれた箇所に表示するためのtextの値と、aタグのhref属性の指定のためのlinkの値がある。


いつものように短縮形を書いておくと、

$this->addLink("detail_link", array(
	"text" => "編集",
	"link" => SOY2PageController::createLink("Site.Pages.Detail." . $entity->getId())
));

このようになる。


HTML側では、<a soy:id="detail_link"></a>を追加すると、

<a href="/cms/soyshop/index.php/Site/Pages/Detail/1">編集</a>

上記のようにリンクを生成します。


第二引数の配列内のlinkの値の指定の際に、

SOY2PageController::createLink()という処理があるけれども、

管理画面で/cms/soyshop/index.php/に続くパスをドット区切りで指定すると、環境に合わせて管理画面用のURLを返します。


これで管理画面を作るためのタグは代替揃っただろうか。




余談

HTMLActionLinkというクラスがあります。

これはHTMLLinkと使用方法はほぼ一緒なのですが、

href属性に対応するlinkの値の末尾にsoy2_tokenをGETパラメータの形で付与します。


soy2_check_tokenと合わせて、管理画面内でURL直打ちを避けたい時に利用します。

※必ずどこかしらのリンクをクリックしてから遷移する必要がある場合に有効

SOY2HTMLでセキュアなフォームを設置する - HTMLForm編




最後に

/common/lib/soy2_build.phpを開きclass HTMLLinkでテキスト検索して

該当するクラスを読んでみる。


/**
 * @package SOY2.SOY2HTML
 */
class HTMLLink extends HTMLLabel{
	var $tag = "a";
	const SOY_TYPE = SOY2HTML::HTML_BODY;
	var $link;
	var $target;
		function getStartTag(){
		return '<?php if(strlen($'.$this->getPageParam().'["'.$this->getId().'_attribute"]["href"])>0){ ?>' .
			parent::getStartTag() .
			'<?php } ?>';
	}
	function getEndTag(){
		return '<?php if(strlen($'.$this->getPageParam().'["'.$this->getId().'_attribute"]["href"])>0){ ?>' .
			parent::getEndTag() .
			'<?php } ?>';
	}
	function setLink($link){
		$this->link = $link;
	}
	function setTarget($target){
		$this->target = $target;
	}
	function execute(){
		if(!is_null($this->text)){
			parent::execute();
		}
		$suffix = $this->getAttribute($this->_soy2_prefix . ":suffix");
		if($suffix){
			$this->link .= $suffix;
		}
		$this->setAttribute("href",$this->link);
		if(strlen($this->target)){
			$this->setAttribute("target",$this->target);
		}elseif(isset($this->target)){
			$this->clearAttribute("target");
		}
	}
	function getObject(){
		if(!is_null($this->text)){
			return parent::getObject();
		}
		return $this->link;
	}
}
/**
 * @package SOY2.SOY2HTML
 *
 * @see function soy2_get_token
 */
class HTMLActionLink extends HTMLLink{
	function execute(){
		if(!is_null($this->text)){
			HTMLLabel::execute();
		}
		$link = $this->link;
		if(strpos($link,"?")===false){
			$link .= "?";
		}else{
			$link .= "&";
		}
		$link .= "soy2_token=" . soy2_get_token();
		$this->setAttribute("href",$link);
	}
}