diff --git a/Resources/config/services.yml b/Resources/config/services.yml index fcd95e88ec1b564bacc40cfe09392fabcecb39dd..1e876af811ada236339f7840835c644d76022f75 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -66,3 +66,11 @@ services: - @cl_tissue.scanner tags: - { name: kernel.event_listener, event: file_upload.complete, method: onFileUploadCompleted } + + # Extension Twig + irstea_file_upload.twig_extension: + class: Irstea\FileUploadBundle\Twig\FileUploadExtension + arguments: + - @translator + tags: + - { name: twig.extension } diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml index d24d13e9faf5daccadd925a1d353f78eea2ed4b7..4a06d254c94f3591f6777528bb588bd814aa157c 100644 --- a/Resources/translations/messages.fr.yml +++ b/Resources/translations/messages.fr.yml @@ -7,3 +7,6 @@ form: max_number_of_files(%num%): %num% fichiers maximum min_file_size: Taille minimale max_file_size: Taille maximale + +file_upload: + file_size(%size%,%unit%): %size% %unit%o diff --git a/Resources/views/Extension/uploaded_file.html.twig b/Resources/views/Extension/uploaded_file.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..3b929a1f156a62fa8b1273dd52a44b0c0432cca6 --- /dev/null +++ b/Resources/views/Extension/uploaded_file.html.twig @@ -0,0 +1,17 @@ +{%- spaceless %} + <span class="uploaded-file"> + {{- irstea_file_icon(file.type|default(null)) -}} + <span class="name"> + <a href="{{ + path('file_upload_get_content', { + 'id': file.id|default('__id__'), + 'token': csrf_token(constant('Irstea\\FileUploadBundle\\Controller\\UploadController::CSRF_INTENTION')) + }) + }}"> + {{- file.name|default('') -}} + </a> + </span> (<span class="size"> + {{- file.size|default(0)|irstea_file_size -}} + </span>) + </span> +{% endspaceless -%} diff --git a/Twig/FileUploadExtension.php b/Twig/FileUploadExtension.php new file mode 100644 index 0000000000000000000000000000000000000000..51f6294167ede18d1d644ffd99412d5a2af7f66f --- /dev/null +++ b/Twig/FileUploadExtension.php @@ -0,0 +1,137 @@ +<?php + +/* + * Copyright (C) 2015 IRSTEA + * All rights reserved. + */ + +namespace Irstea\FileUploadBundle\Twig; + +use Irstea\FileUploadBundle\Model\UploadedFileInterface; +use Irstea\FileUploadBundle\Utils\MimeTypeIcon; +use \NumberFormatter; +use Symfony\Component\Translation\TranslatorInterface; +use Twig_Environment; +use Twig_Extension; +use Twig_SimpleFilter; +use Twig_SimpleFunction; + +/** + * Description of FileUploadExtension + * + * @author Guillaume Perréal <guillaume.perreal@irstea.fr> + */ +class FileUploadExtension extends Twig_Extension +{ + /** + * + * @var TranslatorInterface + */ + private $translator; + + /** + * + * @param TranslatorInterface $translator + */ + public function __construct(TranslatorInterface $translator) + { + $this->translator = $translator; + } + + public function getFunctions() + { + return [ + new Twig_SimpleFunction( + 'irstea_uploaded_file', + [$this, 'formatUploadedFile'], + [ + 'needs_environment' => true, + 'is_safe' => ['html'] + ] + ), + new Twig_SimpleFunction( + 'irstea_file_icon', + [$this, 'formatFileIcon'], + ['is_safe' => ['html']] + ), + ]; + } + + public function getFilters() + { + return [ + new Twig_SimpleFilter( + 'irstea_file_size', + [$this, 'formatFileSize'], + ['needs_context' => true] + ), + ]; + } + + public function getName() + { + return "irstea_file_upload"; + } + + public function formatUploadedFile(Twig_Environment $env, $file = null) + { + if(null === $file) { + return ''; + } elseif($file instanceof \Irstea\FileUploadBundle\Entity\UploadedFile) { + $file = $file->toArray(); + } elseif(!is_array($file)) { + throw new \InvalidArgumentException("irstea_uploaded_file expects an UploadedFile instance, array or null"); + } + + return $env->render('IrsteaFileUploadBundle:Extension:uploaded_file.html.twig', ['file' => $file]); + } + + public function formatFileIcon($mimeType) + { + $icon = MimeTypeIcon::getMimeTypeIcon($mimeType); + return sprintf('<i class="icon fa fa-file%s-o"></i>', ($icon && $icon !== 'file') ? ('-'.$icon) : ''); + } + + public function formatFileSize($context, $size, $precision = null, $locale = null) + { + if(!is_numeric($size)) { + return ''; + } + + if($size > 1000000000) { + $size /= 1000000000.0; + $unit = 'Gi'; + } elseif($size > 1000000) { + $size /= 1000000.0; + $unit = 'Mi'; + } elseif($size > 1000) { + $size /= 1000.0; + $unit = 'Ki'; + } else { + $unit = ''; + } + + if(null === $locale) { + $locale = $context['app']->getRequest()->getLocale(); + } + + $formatter = NumberFormatter::create($locale, NumberFormatter::DECIMAL); + if(null !== $precision) { + $formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $precision); + $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $precision); + } else { + $formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 0); + $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2); + } + + return $this->translator->trans( + 'file_upload.file_size(%size%,%unit%)', + [ + '%size%' => $formatter->format($size), + '%unit%' => $unit, + ], + null, + $locale + ); + } +}