Author Topic: ( SOLUCIONADO ) Convertir cadena html a DOMNode  (Read 2395 times)

remizero

  • Jr. Member
  • **
  • Posts: 66
  • Karma: 0
    • View Profile
    • Blog personal de programación y linux
( SOLUCIONADO ) Convertir cadena html a DOMNode
« on: Marzo 28, 2012, 03:00:11 am »
Buenas amigos del foro.

Esta vez vengo con el siguiente problema.

Tengo que crear una página desde cero con DomDocument y eso hasta ahora me lo hace a la perfección, el problema se me presenta cuando intento añadir una cadena html que traigo de una consulta a la bd.

Esta es la función que estoy utilizando:
Code: [Select]
public function etiqueta ( $etiqueta, $id = null, $clase = null, $contenido = null ) {

        $capa = $this->documento->createElement ( $etiqueta, '' );
        if ( $id != null ) {
            $capa->setAttribute ( 'id', $id );
        }
        if ( $clase != null ) {
            $capa->setAttribute ( 'class', $clase );
        }
        $capa->appendChild ( $contenido );//AQUÍ ME DA EL ERROR
        $this->body->appendChild ( $capa );
    }

Y así la llamo:
Code: [Select]
$plantilla = new Plantilla ();

$htmlConsulta = $la_consulta_a_la_base_de_datos;

$objDom->etiqueta ( $plantilla->etiquetaArticulo, $plantilla->idArticulo, $plantilla->claseArticulo, $htmlConsulta );

El detalle está en que la consulta me devuelve lo siguiente:
Code: [Select]
<p>el texto del párrafo</p>
<p>otro párrafo</p>

Pero cuando intento incluirla como un hijo de la etiqueta que estoy creando me devuelve el siguiente error:
Code: [Select]
Catchable fatal error: Argument 1 passed to DOMNode::appendChild() must be an instance of DOMNode, boolean given

Mi pregunta es, ¿Como puedo hacer para convertir esa consulta html en DOMNode para poder añadirla en la etiqueta que estoy creando?

He intentado convertir lo que devuelve la consulta a DOMNode pero no consigo como.

Espero se entienda mi problema, si necesitan una mejor explicación no duden en decírmelo.

De antemano muchas gracias.
« Last Edit: Marzo 28, 2012, 10:50:35 am by remizero »
Si quieres ver cambios, comienza por cambiar tu primero
http://www.remizero.blogspot.com/
http://www.ecosoftware.com.ve/

manix

  • Sr. Member
  • ****
  • Posts: 361
  • Karma: 0
    • View Profile
Re: Convertir cadena html a DOMNode
« Reply #1 on: Marzo 28, 2012, 04:39:02 am »
Hola,


Intenta hacer la estructura primero agregando el elemento sin los datos de la db.
Luego le asignas el texto/html de la db a este elemento una vez incluido en la página.

remizero

  • Jr. Member
  • **
  • Posts: 66
  • Karma: 0
    • View Profile
    • Blog personal de programación y linux
Re: Convertir cadena html a DOMNode
« Reply #2 on: Marzo 28, 2012, 10:50:11 am »
Gracias por tu respuesta manix.

Analizando un poco lo que me dijiste, lo hice y lo logré, pero la verdad se me estaba poniendo muy engorroso porque practicamente tenia que hacer un parseo de todas las etiquetas html, cosa que de verdad veo un poco costosa.

Al final, conseguí esta forma de resolver el problema, convertir toda la consulta en xml de la siguiente forma:
Code: [Select]
public function cargarContenido ( $contenido ) {

        $xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<html>
$contenido
</html>
XML;
        $fragmento = new DOMDocument ();
        $fragmento->loadXML ( $xml );
        return $fragmento->firstChild->childNodes;
    }

Donde $contenido es la consulta, la convierto a xml y luego con DOMDocument la cargo y obtengo la lista de nodos.

y luego en la función etiqueta hago lo siguiente:
Code: [Select]
public function etiqueta ( $etiqueta, $id = null, $clase = null, $contenido = null ) {

        $capa = $this->documento->createElement ( $etiqueta, '' );
        if ( $id != null ) {
            $capa->setAttribute ( 'id', $id );
        }
        if ( $clase != null ) {
            $capa->setAttribute ( 'class', $clase );
        }
        foreach ( $this->cargarContenido ( $contenido ) as $nodo ) {
            $capa->appendChild ( $this->documento->importNode ( $nodo, true ) );
        }
        $this->body->appendChild ( $capa );
    }

El problema se me presentaba porque no estaba haciendo el xml bien formado y por eso el error.

Muchas gracias por tu respuesta que me llevo a la solución.

Hasta una próxima :).
Si quieres ver cambios, comienza por cambiar tu primero
http://www.remizero.blogspot.com/
http://www.ecosoftware.com.ve/

 

ey