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 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,
))
;
}
// ...
}
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);
}
// ...
}
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()
// ...
Pongo una captura de la imagen del administrador.