Bonjour à tous,

J'ai un petit soucis avec Sonata AdminBundle pour l'upload d'une image sur une entite, j'explique le contexte :

J'ai une entite AppModel comportant un nom et un logo (le fichier image), et je souhaite l'implemente dans Sonata avec une class AppModelAdmin.

En ce moment, j'arrive a upload une image a la creation d'un entite, mais j'ai deux problemes:
  • Je ne peux pas uploader une autre image pour la changer, sauf si je change aussi un autre champ (exemple: name)
  • Si je souhaite mettre a jour l'entite sans toucher a l'image, le formulaire bloque sur le champ file, mais pas d'erreur apparente.


Je souhaite aussi pouvoir supprimer l'image, mais je ne vois pas de maniere propre de le faire, une suggestion ?

Voici ma classe AppModel:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<?php
 
namespace Nexy\MainBundle\Entity;
 
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
 
use Doctrine\ORM\Mapping as ORM;
 
use Gedmo\Mapping\Annotation as Gedmo;
 
/**
 * AppModel
 *
 * @ORM\Table(name="app_model")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class AppModel
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
 
   /**
     * @Gedmo\Slug(fields={"name"}, updatable=false)
     * @ORM\Column(length=128, unique=true)
     */
    private $slug;
 
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
 
    /**
     * Get slug
     *
     * @return string 
     */
    public function getSlug()
    {
        return $this->slug;
    }
 
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=128)
     */
    private $name;
 
    /**
     * Set name
     *
     * @param string $name
     * @return AppModel
     */
    public function setName($name)
    {
        $this->name = $name;
 
        return $this;
    }
 
    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
 
    /**
     * @var UploadedFile
     * 
     * @Assert\File(maxSize="1M")
     * @Assert\NotBlank
     * @Assert\Image(mimeTypes={"image/jpeg", "image/png"})
     */
    private $file;
 
    /**
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    }
 
    /**
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file)
    {
        $this->file = $file;
    }
 
    /**
     * @ORM\Column(name="logo_ext", type="string", length=255)
     */
    private $logoExt;
 
    public function getAbsoluteLogo()
    {
        return null === $this->logoExt ? null : $this->getUploadRootDir().'/'.$this->slug.'.'.$this->logoExt;
    }
 
    public function getWebLogo()
    {
        return null === $this->logoExt ? null : $this->getUploadDir().'/'.$this->slug.'.'.$this->logoExt;
    }
 
    protected function getUploadRootDir()
    {
        // le chemin absolu du répertoire où les documents uploadés doivent être sauvegardés
        return __DIR__.'/../../../../web/'.$this->getUploadDir();
    }
 
    protected function getUploadDir()
    {
        return 'uploads/apps';
    }
 
    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpload()
    {
        if (null !== $this->file) {
            $this->logoExt = $this->file->guessExtension();
        }
    }
 
    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    public function upload()
    {
        if (null === $this->file) {
            return;
        }
 
        // Will stop persist if fail
        $this->file->move($this->getUploadRootDir(), $this->slug.'.'.$this->logoExt);
 
        unset($this->file);
    }
 
    /**
     * @ORM\PostRemove()
     */
    public function removeUpload()
    {
        if ($filename = $this->getAbsolutePath()) {
            unlink($filename);
        }
    }
}

Et ma classe AppModelAdmin:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
 
namespace Nexy\BackBundle\Admin;
 
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Validator\ErrorElement;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
 
/**
 * Description of AppModelAdmin
 *
 * @author sullivan
 */
class AppModelAdmin extends Admin
{
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->add('name')
            ->add('WebLogo', null, array(
                'template'  => 'NexyBackBundle:CRUD:list_image.html.twig'
            ))
            ->add('_action', 'actions', array(
                'actions' => array(
                    'view'      => array(),
                    'edit'      => array(),
                )
            ))
        ;
    }
 
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('name')
        ;
    }
 
    protected function configureShowFields(ShowMapper $showMapper)
    {
        $showMapper
            ->with('General')
                ->add('name')
                ->add('WebLogo', null, array(
                    'template'  => 'NexyBackBundle:CRUD:show_image.html.twig'
                ))
            ->end()
        ;
    }
 
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
                ->add('name')
                ->add('file', 'file', array(
                    'required'      => false,
                ))
            ->end()
        ;
    }
}
 
?>

Voila j'ai du me trompe quelque part mais la je seche... :/

Merci d'avance de votre aide !