MVCフレームワーク用のTextboxコントロールを構築しているところに出くわしました。ドキュメント全体を完成させる直前に、ServerTagから継承する(DOMElementから継承する)すべてに対してPreRenderを呼び出します。
DOMElement派生オブジェクトのtagNameを変更する唯一の方法は、すべての属性が古いものと同期された新しいオブジェクトに置き換えることです。
これはコードでどのように見えるかです:
protected function PreRenderTextarea( WebPage $sender )
{
$textarea = $sender->createElement( 'textarea' );
foreach( $this->attributes as $attribute )
{
if ( $attribute->name == 'value' )
{
$textarea->nodeValue = $attribute->value;
}
else
{
$textarea->setAttribute( $attribute->name, $attribute->value );
}
}
$this->parentNode->replaceChild( $textarea, $this );
}
public function OnPreRender( WebPage $sender )
{
parent::OnPreRender();
$this->setAttribute( 'value', $this->Value );
switch( $this->Mode )
{
case 'normal' :
$this->setAttribute( 'type', 'text' );
break;
case 'password' :
$this->setAttribute( 'type', 'password' );
break;
case 'multiline' :
$this->PreRenderTextarea( $sender );
return;
break;
}
}
それは本当にそれをする唯一の方法ですか?この方法には、コントロールの背後にあるすべてのロジックを無効にするという、かなり望ましくない副作用があります。