An error occurred while loading the file. Please try again.
-
Guillaume Perréal authoreda73e273c
<?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
);
}
}