DOMモジュールを使ってみる

ベタ書きだろうがEthnaだろうがHTMLの世界から離れられないのはWebアプリの宿命。

echo "<span id=\"foo_mesg\" class=\"{$classes}\">{$message}</span>";

とかやってられないコードを多数書く羽目になるので、JavaScript風のcreateElementで作成できたらいいのに、と思って関数を書いてみた。

$html=
   getDomHtml('span',array(
           'class' => $classes,
           'id' => 'foo_mesg',
       ),
       $message
   );

これでおっけー!

/**
 * getDomHtml
 * 
 * DOM XMLモジュールを利用してタグHTMLを返す
 * 
 * @param   string  $tagName    作成するタグ
 * @param   array   $attribute  タグの属性のハッシュ配列
 * @param   array   $nodes      タグに含むノード
 *           string  $nodes      文字列だった場合はテキストノードとする
 */
function getDomHtml($tagName, $attribute=array(), $nodes=null){
    if (!function_exists('domxml_new_doc')){
        die('getDomHtml() Error : phpcoreにDOMモジュールが必要です。');
    }

    $doc=domxml_new_doc('1.0');
    $elem=$doc->create_element($tagName);
    
    /* 内包ノードの処理 */
    if(is_array($nodes)){
        foreach($nodes as $node ){
            $elem->append_child($node);
        }     
    } else {
        $innerNode = $doc->create_text_node($nodes);
        $elem->append_child($innerNode);
    }
    
    /* attributeの設定 */
    foreach($attribute as $attr=>$value){
        $elem->set_attribute($attr,$value); 
    }
    $doc->append_child($elem);
    return $doc->dump_node($elem);
}

PHPのDOM周りはバージョンで挙動違うっぽいとか、そもそもモジュールが入ってるかどうか、とか問題がありますが
動くところでは便利な感じ。

smarty_function_*系書くのにすごいシンプルになって正直感動した。(自画自賛