Browse Source

Merge branch 'issue175'

fix #175
pull/182/head
Maïeul 7 months ago
parent
commit
7708a7c112
  1. 12
      formulaires/construire_formulaire.html
  2. 71
      formulaires/construire_formulaire.php
  3. 10
      formulaires/saisies_cvt.php
  4. 73
      inc/saisies_verifier.php
  5. 4
      lang/saisies_fr.php
  6. 46
      verifier/valeurs_acceptables.php
  7. 2
      verifier/valeurs_acceptables.yaml

12
formulaires/construire_formulaire.html

@ -168,18 +168,6 @@
.end()
.end();
// Gérer la liste des vérifications
$('.liste_verifications').each(function(){
var $options = $(this).siblings('.options_verifier').hide();
var $select = $(this).find('select');
$select
.change(function(){
var montrer = $(this).val() ? $(this).val() : 'soigfeg';
$options.#CONST{_SAISIES_AFFICHER_SI_JS_HIDE}.filter('.'+montrer).#CONST{_SAISIES_AFFICHER_SI_JS_SHOW};
})
.change();
});
// On déplie toujours les fieldsets plés par défaut
$('.fieldset.plie').each(function(){

71
formulaires/construire_formulaire.php

@ -246,9 +246,12 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in
'options' => array(
'nom' => "saisie_modifiee_${nom}[verifier][type]",
'label' => _T('saisies:construire_verifications_label'),
'option_intro' => _T('saisies:construire_verifications_aucune'),
'cacher_option_intro' => True,
'conteneur_class' => 'liste_verifications',
'data' => array()
'data' => array(),
'class' => 'select2',
'attributs' => 'style="width:100%"', //Contourne bug d'affichage select2 la première fois qu'une saisie est éditée
'multiple' => true
)
);
}
@ -261,7 +264,9 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in
'options' => array(
'nom' => 'options',
'label' => $verif['titre'],
'conteneur_class' => "$type_verif options_verifier"
'explication' => $verif['description'] ?? '',
'conteneur_class' => "$type_verif options_verifier",
'afficher_si' => "@saisie_modifiee_${nom}[verifier][type]@ IN '$type_verif'"
),
'saisies' => $verif['options']
);
@ -302,13 +307,9 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in
}
}
// On regarde s'il a été demandé un type de vérif
if (isset($saisie_modifiee['verifier']['type'])
and (($type_verif = $saisie_modifiee['verifier']['type']) != '')
and $verif_options[$type_verif]) {
// On ne vérifie que les options du type demandé
$vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies']));
}
// On regarde s'il a été demandé des vérifs, et on vérifie les options des vérif (!)
// Note : les options de verif sont en afficher_si, donc ne sont vérifié que celles des vérifs choisies.
$vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options));
}
// On insère chaque saisie des options de verification
@ -426,12 +427,15 @@ function formulaires_construire_formulaire_traiter($identifiant, $formulaire_ini
}
// On regarde s'il y a des options de vérification à modifier
if (isset($saisie_modifiee['verifier']['type'])
and ($type_verif = $saisie_modifiee['verifier']['type']) != '') {
$saisie_modifiee['verifier'] = array(
'type' => $type_verif,
'options' => $saisie_modifiee['verifier'][$type_verif]
);
if (isset($saisie_modifiee['verifier']['type'])) {
$verifier_format_api = [];
foreach ($saisie_modifiee['verifier']['type'] as $type_verif) {
$verifier_format_api[] = [
'type' => $type_verif,
'options' => $saisie_modifiee['verifier'][$type_verif] ?? []
];
}
$saisie_modifiee['verifier'] = $verifier_format_api;
} else {
unset($saisie_modifiee['verifier']);
}
@ -480,12 +484,17 @@ function construire_formulaire_transformer_nom(&$valeur, $cle, $transformation)
// Applique une transformation à la valeur de tous les champs "afficher_si" d'un formulaire, y compris loin dans l'arbo
function construire_formulaire_transformer_afficher_si(&$valeur, $cle, $transformation) {
if ($cle == 'afficher_si' and is_string($valeur)) {
$valeur = preg_replace("#@((?!config:)(?!plugin).*)@#U", '@'.$transformation.'[${1}]@', $valeur);
$valeur = preg_replace("#@((?!saisie_modifiee)(?!config:)(?!plugin).*)@#U", '@'.$transformation.'[${1}]@', $valeur);
}
}
// Préparer une saisie pour la transformer en truc configurable
function construire_formulaire_generer_saisie_configurable($saisie, $env) {
/**
* Préparer une saisie pour la transformer en truc configurable
* @param array $saisie description de la saisie
* @param array $env environnement d'appel
* @return string fond du formulaire
**/
function construire_formulaire_generer_saisie_configurable(array $saisie, array $env): string {
// On récupère le nom
$nom = $saisie['options']['nom'];
$identifiant = isset($saisie['identifiant']) ? $saisie['identifiant'] : '';
@ -607,11 +616,27 @@ function construire_formulaire_generer_saisie_configurable($saisie, $env) {
}
} else {
$env2["saisie_modifiee_$nom"] = $env2['_saisies_par_nom'][$nom];
// il n'y a pas toujours de verification...
if (isset($env2["saisie_modifiee_$nom"]['verifier']) and isset($env2["saisie_modifiee_$nom"]['verifier']['type'])) {
$env2["saisie_modifiee_$nom"]['verifier'][ $env2["saisie_modifiee_$nom"]['verifier']['type'] ]
= $env2["saisie_modifiee_$nom"]['verifier']['options'] ?? [];
// Support de l'ancien format avec une seule saisie
if (isset($env2["saisie_modifiee_$nom"]['verifier']['type'])) {
$env2["saisie_modifiee_$nom"]['verifier'] = [
[
'type' => $env2["saisie_modifiee_$nom"]['verifier']['type'],
'options' => $env2["saisie_modifiee_$nom"]['verifier']['options'] ?? []
]
];
}
// Puis convertir le tableau depuis le format API vers le format constructeur
$verif_format_constructeur = ['type' => []];
foreach ($env2["saisie_modifiee_$nom"]['verifier'] ?? [] as $verif) {
$verif_format_constructeur['type'][] = $verif['type'];
$verif_format_constructeur[$verif['type']] = [];
$options_verif = $verif['options'] ?? [];
foreach ($options_verif as $option_verif => $valeur_option_verif) {
$verif_format_constructeur[$verif['type']][$option_verif] = $valeur_option_verif;
}
}
$env2["saisie_modifiee_$nom"]['verifier'] = $verif_format_constructeur;
}
$env2['fond_generer'] = 'inclure/generer_saisies';

10
formulaires/saisies_cvt.php

@ -92,9 +92,15 @@ function formulaires_saisies_cvt_saisies_dist() {
'label' => 'Un message',
'conteneur_class' => 'pleine_largeur',
),
'verifier' => array(
'type' => 'taille',
'options' => array('min' => 10)
array(
'type' => 'taille',
'options' => array('min' => 10)
),
array(
'type' => 'slug',
),
)
),
),

73
inc/saisies_verifier.php

@ -81,27 +81,42 @@ function saisies_verifier($formulaire, $saisies_masquees_empty_string = true, $e
: _T('info_obligatoire');
}
// On continue seulement si ya pas déjà une erreur d'obligation et qu'il y a une demande de verif
$verifier = $saisie['verifier'] ?? false;
if ((!isset($erreurs[$champ]) or !$erreurs[$champ]) and is_array($verifier) and $verifier) {
// 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();
// 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();
$options = array_merge($options, ['_saisie' => $saisie]);
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 {
$normaliser = null;
}
$options = $verifier['options'] ?? array();
if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) {
$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);
spip_log('Demande de vérification, mais fonction inc_verifier inexistante (probablement plugin verifier manquant)', 'saisies'._LOG_ERREUR);
}
} else {
spip_log('Demande de vérification, mais fonction inc_verifier inexistante (probablement plugin verifier manquant)', 'saisies'._LOG_ERREUR);
}
}
}
@ -147,30 +162,20 @@ function saisies_verifier($formulaire, $saisies_masquees_empty_string = true, $e
* @return array table des erreurs modifiés
**/
function saisies_verifier_valeurs_acceptables($saisies, $erreurs) {
$verifier = charger_fonction('valeurs_acceptables', 'verifier');
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;
}
$valeur = saisies_request($saisie);
//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);
if ($erreur = $verifier($valeur, ['_saisie' => $description])) {
$erreurs[$saisie] = $erreur;
}
}
return $erreurs;

4
lang/saisies_fr.php

@ -283,8 +283,8 @@ Vous trouverez la <a href="https://contrib.spip.net/5080" target="_blank" rel="n
'verifier_saisies_option_data_cles_doubles' => 'Au moins une clé est définie en double.',
'verifier_saisies_option_data_sous_groupes_interdits' => 'Syntaxe incorrecte. Les sous-groupes ne sont pas autorisés.',
'verifier_saisies_option_data_verifier_cles_erreurs' => 'Syntaxe incorrecte. Certaines clés ne répondent pas aux critères.',
'verifier_valeurs_acceptables_explication' => 'Vérifier que la valeur postée se trouve parmi celles autorisées lors de la définition des champs. Ne pas utiliser cette option si vous remplissez dynamiquement des champs dans vos squelettes ou les remplissez grâce à javascript.',
'verifier_valeurs_acceptables_label' => 'Vérifier les valeurs acceptables',
'verifier_valeurs_acceptables_explication' => 'Vérifier que la valeur postée se trouve parmi celles autorisées lors de la définition du/des champs. Ne pas utiliser cette option si vous remplissez dynamiquement le(s) champss dans vos squelettes ou les remplissez grâce à javascript.',
'verifier_valeurs_acceptables_label' => 'Vérifier les valeurs possibles',
'vue_sans_reponse' => '<i>Sans réponse</i>',
// Z

46
verifier/valeurs_acceptables.php

@ -0,0 +1,46 @@
<?php
/**
* API de vérification : vérification de la validité des valeurs acceptanles
*
* @plugin saisies
*/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
*
*
*
*
* @param string $valeur
* La valeur à vérifier.
* @return string
* Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
*/
function verifier_valeurs_acceptables_dist($valeur, $options) {
include_spip('inc/saisies_verifier');
$description = $options['_saisie'] ?? [];
if (!$description) {
return '';
}
$erreur = '';
$type = $description['saisie'] ?? '';
$saisie = $description['nom'] ?? '';
if (include_spip("saisies/$type")) {
$f = $type.'_valeurs_acceptables';
if (function_exists($f)) {
if (!$f($valeur, $description)) {
$erreur = _T('saisies:erreur_valeur_inacceptable');
spip_log("Tentative de poste de valeur innaceptable pour $saisie de type $type. Valeur postée : $valeur", "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 $erreur;
}

2
verifier/valeurs_acceptables.yaml

@ -0,0 +1,2 @@
titre: '<:saisies:verifier_valeurs_acceptables_label:>'
description: '<:saisies:verifier_valeurs_acceptables_explication:>'
Loading…
Cancel
Save