You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

191 lines
7.9 KiB

<?php
/**
* Gestion de la verification des saisies
*
* @package SPIP\Saisies\Verifier
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifier tout un formulaire tel que décrit avec les Saisies
*
* @param array $formulaire Le formulaire à vérifier, c'est à dire un tableau de saisies, avec éventuellement une clé options, comprenant tout les étapes
* @param bool $saisies_empty_string Si TRUE, les saisies masquées selon afficher_si ne seront pas verifiées, leur valeur étant forcée a `''`. Cette valeur est transmise à traiter (via set_request).
* @param $etape l'étape courante à vérifier
* @param array $valeurs Optionnellement un tableau de valeurs à passer à _request plutôt que GET/POST
* @return array Retourne un tableau d'erreurs
*/
function saisies_verifier($formulaire, $saisies_masquees_empty_string = true, $etape = null, $valeurs = null) {
include_spip('inc/verifier');
$verif_fonction = charger_fonction('verifier', 'inc', true);
// Lister les saisies par étapes, si besoin
if (is_numeric($etape)) {
$saisies_par_etapes = saisies_lister_par_etapes($formulaire);
} else {
$saisies_par_etapes = $formulaire;
}
// Enlever les afficher_si non vérifié, si besoin
if ($saisies_masquees_empty_string) {
$saisies_par_etapes_apres_verification_afficher_si = saisies_verifier_afficher_si($saisies_par_etapes, $valeurs);
} else {
$saisies_par_etapes_apres_verification_afficher_si = $saisies_par_etapes;
}
// Trouver les saisies de l'étape courante
if (is_numeric($etape)) {
if (isset($saisies_par_etapes_apres_verification_afficher_si["etape_$etape"])) {
$saisies_etape_courante_apres_verification_afficher_si = $saisies_par_etapes_apres_verification_afficher_si["etape_$etape"]['saisies'];
} else {//Si jamais l'étape courante a été masquée par afficher_si
$saisies_etape_courante_apres_verification_afficher_si = array();
}
} else {
$saisies_etape_courante_apres_verification_afficher_si = $saisies_par_etapes_apres_verification_afficher_si;
}
// On passe à une liste par nom
$saisies_etape_courante_apres_verification_afficher_si_par_nom = saisies_lister_par_nom($saisies_etape_courante_apres_verification_afficher_si);
// Vérifier si c'est obligatoire
$erreurs = array();
// On parcourt chacune des saisies
foreach ($saisies_etape_courante_apres_verification_afficher_si_par_nom as $saisie) {
$champ = $saisie['options']['nom'];
$valeur = saisies_get_valeur_saisie($saisie, $valeurs);
$obligatoire = $saisie['options']['obligatoire'] ?? '';
$file = saisies_saisie_est_fichier($saisie);
// On commence par vérifier l'obligation, seulement si demandé
if (
$obligatoire
and $obligatoire != 'non'
and (
($file and $valeur==null)
or (!$file and (
is_null($valeur)
or (is_string($valeur) and trim($valeur) == '')
or (is_array($valeur) and count($valeur) == 0)
))
)
) {
$erreurs[$champ] =
(isset($saisie['options']['erreur_obligatoire']) and $saisie['options']['erreur_obligatoire'])
? _T_ou_typo($saisie['options']['erreur_obligatoire'])
: _T('info_obligatoire');
}
// S'il y a une erreur d'obligation, on passe à la saisie suivante
if (isset($erreurs[$champ]) and $erreurs[$champ]) {
continue;
}
$verifier_tous = $saisie['verifier'] ?? [];
// Compatibilité historique avec les vieux appels
if (isset($verifier_tous['type'])) {
$verifier_tous = [$verifier_tous];
}
//Boucle sur toutes les verif
foreach ($verifier_tous as $verifier) {
if (is_array($verifier) and $verifier) {//Sécurité d'appel
// Si on fait une vérification de type fichiers, il n'y a pas vraiment de normalisation, mais un retour d'erreur fichiers par fichiers
if ($verif_fonction) {
if ($verifier['type'] == 'fichiers') {
$normaliser = array();
} else {
$normaliser = null;
}
$options = $verifier['options'] ?? array();
if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) {
if (isset($erreurs[$champ])) {
$erreurs[$champ] .= '<br />'.$erreur_eventuelle;
} else {
$erreurs[$champ] = $erreur_eventuelle;
}
// Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur
}
// S'il n'y a pas d'erreur et que la variable de normalisation a été remplie, on l'injecte dans le POST
elseif (!is_null($normaliser) and $verifier['type'] != 'fichiers') {
saisies_set_request($champ, $normaliser, $valeurs);
}
} else {
spip_log('Demande de vérification, mais fonction inc_verifier inexistante (probablement plugin verifier manquant)', 'saisies'._LOG_ERREUR);
}
}
}
}
// On passe nos résultats à un pipeline
$erreurs = pipeline(
'saisies_verifier',
array(
'args'=>array(
'formulaire' => $formulaire,
'saisies' => $saisies_etape_courante_apres_verification_afficher_si_par_nom,
'saisies_par_etapes' => $saisies_par_etapes,
'saisies_par_etapes_apres_verification_afficher_si' => $saisies_par_etapes_apres_verification_afficher_si,
'saisies_etape_courante_apres_verification_afficher_si' => $saisies_etape_courante_apres_verification_afficher_si,
'saisies_masquees_empty_string' => $saisies_masquees_empty_string,
'etape' => $etape,
'valeurs' => $valeurs,
),
'data' => $erreurs
)
);
//S'il n'y a pas d'erreur, et seulement si on vient de franchir la dernière étape, on vide les afficher_si)
if (empty($erreurs) and ($etape === count($saisies_par_etapes) and !_request('aller_a_etape', $valeurs)) or (!$etape)) {
saisies_afficher_si_masquees_set_request_empty_string($saisies_par_etapes, $valeurs);
}
// Vérifier que les valeurs postées sont acceptables, à savoir par exemple que pour un select, ce soit ce qu'on a proposé. On vérifie cela en tout dernier, après le vidage des afficher_si car certainses saisies peuvent avoir des valeurs acceptables qui dépendant des afficher_si (exemple : les saisies calculs). Si jamais on a une valeur innacceptable, c'est que la personne a triché sur le POST en truandant le HTML, donc on s'en fiche si en retour son formulaire d'erreur n'est pas cohérent.
if (isset($formulaire['options']['verifier_valeurs_acceptables'])
and $formulaire['options']['verifier_valeurs_acceptables']
) {
$erreurs = saisies_verifier_valeurs_acceptables($saisies_etape_courante_apres_verification_afficher_si_par_nom, $erreurs);
}
return $erreurs;
}
/**
* Vérifier que les valeurs postées sont acceptables,
* c'est-à-dire qu'elles ont été proposées lors de la conception de la saisie.
* Typiquement pour une saisie radio, vérifier que les gens n'ont pas postée une autre fleur.
* @param $saisies array tableau général des saisies, déjà aplati, classé par nom de champ
* @param $erreurs array tableau des erreurs
* @return array table des erreurs modifiés
**/
function saisies_verifier_valeurs_acceptables($saisies, $erreurs) {
foreach ($saisies as $saisie => $description) {
$type = $description['saisie'];
// Pas la peine de vérifier si par ailleurs il y a déjà une erreur
if (isset($erreurs[$saisie])) {
continue;
}
//Il n'y a rien à vérifier sur une description / fieldset
if (in_array($description['saisie'], array('explication','fieldset'))) {
continue;
}
if (include_spip("saisies/$type")) {
$f = $type.'_valeurs_acceptables';
if (function_exists($f)) {
$valeur = saisies_request($saisie);
if (!$f($valeur, $description)) {
$erreurs[$saisie] = _T("saisies:erreur_valeur_inacceptable");
spip_log("Tentative de poste de valeur innaceptable pour $saisie de type $type. Valeur postée : ".print_r(_request($saisie), true), "saisies"._LOG_AVERTISSEMENT);
}
} else {
spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", "saisies"._LOG_INFO);
}
} else {
spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", "saisies"._LOG_INFO);
}
}
return $erreurs;
}