FileUploadExtension.php 5.76 KiB
<?php declare(strict_types=1);
/*
 * Copyright (C) 2015-2017 IRSTEA
 * All rights reserved.
 */
namespace Irstea\FileUploadBundle\Twig;
use InvalidArgumentException;
use Irstea\FileUploadBundle\Entity\UploadedFile;
use Irstea\FileUploadBundle\Model\UploadedFileInterface;
use Irstea\FileUploadBundle\Service\FileUrlGeneratorInterface;
use Irstea\FileUploadBundle\Utils\MimeTypeIcon;
use NumberFormatter;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Twig_Environment;
use Twig_Extension;
use Twig_SimpleFilter;
use Twig_SimpleFunction;
/** Extension Twig pour les fichiers uploadés.
class FileUploadExtension extends Twig_Extension
    /**
     * @var TranslatorInterface
    private $translator;
    /**
     * @var FileUrlGeneratorInterface
    private $urlGenerator;
    /**
     * @param TranslatorInterface       $translator
     * @param FileUrlGeneratorInterface $urlGenerator
    public function __construct(TranslatorInterface $translator, FileUrlGeneratorInterface $urlGenerator)
        $this->translator = $translator;
        $this->urlGenerator = $urlGenerator;
    /**
     * {@inheritdoc}
    public function getFunctions()
        return [
            new Twig_SimpleFunction(
                'irstea_uploaded_file',
                [$this, 'formatUploadedFile'],
                    'needs_environment' => true,
                    'is_safe'           => ['html'],
            new Twig_SimpleFunction(
                'irstea_file_url',
                [$this, 'generateFileUrl'],
                    'is_safe' => ['html', 'html_attr'],
            new Twig_SimpleFunction(
                'irstea_file_icon',
                [$this, 'formatFileIcon'],
                ['is_safe' => ['html']]
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
), ]; } /** * {@inheritdoc} */ public function getFilters() { return [ new Twig_SimpleFilter( 'irstea_file_size', [$this, 'formatFileSize'], ['needs_context' => true] ), ]; } /** * {@inheritdoc} */ public function getName() { return 'irstea_file_upload'; } /** Genère un tag HTML pour représenter le fichier. * Inclut un lien sécurisé qui permet de télécharger le fichier, mais uniquement à l'utilisateur qui a affiché la page. * Usage : `{{ irstea_uploaded_file(file) }}`. * * @param Twig_Environment $env * @param UploadedFileInterface $file * * @return string */ public function formatUploadedFile(Twig_Environment $env, $file = null) { if (null === $file) { return ''; } elseif ($file instanceof 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]); } /** Genère un URL sécurisée pour télécharger un fichier. * Usage : `{{ irstea_file_path(file.id) }}`. * * @param string $idFile * @param bool|int|string $referenceType * * @return string */ public function generateFileUrl($idFile, $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH) { return $this->urlGenerator->generate($idFile, $referenceType); } /** Génère un tag "icône" Font-Awesome pour le type MIME indiqué. * Usage : `{{ irstea_file_icon(mimeType) }}`. * * @param string $mimeType type MIME * * @return string un tag <i></i> avec les classes Font-Awesome * * @uses \MimeTypeIcon::getMimeTypeIcon */
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
public function formatFileIcon($mimeType) { $icon = MimeTypeIcon::getMimeTypeIcon($mimeType); return sprintf('<i class="icon fa fa-file%s-o"></i>', ($icon && $icon !== 'file') ? ('-' . $icon) : ''); } /** Formate une taille de fichier. * Usage : `{{ size|irstea_file_size([precision][, locale]) }}`. * * @param array $context contexte Twig * @param int $size taille du fichier * @param int $precision nombre de chiffres après la virgule * @param string $locale Langue * * @return string * * @uses \NumberFormatter */ public function formatFileSize($context, $size, $precision = null, $locale = null) { if (!is_numeric($size)) { return ''; } if ($size > 1000000000) { $size /= 1000000000.0; $defaultPrecision = 2; $unit = 'Gi'; } elseif ($size > 1000000) { $size /= 1000000.0; $defaultPrecision = 1; $unit = 'Mi'; } elseif ($size > 1000) { $size /= 1000.0; $defaultPrecision = 1; $unit = 'Ki'; } else { $unit = ''; $defaultPrecision = 0; } if (null === $locale) { $locale = $context['app']->getRequest()->getLocale(); } $formatter = NumberFormatter::create($locale, NumberFormatter::DECIMAL); $formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $precision ?? 0); $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $precision ?? $defaultPrecision); return $this->translator->trans( 'file_size(%size%,%unit%)', [ '%size%' => $formatter->format($size), '%unit%' => $unit, ], 'file_upload', $locale ); } }