Ver Mensaje Individual
  #6 (permalink)  
Antiguo 26/02/2012, 09:20
Avatar de masterpuppet
masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Problemas + duda

Luego de instalar todas las dependencias (que son unas cuantas), extender y registrar el bundle tienes que relacionar tus entidades con Sonata\MediaBundle\Entity\Media o Sonata\MediaBundle\Entity\Gallery.

De todas formas te dejo un ejemplo de como podria ser desde cero, va en dos posts porque es medio largo :P, utilizo tu escenario de un post con imagenes, un post va a tener titulo contenido e imagenes, cada imagen va a tener el nombre original de la imagen, fecha de creación y el nombre luego de subir el fichero, la relacion es OneToMany - Bidirectonal, podría ser algo así:

Entities - Post
Código PHP:
Ver original
  1. namespace Acme\DemoBundle\Entity;
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4. use Doctrine\Common\Collections\ArrayCollection;
  5.  
  6. /**
  7.  * Acme\DemoBundle\Entity\Post
  8.  *
  9.  * @ORM\Table(name="post__post")
  10.  * @ORM\Entity
  11.  */
  12. class Post
  13. {
  14.     /**
  15.      * @ORM\Id
  16.      * @ORM\Column(type="integer")
  17.      * @ORM\GeneratedValue(strategy="AUTO")
  18.      */
  19.     protected $id;
  20.  
  21.     /**
  22.      * @var string $title
  23.      *
  24.      * @ORM\Column(name="title", type="string", length=255)
  25.      */
  26.     protected $title;
  27.  
  28.     /**
  29.      * @var string $content
  30.      *
  31.      * @ORM\Column(name="content", type="text")
  32.      */
  33.     protected $content;
  34.  
  35.     /**
  36.      * @var ArrayCollection $images
  37.      *
  38.      * @ORM\OneToMany(targetEntity="Acme\DemoBundle\Entity\PostImage", mappedBy="post", cascade={"all"})
  39.      */
  40.     protected $images;
  41.  
  42.     /**
  43.      * Post constructor
  44.      */
  45.     public function __construct()
  46.     {
  47.         $this->images = new ArrayCollection();
  48.     }
  49.  
  50.     /**
  51.      * Get id
  52.      *
  53.      * @return integer
  54.      */
  55.     public function getId()
  56.     {
  57.         return $this->id;
  58.     }
  59.  
  60.     /**
  61.      * Set title
  62.      *
  63.      * @param string $title
  64.      */
  65.     public function setTitle($title)
  66.     {
  67.         $this->title = $title;
  68.     }
  69.  
  70.     /**
  71.      * Get title
  72.      *
  73.      * @return string
  74.      */
  75.     public function getTitle()
  76.     {
  77.         return $this->title;
  78.     }
  79.  
  80.     /**
  81.      * Set content
  82.      *
  83.      * @param text $content
  84.      */
  85.     public function setContent($content)
  86.     {
  87.         $this->content = $content;
  88.     }
  89.  
  90.     /**
  91.      * Get content
  92.      *
  93.      * @return text
  94.      */
  95.     public function getContent()
  96.     {
  97.         return $this->content;
  98.     }
  99.  
  100.     /**
  101.      * Set images
  102.      *
  103.      * @param array $images
  104.      */
  105.     public function setImages($images)
  106.     {
  107.         foreach($images as $image){
  108.             $image->setPost($this);
  109.         }
  110.         $this->images = $images;
  111.     }
  112.  
  113.     /**
  114.      * Add image
  115.      *
  116.      * @param PostImage $image
  117.      */    
  118.     public function addImage($image)
  119.     {
  120.         $image->setPost($this);
  121.         $this->images[] = $image;
  122.     }
  123.  
  124.     /**
  125.      * Get images
  126.      *
  127.      * @return array
  128.      */
  129.     public function getImages()
  130.     {
  131.         return $this->images;
  132.     }
  133.  
  134. }

Entities - PostImage
Código PHP:
Ver original
  1. namespace Acme\DemoBundle\Entity;
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4.  
  5. /**
  6.  * Acme\DemoBundle\Entity\PostImage
  7.  *
  8.  * @ORM\Table(name="post__image")
  9.  * @ORM\Entity
  10.  * @ORM\HasLifecycleCallbacks
  11.  */
  12. class PostImage
  13. {
  14.     /**
  15.      * @ORM\Id
  16.      * @ORM\Column(type="integer")
  17.      * @ORM\GeneratedValue(strategy="AUTO")
  18.      */
  19.     protected $id;
  20.  
  21.  
  22.     /**
  23.      * @var string $name
  24.      *
  25.      * @ORM\Column(name="name", type="string", length=255)
  26.      */
  27.     protected $name;
  28.  
  29.     /**
  30.      * @var string $path
  31.      *
  32.      * @ORM\Column(name="path", type="string", length=255)
  33.      */
  34.     protected $path;
  35.    
  36.     /**
  37.      * @var Acme\DemoBundle\Entity\Post $post
  38.      *
  39.      * @ORM\ManyToOne(targetEntity="Acme\DemoBundle\Entity\Post", inversedBy="images")
  40.      */
  41.     protected $post;
  42.  
  43.     /**
  44.      * @var DateTime $createdAt
  45.      *
  46.      * @ORM\Column(name="created_at", type="datetime")
  47.      */
  48.     protected $createdAt;
  49.  
  50.     /**
  51.      * @var Symfony\Component\HttpFoundation\File\UploadedFile $file
  52.      */    
  53.     public $file;
  54.  
  55.     /**
  56.      * Get id
  57.      *
  58.      * @return integer
  59.      */
  60.     public function getId()
  61.     {
  62.         return $this->id;
  63.     }
  64.  
  65.     /**
  66.      * Set name
  67.      *
  68.      * @param string $name
  69.      */
  70.     public function setName($name)
  71.     {
  72.         $this->name = $name;
  73.     }
  74.  
  75.     /**
  76.      * Get name
  77.      *
  78.      * @return string
  79.      */
  80.     public function getName()
  81.     {
  82.         return $this->name;
  83.     }
  84.  
  85.     /**
  86.      * Set path
  87.      *
  88.      * @param string $path
  89.      */
  90.     public function setPath($path)
  91.     {
  92.         $this->path = $path;
  93.     }
  94.  
  95.     /**
  96.      * Get path
  97.      *
  98.  
  99.      * @return string
  100.      */
  101.     public function getPath()
  102.     {
  103.         return $this->path;
  104.     }
  105.    
  106.     /**
  107.      * Set post
  108.      *
  109.      * @param Acme\DemoBundle\Entity\Post $post    
  110.      */
  111.     public function setPost($post)
  112.     {
  113.         $this->post = $post;
  114.     }
  115.  
  116.     /**
  117.      * Get post
  118.      *
  119.      * @return Acme\DemoBundle\Entity\Post
  120.      */
  121.     public function getPost()
  122.     {
  123.         return $this->post;
  124.     }
  125.  
  126.     /**
  127.      * Set createdAt
  128.      *
  129.      * @param DateTime $createdAt    
  130.      */
  131.     public function setCreatedAt(\DateTime $createdAt)
  132.     {
  133.         $this->createdAt = $createdAt;
  134.     }
  135.  
  136.     /**
  137.      * Get createdAt
  138.      *
  139.      * @return DateTime
  140.      */
  141.     public function getCreatedAt()
  142.     {
  143.         return $this->createdAt;
  144.     }    
  145.  
  146.      /**
  147.      * @ORM\PrePersist()    
  148.      */
  149.     public function prePersist()
  150.     {
  151.         $this->createdAt = new \DateTime();
  152.     }
  153.  
  154.      /**
  155.      * @ORM\PrePersist()
  156.      * @ORM\PreUpdate()
  157.      */
  158.     public function preUpload()
  159.     {        
  160.         if (null !== $this->file) {
  161.             $this->name = $this->file->getClientOriginalName();
  162.             // do whatever you want to generate a unique name
  163.             $this->path = uniqid().'.'.$this->file->guessExtension();
  164.         }
  165.     }
  166.  
  167.     /**
  168.      * @ORM\PostPersist()
  169.      * @ORM\PostUpdate()
  170.      */
  171.     public function upload()
  172.     {
  173.         if (null === $this->file) {
  174.             return;
  175.         }
  176.  
  177.         // if there is an error when moving the file, an exception will
  178.         // be automatically thrown by move(). This will properly prevent
  179.         // the entity from being persisted to the database on error
  180.         $this->file->move($this->getUploadRootDir(), $this->path);
  181.  
  182.         unset($this->file);
  183.     }
  184.  
  185.     /**
  186.      * @ORM\PostRemove()
  187.      */
  188.     public function removeUpload()
  189.     {
  190.         if ($file = $this->getAbsolutePath()) {
  191.             unlink($file);
  192.         }
  193.     }
  194.  
  195.     /**
  196.      * @return mixed null|string
  197.      */
  198.     public function getAbsolutePath()
  199.     {
  200.         return null === $this->path ?: $this->getUploadRootDir() . '/' . $this->path;
  201.     }
  202.  
  203.     /**
  204.      * @return mixed null|string
  205.      */
  206.     public function getWebPath()
  207.     {
  208.         return null === $this->path ?: $this->getUploadDir() . '/' . $this->path;
  209.     }
  210.  
  211.     /**
  212.      * @return string
  213.      */
  214.     protected function getUploadRootDir()
  215.     {
  216.         // the absolute directory path where uploaded documents should be saved
  217.         return __DIR__ . '/../../../../web/' . $this->getUploadDir();
  218.     }
  219.  
  220.     /**
  221.      * @return string
  222.      */
  223.     protected function getUploadDir()
  224.     {
  225.         // get rid of the __DIR__ so it doesn't screw when displaying uploaded doc/image in the view.
  226.         return 'uploads';
  227.     }    
  228. }

Ahora los formularios para las entidades:

Forms - Post
Código PHP:
Ver original
  1. namespace Acme\DemoBundle\Form;
  2.  
  3. use Symfony\Component\Form\AbstractType;
  4. use Symfony\Component\Form\FormBuilder;
  5.  
  6. class PostType extends AbstractType
  7. {
  8.     public function buildForm(FormBuilder $builder, array $options)
  9.     {
  10.         $builder
  11.             ->add('title')
  12.             ->add('content')
  13.             ->add('images', 'collection', array(                
  14.                 'type' => new PostImageType(),
  15.                 'allow_add' => true,
  16.                 'allow_delete' => true,
  17.                 'by_reference' => false,
  18.             ))
  19.         ;        
  20.     }
  21.  
  22.     public function getName()
  23.     {
  24.         return 'acme_demobundle_posttype';
  25.     }
  26.    
  27.     public function getDefaultOptions(array $options)
  28.     {
  29.         return array('data_class' => 'Acme\DemoBundle\Entity\Post');
  30.     }
  31.    
  32. }

Forms - PostImage
Código PHP:
Ver original
  1. namespace Acme\DemoBundle\Form;
  2.  
  3. use Symfony\Component\Form\AbstractType;
  4. use Symfony\Component\Form\FormBuilder;
  5.  
  6. class PostImageType extends AbstractType
  7. {
  8.     public function buildForm(FormBuilder $builder, array $options)
  9.     {
  10.         $builder->add('file', 'file');        
  11.     }
  12.  
  13.     public function getName()
  14.     {
  15.         return 'acme_demobundle_postimagetype';
  16.     }
  17.    
  18.     public function getDefaultOptions(array $options)
  19.     {
  20.         return array('data_class' => 'Acme\DemoBundle\Entity\PostImage');
  21.     }
  22.    
  23. }

to be continued...
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 27/02/2012 a las 04:28