2013-10-17 16 views
6

Karmaşık bir dosya yükleme formu hazırlıyorum. Bu form, normal verilerden ve her tür için birden fazla dosya yüklemesine sahip 4 dosya grubundan oluşur.Symfony2 Formlar: Form geçersiz olduğunda yüklenen dosyaları göster

  • ReportForm
    • Ekler
      • Raporlar (uploadedfile Entities toplanması)
      • Fotoğraflar (uploadedfile Entities toplanması)

uploadedfile varlık vardır Bir dosya adı, açıklama vb ..

Kullanım durumu: Şimdi formumuzu 4 Fotoğraf ve 2 Rapor ile gönderiyorum, tüm 6 dosya tamam. Ancak formda başka bazı hatalar var. Ama Yüklenen dosyaları tekrar göstermek istiyorum, böylece kullanıcının bunları yeniden yüklemesi gerekmeyecek. Bu dosyalar zaten kalıcı, bu yüzden bir GET ile aynı sayfaya geri döndüğümde, dosyalar doğru şekilde gösteriliyor.

Zaten yaptığı şey/denedik:

  • ben formunu Ben tüm yeni dosya yüklemek (varsa) ve onlara
  • inat bağlayıcı sonra mevcut yüklenen dosyaları
  • klonlamak isteği bağlayan önce Bundan sonra mevcut yüklenen dosyaları (klonlanmış nesneden) tekrar ekliyorum. Mevcut dosya kimliğiyle form girişleri oluşturdum, böylece mevcut öğeleri tanıyabiliyorum.

Her şey iyi çalışıyor, BUT Bildirimi ve Ekleri değiştirdiğimden sonra, bir gönderinin değiştirilmesinden sonra gösterilen verileri bağlama. Gönderilen formda setData ($ report) yapamıyorum.

Artık varolan dosyalar form verileri hala eski rapor nesnesinde (yazıdan) olduğu için gösterilmiyor.

Sayfanın normal bir GET işlemini yaptığımda, $ rapor veritabanından alınır ve doğru şekilde gösterilir. Ancak önceden yüklenmiş dosyalara sahip bir POST'tan sonra veritabanı verileri doğrudur, ancak form görünümü değiştirilen veriler hakkında herhangi bir şey bilmiyordur (bağlantıdan sonra).

Herhangi bir fikrin var mı? Ya da bunu yapmanın daha iyi bir yolu?

cevap

3

Tamam, birkaç günlük iz ve hatadan sonra eşleşen bir çözüm buldum.

Kısacası ne yaptım. dosya ve UNIQUEID: uploadedfile varlık olarak

Ben 2 yeni alanlar eklendi. Bu alanlar, yalnızca formda onlara ihtiyacım olduğu için ORM'de eşlenmiyor.

Formu gönderirken yeni yüklenen dosyayı belirli bir oturum varlığına ekliyorum ve bunlara benzersiz bir kimlik atayım (çünkü bunları silebilmem ve bir tanımlayıcıya ihtiyacım vardı). Ayrıca dosyaları yeni konumlarına da yüklüyorum.

Form geçerliyse, oturumda kaydettiğim bu koleksiyonu bu koleksiyonu içeren varlığa ekleyin.

Form geçersizse, bu belirli koleksiyonu oturumdan aldığım için dosyalar gösterilir. Sayfayı GET ile tekrar ziyaret ettiğimde bile, yüklenen tüm dosyalar gösterilir.

Görünümdeki bir dosyayı silersem, giriş alanında silinmiş benzersiz kimliklerin listesini koydum. Gönderimden sonra diziden hangi dosyaları silmem gerektiğini kontrol ediyorum.

ben cevabım sorumu :) Aşağıda çözüm yaptık

+1

Eğer kaynaklarını gösterir misiniz Ve config parametreler bölümünde iki parametre gerekir mi? –

3

kadar belirsiz olduğunu düşünüyorum. İhtiyaçlarınıza göre uyarlayabilirsiniz. Ancak eski dosyaları uploads/tmp dizininde temizleyen ek bir komuta ihtiyacınız var.

parameters: 
    uploads_dir: %kernel.root_dir%/../web/uploads 
    uploads_tmp_dir: %uploads_dir%/tmp 

formu::

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('file',ImageFileType::TYPE_NAME,array(
      'fileField' => 'file', 
      'pathField' => 'path', 
      'required' => false, 
      'label' => 'makeswapping.form.single_image', 
      'imgclass' => 'tumbnail imgbox full-width', 
      'constraints' => array(
       new Assert\Image(array(
        'minWidth' => '440' 
        )) 
      ) 
     )); 

    $container = $this->container; 

    $builder->addEventListener(
     FormEvents::PRE_SUBMIT, 
     function (FormEvent $event) use ($container) { 

      $form = $event->getForm(); 
      $data = $event->getData(); 

      $uploadsTmpDir = $container->getParameter('uploads_tmp_dir'); 
      if (isset($data['file'])) { 
       $filename = sprintf('%s.%s', uniqid('tmp_'), $data['file']->getClientOriginalExtension()); 
       if (!file_exists($uploadsTmpDir)) { 
        mkdir($uploadsTmpDir, 0755, true); 
       } 
       copy($data['file']->getRealPath(), $uploadsTmpDir . '/' . $filename); 
       $form->add('file_hidden', 'hidden', array(
        'mapped' => false, 
        'required' => false, 
        'empty_data' => $filename, 
       )); 
      } else if (!isset($data['file']) && isset($data['file_hidden'])) { 
       $fileInfo = new \SplFileInfo($uploadsTmpDir . '/' . $data['file_hidden']); 

       $mimeTypeGuesser = MimeTypeGuesser::getInstance(); 
       $uploadedFile = new UploadedFile(
        $fileInfo->getRealPath(), 
        $fileInfo->getBasename(), 
        $mimeTypeGuesser->guess($fileInfo->getRealPath()), 
        $fileInfo->getSize(), 
        null, 
        true 
       ); 

       $form->add('file_hidden', 'hidden', array(
        'mapped' => false, 
        'required' => false, 
        'empty_data' => $data['file_hidden'], 
       )); 

       $form->get('file')->setData($uploadedFile); 
       $data['file'] = $uploadedFile; 
       $event->setData($data); 
      } 
     } 
    ); 
} 
İlgili konular