¡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
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; } } }
@espantaperros_
25 octubre 2017, 5:49