2012-11-13 15 views
5

In Sonata Admin, voglio utilizzare il caricamento e l'anteprima del file immagine in sonata_type_collection.SonataAdminBundle con sonata_type_collection e caricamento immagine

Nel mio Admin/ItemAdmin.php:

class ItemAdmin extends Admin 
{ 

    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('title') 
      ->with('Photos') 
      ->add('pictures', 'sonata_type_collection', array(
       'label' => 'Pictures', 
       'by_reference' => false, 
       'required' => false, 
       ), array(
       'edit' => 'inline', 
       'inline' => 'table', 
       'sortable' => 'id' 
      )) 
      ->end() 
     ; 
    } 

Nel mio Admin/ItemPictureAdmin.php:

class ItemPictureAdmin extends Admin { 

    protected function configureFormFields(FormMapper $formMapper) { 
     $obj = $this->getSubject(); 

     $formBuilder = $formMapper->getFormBuilder(); 

     if(is_object($obj) && $obj->getPicture()) 
     { 
      $formMapper 
      ->add('picturePreview', 'image_preview', array(
       'required' => false, 
       'property_path' => false, 
       'upload_dir' => '/uploads/picture/', 
       'file_name' => $obj->getPicture() 
      )); 
     } 
     $formMapper->add('pictureFile', 'file', array('label' => 'Pic')); 
    } 

Il tipo "image_preview" è un nuovo tipo che ho creato con un semplice ramoscello modello per mostrare l'immagine.

in anteprima: http://i.stack.imgur.com/AC0ih.png

Problema 1: Ho due immagini registrate nel database con due differenti file delle foto, ma nella lista, viene visualizzato solo il primo.

Problema 2: non è possibile aggiornare un'immagine ... Devo cancellare il record e caricare di nuovo un nuovo file.

+0

Problema 2: È necessario creare un metodo '' preUpdate' in ItemPictureAdmin'? Ecco un esempio: [Symfony2, Sonata Admin Bundle e File Uploads] (http://blog.code4hire.com/2011/08/symfony2-sonata-admin-bundle-and-file-uploads/) – AndreaS

+0

Per il primo numero , è un bug in sonata non ancora risolto, che negli amministratori integrati il ​​'$ this-> getSubject()' ottiene sempre il primo oggetto dalla relazione. C'è una soluzione temporanea a questo. Vedi questo: http://stackoverflow.com/questions/18106502/how-to-get-child-object-in-embedded-admin-class-in-sonata-admin/22815329#22815329 – hombee

risposta

0

Mi sono imbattuto sul problema 1. Ho provato ogni possibile soluzione che ho trovato, ma non ha funzionato. Ho provato alcune delle mie soluzioni e una era buona.
Quello che ho fatto:

  • ho salvato nella sessione l'indice dell'entità del bambino (nel tuo caso ItemPictureAdmin) e quando ho bisogno di un soggetto, vorrei prendere l'indice dalla sessione e ottenere l'elemento con quell'indice dalla lista nell'entità genitore.

  • Prima li risparmio nell'indice sessione 0 e ItemPictureAdmin accedo sua lista genitore ItemPictureAdmin con l'indice 0

  • Dopo questo, ho incrementato l'indice nella sessione. Dopo aver ottenuto tutti gli elementi dall'elenco, ho cancellato il parametro di sessione che ha salvato l'indice.

Questa soluzione è un adattamento della soluzione di caponica here