[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/