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> <span class="name"> - <a{% if file %} href="{{ path('file_upload_get', {id: file.id, token: csrfToken}) }}"{% endif %}>{{ file.originalFilename|default }}</a> - </span> (<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> <span class="name"> + <a{% if file %} href="{{ path('file_upload_get', {id: file.id, token: csrfToken}) }}"{% endif %}>{{ file.originalFilename|default }}</a> + </span> (<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') }} {% 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