2001年くらいにPHPでJavaカスタムタグのようなものを実装したのを発掘したので放流。
PHPでJavaのカスタムタグっぽいものを実装した2001年 · GitHub
メーリングリストでやりとりをしてたときに
「できらぁ!PHPでJavaカスタムタグの実装できらぁ!」
「え、PHPでJavaカスタムタグを?」
ってなって、一晩でがーっと作った記憶。
自分だけしか使わない前提で、%var%で変数が埋め込まれる程度のものを作ったのだけど、1年くらい実プロジェクトで使っていた。
600行くらいでコンパクト。
当時は元気があったんだな。
PHP4の時代で、テンプレートエンジンもなかったというかPHP自体がテンプレートエンジンというイメージで まだテンプレートエンジン需要も あまりなかったんじゃないかと。
SynfonyやZend Frameworkもまだ出ていなかった。
こんな感じのテンプレートを書く。
<php:switch condition="%user_type%"> <php:case value="2"> <h1>提案書一覧</h1> </php:case> </php:switch> <pg:exec result="rtn"> <pg:title field="youki_type_cd"> <b><pg:result field="youki_type_nm">種類</pg:result></b><br> <ul> </pg:title> <pg:aif href="teian.php?teian=" field="teian_cd"><pg:result field="teian_nm">提案書名</pg:result></pg:aif><br> <pg:total field="youki_type_cd"> </ul> </pg:total> </pg:exec>
そうするとこんなPHPが生成されて、あとはそのままこれを実行する。
そういう動きもJSPのカスタムタグと同じ。
勢いで書いたわりにはよくできてるな。
<?//switch if (!isset($__phptag_switch_1)) $__phptag_switch_1 = new SwitchTag; $__phptag_switch_1->parenttag = null; ob_start(); ?><?=$user_type?><?$__phptag_switch_1->attr["condition"] = ob_get_contents(); ob_end_clean(); if ($__phptag_switch_1->doStartTag() == TAG_BODY_INCLUDE){ ob_start(); ?> <?//case if (!isset($__phptag_case_2)) $__phptag_case_2 = new CaseTag; $__phptag_case_2->parenttag = &$__phptag_switch_1; $__phptag_case_2->attr["value"] = "2"; if ($__phptag_case_2->doStartTag() == TAG_BODY_INCLUDE){ ob_start(); ?> <h1>提案書一覧</h1> <? $page_content = ob_get_contents(); ob_end_clean(); echo $page_content; } $__phptag_case_2->doEndTag(); ?> <? $page_content = ob_get_contents(); ob_end_clean(); echo $page_content; } $__phptag_switch_1->doEndTag(); ?> <?//exec if (!isset($__phptag_exec_3)) $__phptag_exec_3 = new PgExecTag; $__phptag_exec_3->parenttag = null; $__phptag_exec_3->attr["result"] = "rtn"; if ($__phptag_exec_3->doStartTag() == TAG_BODY_INCLUDE){ $__phptag_exec_3->doInitBody(); while(true){ if ($__phptag_exec_3->doBeginBody() == TAG_SKIP_BODY) break; ob_start(); ?> <?//title if (!isset($__phptag_title_4)) $__phptag_title_4 = new PgResultTitleTag; $__phptag_title_4->parenttag = &$__phptag_exec_3; $__phptag_title_4->attr["field"] = "youki_type_cd"; if ($__phptag_title_4->doStartTag() == TAG_BODY_INCLUDE){ ob_start(); ?> <b><?//result if (!isset($__phptag_result_5)) $__phptag_result_5 = new PgResultTag; $__phptag_result_5->parenttag = &$__phptag_title_4; $__phptag_result_5->attr["field"] = "youki_type_nm"; if ($__phptag_result_5->doStartTag() == TAG_BODY_INCLUDE){ ob_start(); ?>種類<? $page_content = ob_get_contents(); ob_end_clean(); echo $page_content; } $__phptag_result_5->doEndTag(); ?></b><br> <ul> <? $page_content = ob_get_contents(); ob_end_clean(); echo $page_content; } $__phptag_title_4->doEndTag(); ?> <?//aif if (!isset($__phptag_aif_6)) $__phptag_aif_6 = new PgResultIfLinkTag; $__phptag_aif_6->parenttag = &$__phptag_exec_3; $__phptag_aif_6->attr["href"] = "teian.php?teian="; $__phptag_aif_6->attr["field"] = "teian_cd"; if ($__phptag_aif_6->doStartTag() == TAG_BODY_INCLUDE){ ob_start(); ?><?//result if (!isset($__phptag_result_7)) $__phptag_result_7 = new PgResultTag; $__phptag_result_7->parenttag = &$__phptag_aif_6; $__phptag_result_7->attr["field"] = "teian_nm"; if ($__phptag_result_7->doStartTag() == TAG_BODY_INCLUDE){ ob_start(); ?>提案書名<? $page_content = ob_get_contents(); ob_end_clean(); echo $page_content; } $__phptag_result_7->doEndTag(); ?><? $page_content = ob_get_contents(); ob_end_clean(); echo $page_content; } $__phptag_aif_6->doEndTag(); ?><br> <?//total if (!isset($__phptag_total_8)) $__phptag_total_8 = new PgResultTotalTag; $__phptag_total_8->parenttag = &$__phptag_exec_3; $__phptag_total_8->attr["field"] = "type_cd"; if ($__phptag_total_8->doStartTag() == TAG_BODY_INCLUDE){ $__phptag_total_8->doInitBody(); while(true){ if ($__phptag_total_8->doBeginBody() == TAG_SKIP_BODY) break; ob_start(); ?> </ul> <? $page_content = ob_get_contents(); ob_end_clean(); if ($__phptag_total_8->doAfterBody($page_content) != TAG_BODY_AGAIN) break; } } $__phptag_total_8->doEndTag(); ?> <? $page_content = ob_get_contents(); ob_end_clean(); if ($__phptag_exec_3->doAfterBody($page_content) != TAG_BODY_AGAIN) break; } } $__phptag_exec_3->doEndTag(); ?>