EasyAdmin 3 — Tips : Télécharger plusieurs images (sans bundle ni solutions tierces)

Joey Barbier
3 min readMar 21, 2021

--

On va voir ensemble, comment mettre rapidement en place le téléchargement de plusieurs images, sans rajouter de bundle ou de solutions tierces depuis Easy Admin 3Symfony 5.

EasyAdmin 3 — Symfony 5

Je pars d’une entité déjà gérée par EasyAdmin (cf. doc).

— Le model.

//myProject/src/Entity/MonModel.php/**
*
@ORM\Column(type="array")
*/
private $images = [];

Rajouter une nouvelle propriété $images” de type “Array

Depuis votre terminal : “bin/console m:e

— Le controller

Ajouter simplement votre nouvel input dans la méthode “configureFields”, en précisant “multiple” à true :

$images = ImageField::new('images')
->setFormTypeOptions([
"multiple" => true,
"attr" => [
"accept" => "image/x-png,image/gif,image/jpeg"
],
])
->setBasePath('uploads/images/cars')
->setUploadDir('public/uploads/images/cars')
->setUploadedFileNamePattern("[randomhash].[extension]");

Sans oublier de rajouter “$images” au “return” de la méthode.

— Les templates

Dans un premier temps, ajoutez dans “src/Twig” cette extension afin d’avoir un filtre “md5

<?php

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class AppExtension extends AbstractExtension
{
public function getFilters()
{
return [
new TwigFilter('md5', [$this, 'md5']),
];
}

public function md5($str)
{
return md5($str);
}
}

Nous allons overrider deux templates d’EasyAdmin. Pour ce faire, vous créez les dossiers suivants dans “myProject/templates” :

bundles/EasyAdminBundle/crud/field

Dans le dossier “field” nous allons overrider : “image.html.twig

{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #}
{# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #}
{# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #}
{% set values = field.formattedValue %}
{% if values is not iterable %}
{% set values = [field.formattedValue] %}
{% endif %}
{% if ea.crud.currentPage == "index" %}
{% set values = values|slice(0,1) %}
{% endif %}
{% for value in values %}
{% set _lightbox_id = value|md5 %}
<a href="#" class="ea-lightbox-thumbnail" data-featherlight="#{{ _lightbox_id }}" data-featherlight-close-on-click="anywhere">
<img src="{{ asset(value) }}" class="img-fluid">
</a>
<div id="{{ _lightbox_id }}" class="ea-lightbox">
<img src="{{ asset(value) }}">
</div>
{% endfor %}

Le test “ {% if ea.crud.currentPage == “index” %} ” est utilisé pour afficher une seule image sur la page d’index, à vous d’adapter ce code selon votre besoin.

Pour le second override, celui-ci permet d’afficher une preview des images dans le formulaire d’édition.

Affichage de base
Après override

La modification est donc optionnelle.

Dans le dossier “crud” nous allons overrider : “form_theme.html.twig

Vous pouvez récupérer le fichier d’origine à cet emplacement :

myProject/vendor/easycorp/easyadmin-bundle/src/Resources/views/crud/form_theme.html.twig

Une fois le fichier copier-coller.

Dans : “myProject/templates/bundles/EasyAdminBundle/crud

La partie qui nous intéresse se trouve ligne 605.

Dans le bloc “ea_fileupload_widget”, à l’intérieur du if “ {% if multiple and currentFiles %}

{% for file in currentFiles %}
<tr>
<td>
{# OVERRIDE --------> #}
{% if download_path and file.extension in ["jpg", "png", "gif"] %}
{% set _lightbox_id = 'ea-lightbox-' ~ file.filename|md5 %}
<a href="#" class="ea-lightbox-thumbnail" data-featherlight="#{{ _lightbox_id }}"
data-featherlight-close-on-click="anywhere">
<img class="img-fluid" src="{{ asset(download_path ~ file.filename) }}">
{{ file.filename }}
</a>
<div id="{{ _lightbox_id }}" class="ea-lightbox">
<img alt="{{ file.filename }}" src="{{ asset(download_path ~ file.filename) }}">
</div>
{% else %}
{% if download_path %}<a href="{{ asset(download_path ~ file.filename) }}">{% endif %}
<span title="{{ file.mTime|date }}">
<i class="fa fa-file-o"></i> {{ file.filename }}
</span>
{% if download_path %}</a>{% endif %}
{% endif %}
{# OVERRIDE <-------- #}
</td>
<td class="text-right file-size">{{ file.size|ea_filesize }}</td>
</tr>
{% endfor %}

— Le CSS

Rajoutons un peu de style dans tout ça :

// Limiter la height dans la modal - (optionnel)
.ea-lightbox
img
max-height: 75vh
width: auto
// thumbnail
.ea-lightbox-thumbnail
img
max-height: 30vh
max-width: 30vh
width: auto
// Uniquement si vous avez overridé le 2eme template - (optionnel)
.fileupload-table
.ea-lightbox-thumbnail
img
max-width: 30%

J’en ai profité pour limiter la height des images, dans le but de ne plus avoir de scroll dans la modal “lightbox”.

— Enjoy !

--

--

Joey Barbier

Lead Tech iOS. Consultant et développeur pour applications iOS en remote depuis Lille. https://www.joeybarbier.com