symfony, de campos XML en la BD a inputs en formulario

¡Saludos a todo el foro!, Tengo información muy diversa en un campo de texto en la BD en formato XML. Quisiera construir un formulario con dicha información.

¿Cual sería a vuestro entender, la manera más correcta de hacer esto?

¿Quizás haciendo uso de transformadores y campos personalizados?

Gracias

Respuestas

#1

Hola, espero ayudar a alguien con la solución que he encontrado.

En el código que define la entidad: content.php

<?php
namespace AppBundle\Entity;
 
use AppBundle\Entity\Image;
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity
 * @ORM\Table(name="contents")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ContentRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Content{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * */
    protected $id;
...
 
    /**
     * @ORM\Column(type="text",options={"default"="","comment":"xml"})
     */
    protected $content;
 
    /*
     * Campos almacenados en estructura xml dentro del campo de texto content
     */
    protected $xmlContent;
    protected $title='';
    protected $linkMain='';
    protected $description='';
    protected $text=''
    protected $images;
 
    public function __construct() {
...
        $this->images = new ArrayCollection();
...
    }
...
 
    public function getImages(){
        return $this->images;
    }
    public function setImages($images){
        $this->images = new ArrayCollection();
        foreach ($images as $image){
            $this->images[] = $image;
        }
...
    /**
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function contentToXML(){
        $content =  '<content>'.
                        '<article lang="es">'.
                            '<title>'.$this->title.'</title>'.
                            ($this->linkMain==''?'':('<link_main>'.$this->linkMain.'</link_main>')).
                            ($this->description==''?'':('<description><![CDATA['.$this->description.']]></description>')).
                            ($this->text==''?'':('<text><![CDATA['.$this->text.']]></text>')).
                        '</article>';
        if($this->images->count()>0){
            $content.='<images>';
            foreach ($this->images as $image){
                $content.=  '<image'.($image->getMain()=='1'?' main="1"':'').'>'.
                                '<url>'.$image->getUrl().'</url>'.
                                '<alt lang="es">'.$image->getAlt().'</alt>'.
                            '</image>';
            }
            $content.='</images>';
        }
        $content.='</content>';
        $this->content = $content;
    }
 
    /**
     * @ORM\PostLoad
     */
    public function XMLtoContent(){
        $this->xmlContent = simplexml_load_string($this->content);
        $this->title = $this->xmlContent->article->title;
        $this->linkMain = $this->xmlContent->article->link_main;
        $this->description = $this->xmlContent->article->description;
        $this->text = $this->xmlContent->article->text;
        $this->images = new ArrayCollection;
        if($this->xmlContent->images){
            foreach ($this->xmlContent->images->image as $image){
                $oImage = new Image((boolean)$image['main'],(string)$image->url,(string)$image->alt);
                $this->images[] = $oImage;
                if($oImage->getMain()) $this->mainImage = $oImage;
            }
        }
    }