Foros del Web » Programando para Internet » PHP » Symfony »

Eliminar foto con sonata_type_colletion

Estas en el tema de Eliminar foto con sonata_type_colletion en el foro de Symfony en Foros del Web. Muy buenas, La verdad es que ya no puedo más con esto, me tiene un poco desesperado. Mi problema es que en el administrador con ...
  #1 (permalink)  
Antiguo 26/10/2014, 15:37
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 19 años, 7 meses
Puntos: 3
Pregunta Eliminar foto con sonata_type_colletion

Muy buenas,

La verdad es que ya no puedo más con esto, me tiene un poco desesperado.

Mi problema es que en el administrador con SonataAdminBundle no puede eliminar ningún campo de la base de datos imágenes y lo más que me mosquea es que tengo otro hecho igual con vídeos y funciona correctamente. Bueno en el de vídeo son solamente enlaces a YouTube, pero es lo mismo. Porque aunque no me eliminara la foto de la carpeta, me podría eliminar el registro.

Expongo mi código haber si me podéis sacar de este aprieto que llevo tres días, para esto leyendo, probando y probando.

Tengo dos entidades una foto y otra messages.

Entidad Fotos:

Código PHP:
/**
 * Fotos
 *
 * @ORM\Table(name="fotos")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Fotos
{
 
    
/**
     * @ORM\ManyToOne(targetEntity="Acme\MessagesBundle\Entity\Messages", inversedBy="fotos")
     * @ORM\JoinColumn(name="message_id", referencedColumnName="id")
     */
    
private $messages;
 
    
// ...

Código para FotosAdmin.php

Código PHP:
class FotosAdmin extends Admin
{
    
/**
     * @param FormMapper $formMapper
     */
    
protected function configureFormFields(FormMapper $formMapper)
    {
        
$formMapper
            
->add('foto''file',array(
                
'required' => false,
                
'help' => $rutaFoto,
                
'label' => 'Foto '.$numero.' ',
                
'attr' => array(
                    
'class' => 'nice_file_field',
                    
// 'onchange'=>"readImage(this.form,this)",
                    // 'oninvalid'=>"setCustomValidity('Por favor escoge un nombre de usuario valido')"
                
)
            ))
 
            ->
add('nombre','text',array(
                
'label' => 'Nombre la foto:',
                
'required' => false,
            ))
        ;
    }
 
    
// ...

Entidad messages:

Código PHP:

/**
 * Messages
 *
 * @ORM\Table(name="messages")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
 
class Messages
{
    
/**
     * @var ArrayCollection $fotos
     *
     * @ORM\OneToMany(
     * targetEntity="Acme\FotosBundle\Entity\Fotos",
     * mappedBy="messages",
     * cascade={"all"})
     * orphanRemoval=true)
     *@Assert\Valid()
     *
     */ 
    
private $fotos;
 
    
/**
     * @var ArrayCollection $videos
     *
     * @ORM\OneToMany(
     * targetEntity="Acme\VideosBundle\Entity\Videos",
     * mappedBy="messages",
     * cascade={"all"},
     * orphanRemoval=true)
     *@Assert\Valid()
     *
     */ 
    
private $videos;
 
    
// ...
 
    
public function __construct() {
        
$this->fotos  = new ArrayCollection();
        
$this->videos = new ArrayCollection();
    }
 
    
// ...
 
    /**
     * Set fotos
     *
     * @param string $fotos
     * @return messages
     */
    
public function setFotos($fotos null)
    {
        foreach (
$fotos as $image) {
        
$image->setMessages($this);
    }
 
    public function 
addFotos(AcmeFotosBundleEntityFotos $fotos)
    {
        if(!
$this->fotos->contains($fotos)){
            
$this->fotos[] = $fotos;
            
$fotos->setMessages($this);
 
        }
        return 
$this;
    }
 
    public function 
removeFotos(AcmeFotosBundleEntityFotos $fotos)
    {
        
$this->fotos->removeElement($fotos);
        
$this->fotos->remove($fotos);
        
$fotos->setMessages(null);
        if (
$file $this->fotos->getUploadRootDir($id)) {
            
unlink($file);
        }
    }
 
    public function 
removeVideos(AcmeVideosBundleEntityVideos $videos)
    {
        
$this->videos->removeElement($videos);
    }
 
    
// ...

Formulario MessagesAdmin.php para SonataAdmin:

Código PHP:
class MessagesAdmin extends Admin
{
    
/**
     * @param FormMapper $formMapper
     */
    
protected function configureFormFields(FormMapper $formMapper)
    {
 
        
// ...
 
        
->Tab('Fotos', array('value'=>'Fotos'))  
            ->
with('Fotos', array(
                
'class'       => 'col-md-12',
                
'description' => '',
                
'name'        => 'Fotos'
            
))
            ->
add('fotos''sonata_type_collection', array(
                
'by_reference' => false
                
//'btn_add' => false,
                
'required' => false,
                
'cascade_validation' => true,
                
'label' => 'Fotos experiencias',
                
'type_options' => array('delete' => true,)
            ), array(
                
'edit' => 'inline',
               
// 'inline' => 'table',
                
'sortable' => 'position',
            ))                
            ->
end()
        ->
end()
 
    
// ... 
Bueno pues cuando marco el checkbox de Delete y lo doy actualizar no hace nada, lo peor de todo es que ni siquiera me da un error. Otra cosa la subida de imagen me va bien.

Pongo una captura de la imagen del administrador.
  #2 (permalink)  
Antiguo 23/11/2014, 17:00
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 19 años, 7 meses
Puntos: 3
Respuesta: Eliminar foto con sonata_type_colletion

Buenas otra vez,

Ahora si que me sale error por lo menos. Por lo que se ve no puedo conseguir el id del mensaje relacionado con la foto cuando le doy a eliminar. Me sale el siguiente error:

Código PHP:
ErrorCall to a member function getId() on a non-object in /var/www/proyecto/src/acme/FotosBundle/Entity/Fotos.php line 650 
Y la linea 650 es esto donde obtengo la ruta de la foto:

Código PHP:
    /**
     * Get rutaFoto
     *
     * @return string
     */
    
public function getRutaFoto()
    {
 

        
$ruta="fotos/messages/".$this->getMessages()->getId()."/".$this->rutaFoto;   

        return 
$ruta;
    } 
Sabéis porque no puedo conseguir el id en la entidad fotos, la verdad q esto me funciona en todo menos en esto, a la hora de eliminar.

Un saludo.
  #3 (permalink)  
Antiguo 24/11/2014, 02:25
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 7 meses
Puntos: 13
Respuesta: Eliminar foto con sonata_type_colletion

Si como dices, lo mismo te funciona con los videos, tal vez sea que en la anotacion del campo de $foto en la entidad de Message tienes puesto un parentesis en lugar de una coma y por eso el mapeo no se está efectuando correctamente.

Código ormAnottation:
Ver original
  1. /**
  2.      * @var ArrayCollection $fotos
  3.      *
  4.      * @ORM\OneToMany(
  5.      * targetEntity="Acme\FotosBundle\Entity\Fotos",
  6.      * mappedBy="messages",
  7.      * cascade={"all"})  <-------------------------------------------
  8.      * orphanRemoval=true)
  9.      *@Assert\Valid()
  10.      *
  11.      */  
  12.     private $fotos;
  13.  
  14.     /**
  15.      * @var ArrayCollection $videos
  16.      *
  17.      * @ORM\OneToMany(
  18.      * targetEntity="Acme\VideosBundle\Entity\Videos",
  19.      * mappedBy="messages",
  20.      * cascade={"all"},  <-------------------------------------------
  21.      * orphanRemoval=true)
  22.      *@Assert\Valid()
  23.      *
  24.      */  
  25.     private $videos;
  #4 (permalink)  
Antiguo 24/11/2014, 11:26
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 19 años, 7 meses
Puntos: 3
Respuesta: Eliminar foto con sonata_type_colletion

Cita:
Iniciado por bNd170 Ver Mensaje
Si como dices, lo mismo te funciona con los videos, tal vez sea que en la anotacion del campo de $foto en la entidad de Message tienes puesto un parentesis en lugar de una coma y por eso el mapeo no se está efectuando correctamente.

Código ormAnottation:
Ver original
  1. /**
  2.      * @var ArrayCollection $fotos
  3.      *
  4.      * @ORM\OneToMany(
  5.      * targetEntity="Acme\FotosBundle\Entity\Fotos",
  6.      * mappedBy="messages",
  7.      * cascade={"all"})  <-------------------------------------------
  8.      * orphanRemoval=true)
  9.      *@Assert\Valid()
  10.      *
  11.      */  
  12.     private $fotos;
  13.  
  14.     /**
  15.      * @var ArrayCollection $videos
  16.      *
  17.      * @ORM\OneToMany(
  18.      * targetEntity="Acme\VideosBundle\Entity\Videos",
  19.      * mappedBy="messages",
  20.      * cascade={"all"},  <-------------------------------------------
  21.      * orphanRemoval=true)
  22.      *@Assert\Valid()
  23.      *
  24.      */  
  25.     private $videos;
Muchas gracias, lo acabo de corregi, y me sigue dando el mismo error. Lo que no entiendo es porque no me daba un error por el fallo que me has comentado

La verdad no se conseguir el id del mensaje cuando obtengo la ruta. Lo peor que en las plantillas twig me funciona pero aqui con sonata no.

Que puede pasar?
  #5 (permalink)  
Antiguo 25/11/2014, 06:16
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 9 años, 9 meses
Puntos: 44
Respuesta: Eliminar foto con sonata_type_colletion

Y qué se supone que hay en getMessages? Si es un array (lo supongo porque está en plural), deberías levantar una posición del mismo para obtener las propiedades. Ejemplo:

Código PHP:
    /** 
     * Get rutaFoto 
     * 
     * @return string 
     */ 
    
public function getRutaFoto() 
    { 
  

        
$ruta="fotos/messages/".$this->getMessages()->first()->getId()."/".$this->rutaFoto;    

        return 
$ruta
    } 
  #6 (permalink)  
Antiguo 25/11/2014, 13:44
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 19 años, 7 meses
Puntos: 3
Respuesta: Eliminar foto con sonata_type_colletion

Perfecto GeekGirl eso ya esta arreglado ya obtengo el id del mensaje que esta relacionado con muchas fotos.

Ahora el problema esta que no se como eliminarlo ya que el problema que tengo no lo puedo solucionar con HasLifecycleCallbacks y PostRemove, ya que esto se ejecuta cuando elimino el mensaje y rollo esta que al administrar el mensaje expongo las fotos y las pre visualizo bien y puedo subir más foto, pero como no puedo eliminar, al igual que hago con los videos. Claro los videos son campos de textos pero las fotos es solamente un registro que tengo que eliminar de la tabla foto para eliminar la relación con el mensaje. Es solo eso.

Por ahora he conseguido sacar en el PreUpdate MessagesAdmin.php la foto que viene con la variable delete de esta manera:

Código PHP:
public function preUpdate($objectif) {
 
$params             =  $this->getRequest()->request->get($this->getUniqid());
    
$images              =  $params['fotos'];

    foreach (
$images as $key=>$value) {

      if(isset(
$images[$key]["_delete"]))
          echo 
"yes";
die();

Pero el único data que obtengo es esto
Código PHP:
Content-Dispositionform-dataname="s5474db1dc479a[fotos][2][_delete]" 
que me lo pasa por Post porque lo he mirado por el Chrome, pero ahora no se como eliminarlo, no tengo ninguna solución ni con HasLifecycleCallbacks ni nada, ni con la funcion removeFotos de la entidad ni nada.

La verdad estoy haciendo otras cosas de programación, pero llevo ya casi con esto un mes.

Haber si alguien me saca de este embrollo porque la verdad, no se como una cosa tan normal no esta resuelta por ningún sitio.

Gracias!!!
  #7 (permalink)  
Antiguo 26/11/2014, 16:55
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 19 años, 7 meses
Puntos: 3
Respuesta: Eliminar foto con sonata_type_colletion

Ya Me funciona con 'by_reference' => true, la verdad no entiendo porque me funciona, sinceramente, porque en la llamada en la funcion removeFotos() le tengo puesto die(); y no se ejecuta, entonces la verdad no se donde proviene la función que elimina el registro, porque si me gustaría perfilarlo y eliminar la imagen del directorio.

Alguien sabe porque es debido esto?

Etiquetas: symfony2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:05.