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

Ajout d'un service et d'une fonction Twig pour générer des URLs pour les fichiers.

Service: irstea_file_upload.url_generator
Fonction Twig: irstea_file_path(file.id, referenceType=false)
Showing with 129 additions and 12 deletions
+129 -12
...@@ -71,5 +71,13 @@ services: ...@@ -71,5 +71,13 @@ services:
class: Irstea\FileUploadBundle\Twig\FileUploadExtension class: Irstea\FileUploadBundle\Twig\FileUploadExtension
arguments: arguments:
- @translator - @translator
- @irstea_file_upload.url_generator
tags: tags:
- { name: twig.extension } - { name: twig.extension }
# Générateur d'URL
irstea_file_upload.url_generator:
class: Irstea\FileUploadBundle\Service\FileUrlGenerator
arguments:
- @router
- @security.csrf.token_manager
...@@ -2,14 +2,7 @@ ...@@ -2,14 +2,7 @@
<span class="uploaded-file"> <span class="uploaded-file">
{{- irstea_file_icon(file.type|default(null)) -}} {{- irstea_file_icon(file.type|default(null)) -}}
&nbsp;<span class="name"> &nbsp;<span class="name">
<a href="{{ <a href="{{ irstea_file_url(file.id|default('__id__')) }}">{{ file.name|default('') }}</a>
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>&nbsp;(<span class="size"> </span>&nbsp;(<span class="size">
{{- file.size|default(0)|irstea_file_size -}} {{- file.size|default(0)|irstea_file_size -}}
</span>) </span>)
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\Service;
use Irstea\FileUploadBundle\Controller\UploadController;
use Irstea\FileUploadBundle\Model\UploadedFileInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
/**
* Implémentation de FileUrlInterface utilisant les services de Symfony.
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
*/
class FileUrlGenerator implements FileUrlGeneratorInterface
{
/**
* @var UrlGeneratorInterface
*/
protected $urlGenerator;
/**
* @var CsrfTokenManagerInterface
*/
protected $tokenManager;
/**
* @param UrlGeneratorInterface $urlGenerator
* @param CsrfTokenManagerInterface $tokenManager
*/
public function __construct(UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $tokenManager)
{
$this->urlGenerator = $urlGenerator;
$this->tokenManager = $tokenManager;
}
/**
* {@inheritdoc}
*/
public function generate($idFile, $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)
{
$token = $this->tokenManager->getToken(UploadController::CSRF_INTENTION);
$url = $this->urlGenerator->generate(
'file_upload_get_content',
['id' => $idFile, 'token' => $token->getValue()],
$referenceType
);
return $url;
}
}
<?php
/*
* Copyright (C) 2015 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\Service;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Service générant/vérifiant une URL pour un fichier.
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
*/
interface FileUrlGeneratorInterface
{
/**
* Génère une URL sécurisée pour un fichier.
*
* @param string $idFile Identifiant du fichier pour lequel générer l'URL.
* @param string|bool $referenceType Type d'URL à générer.
* @return string L'url générée.
*/
public function generate($idFile, $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH);
}
...@@ -10,9 +10,13 @@ ...@@ -10,9 +10,13 @@
namespace Irstea\FileUploadBundle\Twig; namespace Irstea\FileUploadBundle\Twig;
use InvalidArgumentException;
use Irstea\FileUploadBundle\Entity\UploadedFile;
use Irstea\FileUploadBundle\Model\UploadedFileInterface; use Irstea\FileUploadBundle\Model\UploadedFileInterface;
use Irstea\FileUploadBundle\Service\FileUrlGeneratorInterface;
use Irstea\FileUploadBundle\Utils\MimeTypeIcon; use Irstea\FileUploadBundle\Utils\MimeTypeIcon;
use \NumberFormatter; use NumberFormatter;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Translation\TranslatorInterface;
use Twig_Environment; use Twig_Environment;
use Twig_Extension; use Twig_Extension;
...@@ -29,13 +33,19 @@ class FileUploadExtension extends Twig_Extension ...@@ -29,13 +33,19 @@ class FileUploadExtension extends Twig_Extension
*/ */
private $translator; private $translator;
/**
* @var FileUrlGeneratorInterface
*/
private $urlGenerator;
/** /**
* *
* @param TranslatorInterface $translator * @param TranslatorInterface $translator
*/ */
public function __construct(TranslatorInterface $translator) public function __construct(TranslatorInterface $translator, FileUrlGeneratorInterface $urlGenerator)
{ {
$this->translator = $translator; $this->translator = $translator;
$this->urlGenerator = $urlGenerator;
} }
/** /**
...@@ -52,6 +62,13 @@ class FileUploadExtension extends Twig_Extension ...@@ -52,6 +62,13 @@ class FileUploadExtension extends Twig_Extension
'is_safe' => ['html'] 'is_safe' => ['html']
] ]
), ),
new Twig_SimpleFunction(
'irstea_file_url',
[$this, 'generateFileUrl'],
[
'is_safe' => ['html', 'html_attr']
]
),
new Twig_SimpleFunction( new Twig_SimpleFunction(
'irstea_file_icon', 'irstea_file_icon',
[$this, 'formatFileIcon'], [$this, 'formatFileIcon'],
...@@ -97,15 +114,30 @@ class FileUploadExtension extends Twig_Extension ...@@ -97,15 +114,30 @@ class FileUploadExtension extends Twig_Extension
{ {
if(null === $file) { if(null === $file) {
return ''; return '';
} elseif($file instanceof \Irstea\FileUploadBundle\Entity\UploadedFile) { } elseif($file instanceof UploadedFile) {
$file = $file->toArray(); $file = $file->toArray();
} elseif(!is_array($file)) { } elseif(!is_array($file)) {
throw new \InvalidArgumentException("irstea_uploaded_file expects an UploadedFile instance, array or null"); throw new InvalidArgumentException("irstea_uploaded_file expects an UploadedFile instance, array or null");
} }
return $env->render('IrsteaFileUploadBundle:Extension:uploaded_file.html.twig', ['file' => $file]); 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 string|bool $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é. /** Génère un tag "icône" Font-Awesome pour le type MIME indiqué.
* *
* Usage : `{{ irstea_file_icon(mimeType) }}` * Usage : `{{ irstea_file_icon(mimeType) }}`
......
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