Php bir DOMElement-> tagName özelliğini değiştirmek için daha iyi bir yolu var mı?

1 Cevap php

Ben sadece bu binaya sadece bütün belge sonlandırmadan önce (sırayla DOMElement devraldığı) ServerTag devraldığı her şeyi PreRender çağrı benim MVC çerçevesinde, bir metin kutusu denetimi koştu.

I DOMElement türetilmiş nesnenin tagName değiştirmek için bulduk tek yolu eski bir senkronize tüm özelliklere sahip bir yenisi ile değiştirmektir.

Bu, bu kodu nasıl görünüyor:

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;
    }
}

Gerçekten bunu yapmak için tek yolu var mı? Bu şekilde kontrol arkasında mantığı battal daha çok istenmeyen yan etkiye sahiptir.

1 Cevap

Evet, bu bunu yapmak zorunda nasıl - neden sadece tek bir öznitelik (tagName), aslında başka bir türü tüm eleman değişen konum ve değerini değiştirerek değiliz olduğunu . Böyle tagName (veya nodeName) ve nodeType gibi özellikler DOM salt okunur ve öğe oluşturduğunuzda ayarlanır.

Yani, yeni bir öğe oluşturma ve birlikte yapıyoruz tam olarak eskisinin yerine hareket DOMNode::replaceChild, doğru bir işlemdir.

Sana "denetimin arkasındaki tüm mantığı battal istenmeyen yan etki" ile ne demek emin değilim - sen açıklamak varsa sana rehberlik orada vermek mümkün olabilir.

Eğer ServerTag DOMElement devralan ve bunun yerine (yani bir ServerTag yerine DOMElement "bir" bir DOMElement "bir olan" yani), kompozisyon gibi diğer bazı desen aracılığıyla bu iki nesneleri bağlamak isteyebilirsiniz olmasını istemiyor gibi geliyor bu yüzden Eğer sadece ServerTag Textbox nesnesi ile ilişkilendirilmiş DOMElement nesnesi yerine konum.

Ya da daha uzun-shot tahminim sadece rows ve cols gibi özelliklerini (yani textarea gerektirmiştir nitelikler, o {[kopyalama sorunları haline çalışıyor olabilir edilir (3)]}) değil.