2011-06-04 13 views
7

Tengo varias funciones en una clase que devuelve saveHTML(). Después de repetir más de una función en la clase saveHTML(), repite parte del HTML. Inicialmente resolví esto haciendo saveHTML ($ node) pero eso no parece ser una opción ahora.

No sabía saveHTML ($ domnode) solo estaba disponible en PHP 5.3.6 y no tengo control sobre el servidor al que subí los archivos, así que ahora tengo que hacerlo compatible con PHP 5.2.

Por razones de simplicidad y sólo para mostrar mi problema que es similar a esto:

<?php 

class HTML 
{ 
    private $dom; 

    function __construct($dom) 
    { 
     $this->dom = $dom; 
    } 

    public function create_paragraph() 
    { 
     $p = $this->dom->createElement('p','Text 1.'); 

      $this->dom->appendChild($p); 

     return $this->dom->saveHTML(); 
    } 

    public function create_paragraph2() 
    { 
     $p = $this->dom->createElement('p','Text 2.'); 

      $this->dom->appendChild($p); 

     return $this->dom->saveHTML(); 
    } 
} 

$dom = new DOMDocument; 
$html = new HTML($dom); 

?> 
<html> 
<body> 
<?php 

echo $html->create_paragraph(); 

echo $html->create_paragraph2(); 

?> 
</body> 
</html> 

Salidas:

<html> 
<body> 
<p>Text 1.</p> 
<p>Text 1.</p><p>Text 2.</p> 
</body> 

Tengo una idea por qué está sucediendo, pero no tengo ni idea cómo no hacer que se repita sin guardarHTML ($ domnode). ¿Cómo puedo hacer que funcione correctamente con PHP 5.2?

He aquí un ejemplo de lo que quiero ser capaz de hacer:

http://codepad.viper-7.com/o61DdJ

+1

sobre la base de su ejemplo, 'DOMDocument' puede ser una herramienta incorrecta para el j transmisión exterior. Si quieres resultados validados, puedes usar XMLWriter. XMLWriter está disponible en 5.2. Ver http://www.php.net/manual/en/book.xmlwriter.php – jmz

Respuesta

10

Lo que sí, es simplemente guardar el nodo como XML. Hay algunas diferencias en la sintaxis, pero es suficientemente bueno para la mayoría de usos:

return $dom->saveXml($node); 
+0

Justo lo que necesitaba. Gracias :) – Tek

+0

Tenga en cuenta que en algunos casos es posible que necesite agregar el indicador LIBXML_NOEMPTYTAG: '$ dom-> saveXml ($ node, LIBXML_NOEMPTYTAG)' – SingLow

0

Tienes return $this->dom->saveHTML(); dos veces en su clase (por lo que yo sé que no tiene que volverla dentro de la clase en cualquier lugar a menos que sea una función privada.

Si se toma return $this->dom->saveHTML(); de createparagraph() lo hará echo sin regresar. es una cosa DOM por lo que yo sé, pero soy nuevo en esto como tú.

Cuestiones relacionadas