From c60aeff0bf5ef3c9ad25417960980cacb872bdf0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guillaume=20Perr=C3=A9al?= <guillaume.perreal@irstea.fr>
Date: Thu, 22 Jan 2015 14:36:29 +0100
Subject: [PATCH] =?UTF-8?q?G=C3=A8re=20correctement=20l'upload=20de=20mult?=
 =?UTF-8?q?iples=20fichiers.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../UploadedFileTransformer.php               | 49 ++++++++++++++-----
 Form/Type/FileUploadType.php                  |  3 +-
 Resources/views/Form/file_upload.html.twig    | 38 ++++++++------
 3 files changed, 62 insertions(+), 28 deletions(-)

diff --git a/Form/DataTranformer/UploadedFileTransformer.php b/Form/DataTranformer/UploadedFileTransformer.php
index 3ecae0f2..5acd5fdf 100644
--- a/Form/DataTranformer/UploadedFileTransformer.php
+++ b/Form/DataTranformer/UploadedFileTransformer.php
@@ -9,7 +9,9 @@ namespace Irstea\FileUploadBundle\Form\DataTranformer;
 
 use Irstea\FileUploadBundle\Entity\UploadedFile;
 use Irstea\FileUploadBundle\Service\FileManagerInterface;
+use Rhumsaa\Uuid\Uuid;
 use Symfony\Component\Form\DataTransformerInterface;
+use Traversable;
 
 /**
  * Description of UploadedFileTransformer
@@ -39,8 +41,16 @@ class UploadedFileTransformer implements DataTransformerInterface
      */
     public function reverseTransform($value)
     {
-        $result = $value instanceof UploadedFile ? $value : (is_string($value) ? $this->reverseTransformFile($value) : null);
-        return $result;
+        if(!$this->multiple) {
+            return $this->reverseTransformFile($value);
+        }
+        $result = [];
+        if(is_array($value) || $value instanceof Traversable) {
+            foreach($value as $index => $file) {
+                $result[$index] = $this->reverseTransformFile($file);
+            }
+        }
+        return array_filter($result);
     }
 
     /**
@@ -48,27 +58,44 @@ class UploadedFileTransformer implements DataTransformerInterface
      */
     public function transform($value)
     {
-        $result = $value instanceof UploadedFile ? $this->transformFile($value) : null;
-        return $result;
+        if(!$this->multiple) {
+            return $this->transformFile($value);
+        }
+        $result = [];
+        if(is_array($value) || $value instanceof Traversable) {
+            foreach($value as $index => $file) {
+                $result[$index] = $this->transformFile($file);
+            }
+        }
+        return array_filter($result);
     }
 
     /**
      *
-     * @param UploadedFile $file
-     * @return array
+     * @param mixed $value
+     * @return mixed
      */
-    protected function transformFile(UploadedFile $file)
+    protected function transformFile($value)
     {
-        return $file;
+        return $value instanceof UploadedFile ? $value : null;
     }
 
     /**
      *
-     * @param string $id
+     * @param mixed $value
      * @return UploadedFile
      */
-    protected function reverseTransformFile($id)
+    protected function reverseTransformFile($value)
     {
-        return $this->fileManager->get($id);
+        if(is_string($value) && Uuid::isValid($value)) {
+            $value = $this->fileManager->get($value);
+        }
+        if($value instanceof UploadedFile) {
+            if($value->isOrphelin()) {
+                $value->setEtat(UploadedFile::ETAT_NORMAL);
+            }
+            return $value;
+        }
+        return null;
     }
 }
diff --git a/Form/Type/FileUploadType.php b/Form/Type/FileUploadType.php
index ec521012..b4e0799c 100644
--- a/Form/Type/FileUploadType.php
+++ b/Form/Type/FileUploadType.php
@@ -54,7 +54,7 @@ class FileUploadType extends AbstractType
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
         $builder->setCompound(false);
-        $builder->addViewTransformer(new UploadedFileTransformer($this->fileManager));
+        $builder->addViewTransformer(new UploadedFileTransformer($this->fileManager, $options['multiple']));
     }
 
     public function buildView(FormView $view, FormInterface $form, array $options)
@@ -63,6 +63,7 @@ class FileUploadType extends AbstractType
 
         $view->vars['widget_attr']['data-create-url'] = $this->router->generate('file_upload_create');
         $view->vars['csrfToken'] = $this->csrfProvider->generateCsrfToken(UploadController::CSRF_INTENTION);
+        $view->vars['multiple'] = $options['multiple'];
     }
 
     protected function getWidgetDefaults()
diff --git a/Resources/views/Form/file_upload.html.twig b/Resources/views/Form/file_upload.html.twig
index fcf05f0d..f398994f 100644
--- a/Resources/views/Form/file_upload.html.twig
+++ b/Resources/views/Form/file_upload.html.twig
@@ -20,26 +20,32 @@
          data-upload-prototype="{{ block('file_upload_progress_prototype')|e }}">
         <div class="fileinput-entries">
             {%- if value is not empty %}
-                {%- set file = value %}
-                {%- block file_upload_entry_prototype %}
-                    {%- set file = file|default([]) %}
-                    <p class="template-download">
-                        <input type="hidden" name="{{ full_name }}" value="{{ file.id|default }}"/>
-                        <button class="btn btn-xs btn-danger delete" title="{% trans %}button.delete{% endtrans %}">
-                            {{- irstea_icon('trash') -}}
-                        </button>&nbsp;<span class="name">
-                            <a{% if file %} href="{{ path('file_upload_get', {id: file.id, token: csrfToken}) }}"{% endif %}>{{ file.originalFilename|default }}</a>
-                        </span>&nbsp;(<span class="size">
-                            {{- file.size|default -}}
-                        </span>)
-                        <span class="error danger"></span>
-                    </p>
-                {% endblock -%}
+                {%- if multiple %}
+                    {% for file in value %}
+                        {{ block('file_upload_entry_prototype') }}
+                    {% endfor %}
+                {%- else %}
+                    {%- set file = value %}
+                    {%- block file_upload_entry_prototype %}
+                        {%- set file = file|default([]) %}
+                        <p class="template-download">
+                            <input type="hidden" name="{{ full_name }}{% if multiple %}[]{% endif %}" value="{{ file.id|default }}"/>
+                            <button class="btn btn-xs btn-danger delete" title="{% trans %}button.delete{% endtrans %}">
+                                {{- irstea_icon('trash') -}}
+                            </button>&nbsp;<span class="name">
+                                <a{% if file %} href="{{ path('file_upload_get', {id: file.id, token: csrfToken}) }}"{% endif %}>{{ file.originalFilename|default }}</a>
+                            </span>&nbsp;(<span class="size">
+                                {{- file.size|default -}}
+                            </span>)
+                            <span class="error danger"></span>
+                        </p>
+                    {% endblock -%}
+                {% endif -%}
             {% endif -%}
         </div>
         <span class="btn btn-primary fileinput-button">
             <span>{{ irstea_icon('upload') }}&nbsp;{% trans %}button.upload{% endtrans %}</span>
-            <input type="file" name="_hack_{{ full_name }}"{% if widget_attr['data-create-url'] %} multiple="multiple"{% endif %}/>
+            <input type="file" name="_hack_{{ full_name }}"{% if multiple %} multiple="multiple"{% endif %}/>
         </span>
     </div>
 {% endblock file_upload_widget %}
-- 
GitLab