2013-10-17 7 views
6

मैं एक जटिल फ़ाइल अपलोड फॉर्म बना रहा हूं। यह फॉर्म सामान्य डेटा और 4 फ़ाइल प्रकारों का एक सेट है जिसमें एकाधिक फ़ाइल अपलोड प्रति प्रकार संभव हैं।सिम्फनी 2 फॉर्म: फॉर्म अमान्य होने पर पहले ही अपलोड की गई फाइलें दिखाएं

  • ReportForm
    • संलग्नक
      • रिपोर्ट (UploadedFile संस्थाओं का संग्रह)
      • तस्वीरें (UploadedFile संस्थाओं का संग्रह)

UploadedFile इकाई है एक फ़ाइल नाम, विवरण इत्यादि ..

केस का उपयोग करें: अब, मैं 4 फोटो और 2 रिपोर्ट के साथ फॉर्म सबमिट कर रहा हूं, सभी 6 फाइलें ठीक हैं। लेकिन फ़ॉर्म में कुछ अन्य त्रुटियां हैं। लेकिन मैं अपलोड की गई फ़ाइलों को दोबारा दिखाना चाहता हूं ताकि उपयोगकर्ता को दोबारा दोबारा अपलोड नहीं करना पड़े। ये फ़ाइलें पहले से ही जारी हैं, इसलिए जब मैं एक ही पृष्ठ पर एक जीईटी के साथ वापस आती हूं, तो फाइलें सही तरीके से दिखायी जाती हैं।

क्या मैं पहले से ही किया था/करने की कोशिश की:

  • इससे पहले कि मैं अनुरोध मैं मौजूदा अपलोड की गई फ़ाइलों
  • क्लोन प्रपत्र मैं सभी नई फ़ाइलें अपलोड (यदि हो तो) और उन्हें
  • जारी रहती है बंधन के बाद बाँध उसके बाद मैं मौजूदा अपलोड की गई फ़ाइलों को फिर से जोड़ता हूं (क्लोन ऑब्जेक्ट से)। मैंने मौजूदा फ़ाइल आईडी के साथ फॉर्म इनपुट बनाया है, इसलिए मैं मौजूदा आइटम को पहचान सकता हूं।

यह सब ठीक काम कर रहा है, लेकिन चूंकि मैं पोस्ट के बाद दिखाए गए डेटा को बाध्य करने के बाद अपनी रिपोर्ट और अटैचमेंट बदलता हूं। मैं सबमिट किए गए फॉर्म पर setData ($ रिपोर्ट) नहीं कर सकता।

तो मौजूदा फाइलें अब और दिखाई नहीं दे रही हैं क्योंकि फ़ॉर्म डेटा अभी भी पुरानी रिपोर्ट ऑब्जेक्ट (पोस्ट से) है।

जब मैं पृष्ठ का सामान्य GET करता हूं, तो $ रिपोर्ट डेटाबेस से पुनर्प्राप्त की जाती है और सही तरीके से दिखाया जाता है। लेकिन पहले से अपलोड की गई फ़ाइलों के साथ एक पोस्ट के बाद, डेटाबेस डेटा सही है लेकिन फ़ॉर्म व्यू बदले गए डेटा (बाध्य के बाद) के बारे में कुछ भी नहीं जानता है।

कोई भी विचार? या ऐसा करने का एक बेहतर तरीका है?

उत्तर

3

ठीक है, कुछ दिनों के निशान और त्रुटि के बाद मुझे एक मिलान समाधान मिला।

यहां मैंने जो किया, वह संक्षेप में है। फ़ाइल और uniqueId:

UploadedFile इकाई में मैं 2 नए क्षेत्रों को जोड़ा। इन फ़ील्ड को ओआरएम में मैप नहीं किया गया है क्योंकि मुझे केवल उन्हें फॉर्म में चाहिए।

फॉर्म सबमिट करते समय मैं एक विशिष्ट सत्र var में नई अपलोड की गई फ़ाइल जोड़ता हूं, और उन्हें एक अद्वितीय आईडी निर्दिष्ट करता हूं (क्योंकि मुझे उन्हें हटाने में सक्षम होना चाहिए और मुझे पहचानकर्ता की आवश्यकता है)। मैं फ़ाइलों को उनके नए स्थान पर भी अपलोड करता हूं।

यदि फॉर्म मान्य है तो मैं इस संग्रह को उस संग्रह में जोड़ता हूं जिसे मैंने इस संग्रह में रखा है।

यदि फॉर्म अमान्य है तो फ़ाइलें दिखायी जाती हैं क्योंकि मैं सत्र से इस विशिष्ट संग्रह को पुनर्प्राप्त करता हूं। यहां तक ​​कि जब मैं जीईटी के साथ पेज पर फिर से जाता हूं, तब भी सभी अपलोड की गई फाइलें दिखायी जाती हैं।

यदि मैं दृश्य में एक फ़ाइल हटा देता हूं तो मैंने इनपुट क्षेत्र में हटाए गए अद्वितीय आईडी की एक सूची डाली है। तो जमा करने के बाद मैं जांचता हूं कि मुझे कौन सी फाइलें सरणी से हटा दी जानी चाहिए।

मुझे लगता है कि मेरा उत्तर मेरे सवाल :)

+1

आप स्रोतों दिखा सकते हैं तो कृपया और तुम config में पैरामीटर धारा के तहत दो पैरामीटर की ज़रूरत है? –

3

मैं नीचे समाधान कर दिया है के रूप में के रूप में स्पष्ट नहीं है। आप इसे अपनी जरूरतों के लिए अनुकूलित कर सकते हैं। लेकिन आपको अतिरिक्त कमांड की आवश्यकता है जो अपलोड/टीएमपी निर्देशिका में पुरानी फाइलों को साफ़ करता है।

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

प्रपत्र:

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); 
      } 
     } 
    ); 
} 
संबंधित मुद्दे