[PHP-users 2428] Re: PHPでカスタムタグ

naoki kishida php-users@php.gr.jp
Wed, 03 Oct 2001 13:28:51 +0900


きしだです
ためしに作ってみただけのカスタムタグなんですが、面白くなったので、とりあ
えず必要と思われるforeachタグを作っておきました。
tablib.incなんかに追加してください。
あと
  $ct->add_tag("foreach","ForEachtag",true);
をそれらしいところに追加すれば
# [php-users 2484]のならsample.php。[php-users 2407]でDLならtaglib.inc

  <?
  $testarray = array("a"=>"taro","b"=>"hanako","c"=>"yamada");
  ?>

という配列があるとすると

  <php:foreach array="testarray" key="k" value="v">
  <?=$k?>:<?=$v?><br>
  </php:foreach>

という記述でそれっぽい動作をするようになります。
この配列を、サンプルだとsample.phpで値を放り込んでおけば、なんとなくロジッ
クとデザインの分離です。

実行例は
http://www.fk.urban.ne.jp/home/kishida/phptag/sample.html
です。
現時点で
http://www.fk.urban.ne.jp/home/kishida/phptag/customtag.lzh
にはすでに追加してありますが、とりあえず、こういうタグも比較的簡単に追加
できるということで。

あとはお好みで、SQLを発行してレコード数分繰り返すタグとか作ると、それなり
に楽しいかもしれません。
メール送信タグとかもそれなりに面白いのですが、そうやってPHPの関数をすべて
タグにしていくと、別の構文の言語ができあがってしまいます。XMLPHPとか。


//foreach:配列処理
class ForEachTag extends BodyTagSupport
{
	var $arr;
	function doStartTag(){
		//タグの属性を得る
		$a = $this->getAttribute("array");
		if (strlen($a) == 0) return TAG_SKIP_BODY;
		
		//変数を得る
		$this->arr = $this->getPageAttribute($a);
		if (!is_array($this->arr)) return TAG_SKIP_BODY;

		reset($this->arr);
		if (!(list($key,$val) = each($this->arr))) return TAG_SKIP_BODY;
		//value属性で指定された変数に書きこみ
		$valvar = $this->getAttribute("value");
		if (strlen($valvar)) $this->setPageAttribute($valvar,$val);
		//key属性で指定された変数に書きこみ
		$keyvar = $this->getAttribute("key");
		if (strlen($keyvar)) $this->setPageAttribute($keyvar,$key);

		return TAG_BODY_INCLUDE;
	}
	function afterBodyTag($context){
		echo $context;
		if (!(list($key,$val) = each($this->arr))) return TAG_SKIP_BODY;
		$valvar = $this->getAttribute("value");
		if (strlen($valvar)) $this->setPageAttribute($valvar,$val);
		$keyvar = $this->getAttribute("key");
		if (strlen($keyvar)) $this->setPageAttribute($keyvar,$key);
		return TAG_BODY_AGAIN;
	}
}

----
岸田 哉生(きしだ なおき)
	email:kishida@fk.urban.ne.jp
	http://www.fk.urban.ne.jp/home/kishida/