Commit c60aeff0 authored by Guillaume Perréal's avatar Guillaume Perréal
Browse files

Gère correctement l'upload de multiples fichiers.

Showing with 62 additions and 28 deletions
+62 -28
...@@ -9,7 +9,9 @@ namespace Irstea\FileUploadBundle\Form\DataTranformer; ...@@ -9,7 +9,9 @@ namespace Irstea\FileUploadBundle\Form\DataTranformer;
use Irstea\FileUploadBundle\Entity\UploadedFile; use Irstea\FileUploadBundle\Entity\UploadedFile;
use Irstea\FileUploadBundle\Service\FileManagerInterface; use Irstea\FileUploadBundle\Service\FileManagerInterface;
use Rhumsaa\Uuid\Uuid;
use Symfony\Component\Form\DataTransformerInterface; use Symfony\Component\Form\DataTransformerInterface;
use Traversable;
/** /**
* Description of UploadedFileTransformer * Description of UploadedFileTransformer
...@@ -39,8 +41,16 @@ class UploadedFileTransformer implements DataTransformerInterface ...@@ -39,8 +41,16 @@ class UploadedFileTransformer implements DataTransformerInterface
*/ */
public function reverseTransform($value) public function reverseTransform($value)
{ {
$result = $value instanceof UploadedFile ? $value : (is_string($value) ? $this->reverseTransformFile($value) : null); if(!$this->multiple) {
return $result; 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 ...@@ -48,27 +58,44 @@ class UploadedFileTransformer implements DataTransformerInterface
*/ */
public function transform($value) public function transform($value)
{ {
$result = $value instanceof UploadedFile ? $this->transformFile($value) : null; if(!$this->multiple) {
return $result; 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 * @param mixed $value
* @return array * @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 * @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;
} }
} }
...@@ -54,7 +54,7 @@ class FileUploadType extends AbstractType ...@@ -54,7 +54,7 @@ class FileUploadType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->setCompound(false); $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) public function buildView(FormView $view, FormInterface $form, array $options)
...@@ -63,6 +63,7 @@ class FileUploadType extends AbstractType ...@@ -63,6 +63,7 @@ class FileUploadType extends AbstractType
$view->vars['widget_attr']['data-create-url'] = $this->router->generate('file_upload_create'); $view->vars['widget_attr']['data-create-url'] = $this->router->generate('file_upload_create');
$view->vars['csrfToken'] = $this->csrfProvider->generateCsrfToken(UploadController::CSRF_INTENTION); $view->vars['csrfToken'] = $this->csrfProvider->generateCsrfToken(UploadController::CSRF_INTENTION);
$view->vars['multiple'] = $options['multiple'];
} }
protected function getWidgetDefaults() protected function getWidgetDefaults()
......
...@@ -20,26 +20,32 @@ ...@@ -20,26 +20,32 @@
data-upload-prototype="{{ block('file_upload_progress_prototype')|e }}"> data-upload-prototype="{{ block('file_upload_progress_prototype')|e }}">
<div class="fileinput-entries"> <div class="fileinput-entries">
{%- if value is not empty %} {%- if value is not empty %}
{%- set file = value %} {%- if multiple %}
{%- block file_upload_entry_prototype %} {% for file in value %}
{%- set file = file|default([]) %} {{ block('file_upload_entry_prototype') }}
<p class="template-download"> {% endfor %}
<input type="hidden" name="{{ full_name }}" value="{{ file.id|default }}"/> {%- else %}
<button class="btn btn-xs btn-danger delete" title="{% trans %}button.delete{% endtrans %}"> {%- set file = value %}
{{- irstea_icon('trash') -}} {%- block file_upload_entry_prototype %}
</button>&nbsp;<span class="name"> {%- set file = file|default([]) %}
<a{% if file %} href="{{ path('file_upload_get', {id: file.id, token: csrfToken}) }}"{% endif %}>{{ file.originalFilename|default }}</a> <p class="template-download">
</span>&nbsp;(<span class="size"> <input type="hidden" name="{{ full_name }}{% if multiple %}[]{% endif %}" value="{{ file.id|default }}"/>
{{- file.size|default -}} <button class="btn btn-xs btn-danger delete" title="{% trans %}button.delete{% endtrans %}">
</span>) {{- irstea_icon('trash') -}}
<span class="error danger"></span> </button>&nbsp;<span class="name">
</p> <a{% if file %} href="{{ path('file_upload_get', {id: file.id, token: csrfToken}) }}"{% endif %}>{{ file.originalFilename|default }}</a>
{% endblock -%} </span>&nbsp;(<span class="size">
{{- file.size|default -}}
</span>)
<span class="error danger"></span>
</p>
{% endblock -%}
{% endif -%}
{% endif -%} {% endif -%}
</div> </div>
<span class="btn btn-primary fileinput-button"> <span class="btn btn-primary fileinput-button">
<span>{{ irstea_icon('upload') }}&nbsp;{% trans %}button.upload{% endtrans %}</span> <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> </span>
</div> </div>
{% endblock file_upload_widget %} {% endblock file_upload_widget %}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment