Markup

Html (HTML 出力専用クラス)

Author : trashtoy

Table of Contents

概要

Html は HTML の出力に特化したユーティリティクラスです. このクラスは HTML 出力専用の Helper オブジェクトをクラス変数として保持しています. 各クラスメソッドではその Helper オブジェクトを使って HTML コードを出力します. (この Helper オブジェクトのことを以下「グローバル Helper」と呼びます)

基本的な使い方

tag

このクラスで最も使用頻度の高いメソッドは tag() です. tag() は引数に要素名を取り, 指定された要素を HelperObject として返すメソッドです. HelperObject クラスの詳細については Helper / HelperObject を参照してください.

以下に tag() を用いたサンプルコードを掲載します.

  1.     ->attr("class""sample")
  2.     ->append(Peach_Markup_Html::tag("span")->append("This is test"))
  3.     ->append(Peach_Markup_Html::tag("br"))
  4.     ->append("This is a sample text.")
  5.     ->append(Peach_Markup_Html::tag("img"array("src" => "test.jpg""alt" => "")))
  6.     ->write();
  7. /*
  8. Output:
  9. <p class="sample">
  10.     <span>This is test</span>
  11.     <br>
  12.     This is a sample text.
  13.     <img src="test.jpg" alt="">
  14. </p>
  15.  */

以下のように tag() の第 2 引数に配列を指定することで, 属性をセットすることも出来ます.

  1. $p Peach_Markup_Html::tag("p"array("class" => "sample"))->append("Sample text");
  2. echo $p->write()// Output: <p class="sample">Sample text</p>

書式のカスタマイズ

デフォルトでは HTML 形式でコードを出力しますが, XHTML 形式で出力したい場合には, 以下のように引数に true を指定して init() メソッドを実行してください. これによりグローバル Helper が XHTML 用に初期化されます.

  1.     ->attr("class""sample")
  2.     ->append(Peach_Markup_Html::tag("span")->append("This is test"))
  3.     ->append(Peach_Markup_Html::tag("br"))
  4.     ->append("This is a sample text.")
  5.     ->append(Peach_Markup_Html::tag("img"array("src" => "test.jpg""alt" => "")))
  6.     ->write();
  7. /*
  8. Output:
  9. <p class="sample">
  10.     <span>This is test</span>
  11.     <br />
  12.     This is a sample text.
  13.     <img src="test.jpg" alt="" />
  14. </p>
  15.  */

インデントや改行文字など, その他の書式をカスタマイズする場合は getBuilder() を使用してください. 返り値の DefaultBuilder オブジェクトに対して変更を加えることで, このクラスの出力をカスタマイズすることが出来ます.

以下にサンプルコードを掲載します.

  1. $builder Peach_Markup_Html::getBuilder();
  2. $builder->setRenderer("XHTML");
  3. $builder->setIndent(new Peach_Markup_Indent(0"  "Peach_Markup_Indent::LF));
  4.     ->attr("class""sample")
  5.     ->append(Peach_Markup_Html::tag("span")->append("This is test"))
  6.     ->append(Peach_Markup_Html::tag("br"))
  7.     ->append("This is a sample text.")
  8.     ->append(Peach_Markup_Html::tag("img"array("src" => "test.jpg""alt" => "")))
  9.     ->write();
  10. /*
  11. Output:
  12. <p class="sample">
  13.   <span>This is test</span>
  14.   <br />
  15.   This is a sample text.
  16.   <img src="test.jpg" alt="" />
  17. </p>
  18.  */

alias

tag() のような使用頻度の高いクラスメソッドを記述するために, 毎回 "Peach_Markup_Html::tag" というコードを書くのは面倒かもしれません. Html クラスには, 定義されている各種クラスメソッドに対して任意の名前の関数を割り当てる alias() というメソッドがあります. 事前に alias() を実行することで, 各種クラスメソッドを簡潔に記述することが出来ます.

デフォルトの挙動

以下のように引数なしで実行すると "tag" という名前の関数が新たに定義されます. 定義された関数は "Peach_Markup_Html::tag" と全く同じように動作します.

  1. Peach_Markup_Html::alias()// 関数 tag() が生成される
  2. echo tag("p")
  3.     ->attr("class""sample")
  4.     ->append(tag("span")->append("This is test"))
  5.     ->append(tag("br"))
  6.     ->append("This is a sample text.")
  7.     ->append(tag("img"array("src" => "test.jpg""alt" => "")))
  8.     ->write();
  9. /*
  10. Output:
  11. <p class="sample">
  12.     <span>This is test</span>
  13.     <br>
  14.     This is a sample text.
  15.     <img src="test.jpg" alt="">
  16. </p>
  17.  */

注意事項として, Symfony など一部の PHP フレームワークでは, デフォルトで同名のヘルパー関数が定義されている場合があります. 関数名が被ることにより予期せぬエラーが発生する原因となるので, 特定のフレームワークに組み込んだりその他のベンダーの PHP クラスライブラリを導入する場合には, 安易に alias() を使わないようにするか, 後述の方法で被らないような関数名を定義してください.

関数名を指定して別名を定義

alias() の引数にメソッド名と関数名を指定することで, 任意の名前で関数を定義することが出来ます. 以下のサンプルコードでは tag() メソッドに "t" という関数名を割り当てています.

  1. Peach_Markup_Html::alias(array("tag" => "t"))// 関数 t() が生成される
  2. echo t("p")
  3.     ->attr("class""sample")
  4.     ->append(t("span")->append("This is test"))
  5.     ->append(t("br"))
  6.     ->append("This is a sample text.")
  7.     ->append(t("img"array("src" => "test.jpg""alt" => "")))
  8.     ->write();
  9. /*
  10. Output:
  11. <p class="sample">
  12.     <span>This is test</span>
  13.     <br>
  14.     This is a sample text.
  15.     <img src="test.jpg" alt="">
  16. </p>
  17.  */

alias の引数には, キーにメソッド名, 値にそのメソッドの別名となる配列を指定してください. キーとして使える文字列 (メソッド名) は以下の通りです.

以下のように複数の関数を同時に定義することも出来ます.

  1.     "tag"     => "t",
  2.     "comment" => "c",
  3.     "select"  => "s"
  4. ));

select

PHP で動的に HTML コードを出力する際, 特に select 要素はロジックが複雑になりがちです. Html クラスには select 要素を出力するための専用のメソッド select() が用意されています. このメソッドを使うことで select 要素の出力がより直感的に出来るでしょう.

以下に select() メソッドのサンプルコードを掲載します. 1 番目の引数にはデフォルトで選択されている値, 2 番目の引数には選択肢の一覧を配列形式, 3 番目の引数には select 要素にセットする属性を指定してください.

  1. $candidates array(
  2.     "Apple"  => 1,
  3.     "Orange" => 2,
  4.     "Pear"   => 3,
  5.     "Peach"  => 4,
  6. );
  7. echo Peach_Markup_Html::select(4$candidatesarray("name" => "favorite"))->write();
  8. /*
  9. Output:
  10. <select name="favorite">
  11.     <option value="1">Apple</option>
  12.     <option value="2">Orange</option>
  13.     <option value="3">Pear</option>
  14.     <option value="4" selected>Peach</option>
  15. </select>
  16.  */

2 番目の引数を二次元配列にすることで, optgroup を含む select 要素を表現することも出来ます. 以下にサンプルコードを掲載します.

  1. $candidates array(
  2.     "Fruit"   => array(
  3.         "Apple"  => "1",
  4.         "Orange" => "2",
  5.         "Pear"   => "3",
  6.         "Peach"  => "4",
  7.     ),
  8.     "Dessert" => array(
  9.         "Chocolate" => "5",
  10.         "Doughnut"  => "6",
  11.         "Ice cream" => "7",
  12.     ),
  13.     "Others" => "8",
  14. );
  15. echo Peach_Markup_Html::select(4$candidatesarray("name" => "favorite"))->write();
  16. /*
  17. Output:
  18. <select name="favorite">
  19.     <optgroup label="Fruit">
  20.         <option value="1">Apple</option>
  21.         <option value="2">Orange</option>
  22.         <option value="3">Pear</option>
  23.         <option value="4" selected>Peach</option>
  24.     </optgroup>
  25.     <optgroup label="Dessert">
  26.         <option value="5">Chocolate</option>
  27.         <option value="6">Doughnut</option>
  28.         <option value="7">Ice cream</option>
  29.     </optgroup>
  30.     <option value="8">Others</option>
  31. </select>
  32.  */

comment

comment() は文字通りコメントを生成するためのメソッドです. このメソッドは Comment ノードをラップした HelperObject を生成して返します.

以下に comment() メソッドのサンプルコードを掲載します.

  1. echo Peach_Markup_Html::comment("This is test")->write();
  2. // Output: <!--This is test-->

引数に任意のノードを指定するか, または append() で任意のノードを追加することで, そのノードをコメントアウトした状態で出力することができます. 以下に例を挙げます.

  1. $p1      Peach_Markup_Html::tag("p")->append("First text");
  2. $p2      Peach_Markup_Html::tag("p")->append("Second text");
  3. $comment Peach_Markup_Html::comment()->append($p1)->append($p2);
  4. echo $comment->write();
  5. /*
  6. Output:
  7. <!--
  8. <p>First text</p>
  9. <p>Second text</p>
  10. -->
  11.  */

conditionalComment

conditionalComment() は一部のブラウザで実装されている条件付きコメント ("<!--[if lt IE 7]>...<![endif]-->" など) を出力するためのメソッドです.

1 番目の引数にはコメントの条件 ("lt IE 7" など), 2 番目の引数には条件付きコメントの内容を指定してください. 2 番目の引数は省略することも出来ます. 以下に例を挙げます.

  1. $p       Peach_Markup_Html::tag("p")->append("R.I.P. Windows XP 2001 - 2014");
  2. $comment Peach_Markup_Html::conditionalComment("lt IE 7"$p);
  3. echo $comment->write();
  4. /*
  5. Output:
  6. <!--[if lt IE 7]>
  7. <p>R.I.P. Windows XP 2001 - 2014</p>
  8. <![endif]-->
  9.  */