2008-10-26 2 views
3

방금이 건물을 MVC 프레임 워크 용 TextBox 컨트롤에 연결했습니다.이 컨트롤은 전체 문서를 마무리하기 전에 ServerTag에서 상속 한 모든 항목에 대해 PreRender를 호출합니다 (DOMElement에서 상속).PHP에서 DOMElement-> tagName 속성을 변경하는 더 좋은 방법이 있습니까?

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

정말 유일한 방법은 그것을 할인가요? 이 방법은 컨트롤 뒤에 모든 로직을 nulling하는 원치 않는 부작용이 있습니다.

답변

2

네, 어떻게해야합니까? 하나의 속성 (tagName)의 값을 변경하는 것이 아니라 모든 요소를 ​​실제로 한 유형에서 다른 유형으로 변경하기 때문입니다. tagName (또는 nodeName) 및 nodeType과 같은 속성은 DOM에서 읽기 전용이며 요소를 만들 때 설정됩니다.

그래서 새로운 요소를 만들고 정확하게 이전 작업으로 옮기는 것입니다 (DOMNode::replaceChild). 올바른 작업입니다.

"컨트롤 뒤에있는 모든 로직을 null로 만드는 원치 않는 부작용"이 무슨 뜻인지 잘 모르겠습니다. 명확히 해두면 거기에 지침을 제공 할 수 있습니다.

DOMElement에서 ServerTag를 상속 받고 싶지 않고 대신 이러한 두 객체를 composition과 같은 다른 패턴 (예 : ServerTag에 "DOMElement"대신에 " "DOMElement)를 사용하여 ServerTag Textbox 객체와 관련된 DOMElement 객체를 대체하기 만하면됩니다.

또는 더 긴 샷 추측 방금 속성을 복사 문제로 실행 될 수있다 (즉 textareainput하지 않는 것을, rowscols 같은 속성이 필요했다).

+0

그건 내가 생각한 것 같아. 비록 내가 그런 식으로 작동한다고 생각하지 않더라도. – Kris

관련 문제