Commit a1e9b749 authored by Eric Pommateau's avatar Eric Pommateau
Browse files

Possibilité de mettre une liste de content-type sur les élements de type file...

Possibilité de mettre une liste de content-type sur les élements de type file dans la définition d'un formulaire d'un flux
parent fc343ce2
......@@ -2,11 +2,17 @@
***Cette version nécessite la version 0.6.0 du générateur SEDA***
## Évolutions
- Possibilité de mettre une liste de content-type sur les élements de type file dans la définition d'un formulaire d'un flux
## Corrections
- Correction du script installation/update-all-connecteur-field-value.php qui n'était pas opérationnel #1026
- Précisions dans le formulaire des données du générateur SEDA (sort final => DUA) #1300
- Ajout de commentaire dans le formulaire des données du générateur SEDA (correspondance SEDA) #1303
- Ajout de commentaire dans le formulaire des données du générateur SEDA (correspondance SEDA) #1303
- la directive content-type n'était prise en compte que pour le premier fichier des élements de type file dans la définition d'un formulaire d'un flux
- Aller sur la liste des dossiers d'un flux sur l'entité racine générait une requête en base de données inutile #1347
## Ajout
......
......@@ -745,11 +745,17 @@ class DonneesFormulaire
return false;
}
}
if ($field->getProperties('content-type')) {
$ctype = $this->getContentType($field->getName(), 0);
if ($ctype && $ctype != $field->getProperties('content-type')) {
$this->lastError = "Le fichier «{$field->getLibelle()}» n'est pas un fichier {$field->getProperties('content-type')} ($ctype trouvé)";
return false;
if ($field->hasContentType()) {
$file_list = $this->get($field->getName());
if (! $file_list || ! $field->isFile()) {
$file_list = [];
}
foreach ($file_list as $file_num => $file_name) {
$ctype = $this->getContentType($field->getName(), $file_num);
if ($ctype && !in_array($ctype, $field->getContentType())) {
$this->lastError = "Le fichier «{$field->getLibelle()}» n'est pas un fichier {$field->getProperties('content-type')} ($ctype trouvé)";
return false;
}
}
}
if ($field->getType() === 'file' && $this->get($field->getName())) {
......
......@@ -14,6 +14,7 @@ class Field
public const EDIT_ONLY = 'edit-only';
public const MAX_FILE_SIZE = 'max_file_size';
public const MAX_MULTIPLE_FILE_SIZE = 'max_multiple_file_size';
public const CONTENT_TYPE = 'content-type';
public const EMPTY = 'empty';
public const TYPE_FILE = 'file';
......@@ -221,4 +222,19 @@ class Field
{
return $this->getType() === self::TYPE_FILE;
}
public function hasContentType(): bool
{
return (bool) $this->getProperties(self::CONTENT_TYPE);
}
public function getContentType(): array
{
$content_type_list = $this->getProperties(self::CONTENT_TYPE);
if (! $content_type_list) {
return [];
}
$content_type_list = array_map('trim', explode(',', $content_type_list));
return $content_type_list;
}
}
......@@ -168,8 +168,9 @@ element_formulaire:
default: false
content-type:
info: |
Uniquement pour le type fichier.
Indique que le fichier doit avoir le content-type indiqué ici (sinon, le document n'est pas valide).
Permet de spécifier une liste de content-type séparé par une virgule.
Ne fonctionne que pour le type fichier.
Indique que le ou les fichiers doivent avoir un content-type présent dan sla liste (sinon, le document n'est pas valide).
La liste des content-type est maintenue par l'IANA : https://www.iana.org/assignments/media-types/media-types.xhtml
type: string
visionneuse:
......
......@@ -550,4 +550,98 @@ class DonneesFormulaireTest extends PastellTestCase
);
$this->assertEquals('foo', $donnesFormulaire->getFileContent('mon_fichier'));
}
/**
* @throws Exception
*/
public function testContentType()
{
$donneesFormulaire = $this->getCustomDonneesFormulaire(__DIR__ . '/fixtures/definition-with-content-type.yml');
$donneesFormulaire->addFileFromData("fichier_text", "foo.txt", "bar");
$this->assertTrue($donneesFormulaire->isValidable());
}
/**
* @throws Exception
*/
public function testWhenContentTypeIsNotValid()
{
$donneesFormulaire = $this->getCustomDonneesFormulaire(__DIR__ . '/fixtures/definition-with-content-type.yml');
$donneesFormulaire->addFileFromData("fichier_pdf", "foo.txt", "bar");
$this->assertFalse($donneesFormulaire->isValidable());
}
/**
* @throws Exception
*/
public function testWithMultiplePossibleContentType()
{
$donneesFormulaire = $this->getCustomDonneesFormulaire(__DIR__ . '/fixtures/definition-with-content-type.yml');
$donneesFormulaire->addFileFromData("fichier_pdf_or_txt", "foo.txt", "bar");
$this->assertTrue($donneesFormulaire->isValidable());
}
/**
* @throws Exception
*/
public function testWithMultiplePossibleContentTypeWhenContentTypeIsInvalid()
{
$donneesFormulaire = $this->getCustomDonneesFormulaire(
__DIR__ . '/fixtures/definition-with-content-type.yml'
);
$donneesFormulaire->addFileFromCopy(
"fichier_pdf_or_txt",
"foo.xml",
__DIR__ . "/fixtures/HELIOS_SIMU_ALR2_1496987735_826268894.xml"
);
$this->assertFalse($donneesFormulaire->isValidable());
}
/**
* @throws Exception
*/
public function testContentTypeWithMultipleFile()
{
$donneesFormulaire = $this->getCustomDonneesFormulaire(
__DIR__ . '/fixtures/definition-with-content-type.yml'
);
$donneesFormulaire->addFileFromData("fichier_multiple_text", "a.txt", "foo");
$donneesFormulaire->addFileFromData(
"fichier_multiple_text",
"b.txt",
"bar",
1
);
$this->assertTrue($donneesFormulaire->isValidable());
}
/**
* @throws Exception
*/
public function testContentTypeWithMultipleFileWhenFailed()
{
$donneesFormulaire = $this->getCustomDonneesFormulaire(
__DIR__ . '/fixtures/definition-with-content-type.yml'
);
$donneesFormulaire->addFileFromData("fichier_multiple_text", "a.txt", "foo");
$donneesFormulaire->addFileFromCopy(
"fichier_multiple_text",
"foo.xml",
__DIR__ . "/fixtures/HELIOS_SIMU_ALR2_1496987735_826268894.xml",
1
);
$this->assertFalse($donneesFormulaire->isValidable());
}
/**
* @throws Exception
*/
public function testContentTypeOnBadFieldType()
{
$donneesFormulaire = $this->getCustomDonneesFormulaire(
__DIR__ . '/fixtures/definition-with-content-type.yml'
);
$donneesFormulaire->setData("pas_un_fichier", "toto");
$this->assertTrue($donneesFormulaire->isValidable());
}
}
nom: Test
type: Flux de test
description: flux de test, ne pas utiliser.
formulaire:
onglet:
fichier_text:
type: file
content-type: text/plain
fichier_pdf:
type: file
content-type: application/pdf
fichier_pdf_or_txt:
type: file
content-type: application/pdf, text/plain
fichier_multiple_text:
type: file
content-type: text/plain
multiple: true
fichier_multiple_text_or_pdf:
type: file
content-type: text/plain, application/pdf
multiple: true
pas_un_fichier:
type: text
content-type: application/pdf
action:
creation:
name-action: Créer
name: Créé
rule:
no-last-action:
modification:
name-action: Modifier
name: En cours de rédaction
rule:
last-action:
creation
modification
droit_id_u: test:edition
Markdown is supported
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