Ich lief gerade in diese Gebäude ein Textbox-Steuerelement für meine MVC-Framework, wo kurz vor Abschluss des gesamten Dokuments ich PreRender auf alles aufrufen, die von ServerTag erbt (die wiederum von DOMElement erbt).
Die einzige Möglichkeit, die ich gefunden habe, um ein DOMElement abgeleitete Objekt TagName zu ändern ist, um es mit einem neuen mit allen Attributen synchronisiert, um die alte zu ersetzen.
So sieht das im Code aus:
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;
}
}
Ist das wirklich die einzige Möglichkeit? Dieser Weg hat den eher unerwünschten Nebeneffekt, dass die gesamte Logik hinter dem Steuerelement aufgehoben wird.