Utilisation de la vérificaion de type fichiers pour une saisie personnalisée #139

Open
opened 1 year ago by paidge · 6 comments
paidge commented 1 year ago
Collaborator

Problème :
Je veux créer une saisie personnalisée (par ex : /saisies/ma_saisie.html) avec un input[type=file] et y adjoindre la vérification de type fichiers :

array(
	'saisie' => 'ma_saisie',
	'options' => array(),
	'verifier'=> array(
		'type' => 'fichiers',
		'options' => array()
    )
)

Dans ce cas, la vérification n'est pas prise en compte.

Solution :
A la ligne 184 du fichier inc/saisies_request.php, le plugin vérifie si la saisie concerne un fichier grâce à la fonction saisies_saisie_est_fichier($saisie). Celle-ci vérifie si il s'agit d'une saisie input[type=file] ou d'une saisie fichiers et renvoie un booléen.

Cette fonction devrait en plus vérifier si la VERIFICATION concerne un fichier et non seulement la saisie en elle-même (qui peut être une saisie personnalisée). Pour cela, il faut modifier la ligne 482 du fichier inc/saisies_lister.php par :

$file = (($saisie['saisie'] == 'input' and isset($saisie['options']['type']) and $saisie['options']['type'] == 'file') or $saisie['saisie'] == 'fichiers' or (isset($saisie['verifier']) and isset($saisie['verifier']['type']) and $saisie['verifier']['type'] == 'fichiers'));

**Problème :** Je veux créer une saisie personnalisée (par ex : /saisies/ma_saisie.html) avec un `input[type=file]` et y adjoindre la vérification de type `fichiers` : ``` array( 'saisie' => 'ma_saisie', 'options' => array(), 'verifier'=> array( 'type' => 'fichiers', 'options' => array() ) ) ``` Dans ce cas, la vérification n'est pas prise en compte. **Solution :** [A la ligne 184 du fichier `inc/saisies_request.php`](https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_request.php#L184), le plugin vérifie si la saisie concerne un fichier grâce à la fonction `saisies_saisie_est_fichier($saisie)`. Celle-ci vérifie si il s'agit d'une saisie `input[type=file]` ou d'une saisie `fichiers` et renvoie un booléen. Cette fonction devrait en plus vérifier si la VERIFICATION concerne un fichier et non seulement la saisie en elle-même (qui peut être une saisie personnalisée). Pour cela, il faut modifier [la ligne 482 du fichier `inc/saisies_lister.php`](https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_lister.php#L482) par : `$file = (($saisie['saisie'] == 'input' and isset($saisie['options']['type']) and $saisie['options']['type'] == 'file') or $saisie['saisie'] == 'fichiers' or (isset($saisie['verifier']) and isset($saisie['verifier']['type']) and $saisie['verifier']['type'] == 'fichiers'));`
Owner

Je suis d'accord que ça ne devrait pas être que telle ou telle saisie précise qui est reconnue comme fichiers en dur. En revanche dans les interfaces de contructeurs (utilisé par Formidable et Champs Extras) on peut mettre une vérification à n'importe quel type de champ, si on assigne cette vérif à un radio ou select, faut pas détecter que c'est un fichier non plus. Et d'ailleurs je vois au passage que la vérification fichiers est aussi liée en dur dans le constructeur, pour n'être sélectionnable que pour la saisie "fichiers" et la virer pour les autres.

Donc juste regarde le type du verifier ne suffit pas il me semble, mais ça ne va pas non plus toutes ces assignations en dur dans le code.

Le moyen le plus rapide à implémenter serait de faire encore un autre pipeline pour déclarer quels sont les saisies "file", tout comme il y a un pipeline pour déclarer les saisies "autonomes", etc. Ça fait encore un pipeline en plus pour gérer des exceptions… Mais c'est le plus rapide à faire en tout cas.

Je suis d'accord que ça ne devrait pas être que telle ou telle saisie précise qui est reconnue comme fichiers en dur. En revanche dans les interfaces de contructeurs (utilisé par Formidable et Champs Extras) on peut mettre une vérification à n'importe quel type de champ, si on assigne cette vérif à un radio ou select, faut pas détecter que c'est un fichier non plus. Et d'ailleurs je vois au passage que la vérification fichiers est aussi liée en dur dans le constructeur, pour n'être sélectionnable que pour la saisie "fichiers" et la virer pour les autres. Donc juste regarde le type du verifier ne suffit pas il me semble, mais ça ne va pas non plus toutes ces assignations en dur dans le code. Le moyen le plus rapide à implémenter serait de faire *encore un autre* pipeline pour déclarer quels sont les saisies "file", tout comme il y a un pipeline pour déclarer les saisies "autonomes", etc. Ça fait encore un pipeline en plus pour gérer des exceptions… Mais c'est le plus rapide à faire en tout cas.
Poster
Collaborator

Si le développeur assigne une vérification de type fichiers sur sa saisie, il est sûr que c'est un input file et donc je trouve que c'est suffisant.

Si le développeur assigne une vérification de type `fichiers` sur sa `saisie`, il est **sûr** que c'est un `input file` et donc je trouve que c'est suffisant.
Owner

Mais non, relis le message précédent, les saisies et les vérifications, c'est aussi (et même en premier lieu à la base) pour générer les interfaces de contructeur de formulaires (Formidable, Champs Extras…). Donc non n'importe qui peut assigner ça à une saisie en théorie, pas du tout "un dév". (modulo le fait que là c'est bloqué en dur dans le code à telle saisie justement)

Mais non, relis le message précédent, les saisies et les vérifications, c'est aussi (et même en premier lieu à la base) pour générer les interfaces de contructeur de formulaires (Formidable, Champs Extras…). Donc non *n'importe qui* peut assigner ça à une saisie en théorie, pas du tout "un dév". (modulo le fait que là c'est bloqué en dur dans le code à telle saisie justement)
Poster
Collaborator

Je crois comprendre. N'importe qui peut attribuer une vérification de type fichiers sur n'importe quel type de saisie même de simple input ? Alors peut-être que la fonction saisies_get_valeur_saisie de inc/saisies_request.php en plus de ma proposition pourrait devenir :

function saisies_get_valeur_saisie($saisie, $valeurs = null) {
	$champ = $saisie['options']['nom'];
	$file = saisies_saisie_est_fichier($saisie);
	$valeur = saisies_request_from_FILES($champ);
	
	if (is_null($valeur) and !$file) {
		$valeur = saisies_request($champ, $valeurs);
		
		if (is_array($valeur)) {
			$valeur = array_filter($valeur);
		}
	}
	return $valeur;
}
Je crois comprendre. N'importe qui peut attribuer une vérification de type `fichiers` sur n'importe quel type de `saisie` même de simple `input` ? Alors peut-être que [la fonction `saisies_get_valeur_saisie` de inc/saisies_request.php](https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_request.php#L182) en plus de ma proposition pourrait devenir : ``` function saisies_get_valeur_saisie($saisie, $valeurs = null) { $champ = $saisie['options']['nom']; $file = saisies_saisie_est_fichier($saisie); $valeur = saisies_request_from_FILES($champ); if (is_null($valeur) and !$file) { $valeur = saisies_request($champ, $valeurs); if (is_array($valeur)) { $valeur = array_filter($valeur); } } return $valeur; } ```
Owner

pipeline saisie_est_fichier comme on a saisie_est_tabulaire ou saisies_fichier comme on a saisies_autonomes ?

  • la première permet de faire varier le résultat selon la conf de la saisie en question (ca prend la description de la saisie et ca renvoie true/false)
  • la seconde pas (c'est juste un tableau en entrée)
pipeline `saisie_est_fichier` comme on a `saisie_est_tabulaire` ou `saisies_fichier` comme on a `saisies_autonomes` ? - la première permet de faire varier le résultat selon la conf de la saisie en question (ca prend la description de la saisie et ca renvoie true/false) - la seconde pas (c'est juste un tableau en entrée)
Owner

Tant qu'il n'y a besoin de savoir tout ça qu'après un postage (au moment où on valide les formulaires), alors la solution pourrait être bien plus simple : quand on cherche les vérifs d'un champ "truc", il suffit de regarder avec isset() s'il est dans $FILES. Si c'est le cas, c'est que c'était un fichier. :)

Enfin ya peut-être un soucis pour le test d'obligation, car dans ce cas ya peut être pas FILES['truc'], à tester

Tant qu'il n'y a besoin de savoir tout ça qu'après un postage (au moment où on valide les formulaires), alors la solution pourrait être bien plus simple : quand on cherche les vérifs d'un champ "truc", il suffit de regarder avec isset() s'il est dans $FILES. Si c'est le cas, c'est que c'était un fichier. :) Enfin ya peut-être un soucis pour le test d'obligation, car dans ce cas ya peut être pas FILES['truc'], à tester
Sign in to join this conversation.
No Milestone
No Assignees
3 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.