/** * Vérifier tout un formulaire tel que décrit avec les Saisies * * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies * @param bool $saisies_masquees_nulles Si TRUE, les saisies masquées selon afficher_si ne seront pas verifiées, leur valeur étant forcée a NULL. Cette valeur NULL est transmise à traiter (via set_request). * @return array Retourne un tableau d'erreurs */ function saisies_verifier($formulaire, $saisies_masquees_nulles = true) { include_spip('inc/verifier'); $erreurs = array(); $verif_fonction = charger_fonction('verifier', 'inc', true); if ($saisies_masquees_nulles) { $formulaire = saisies_verifier_afficher_si($formulaire); } $saisies = saisies_lister_par_nom($formulaire); foreach ($saisies as $saisie) { $obligatoire = isset($saisie['options']['obligatoire']) ? $saisie['options']['obligatoire'] : ''; $champ = $saisie['options']['nom']; $file = ($saisie['saisie'] == 'input' and isset($saisie['options']['type']) and $saisie['options']['type'] == 'file'); $verifier = isset($saisie['verifier']) ? $saisie['verifier'] : false; // Si le nom du champ est un tableau indexé, il faut parser ! if (preg_match('/([\\w]+)((\\[[\\w]+\\])+)/', $champ, $separe)) { $valeur = _request($separe[1]); preg_match_all('/\\[([\\w]+)\\]/', $separe[2], $index); // On va chercher au fond du tableau foreach ($index[1] as $cle) { $valeur = isset($valeur[$cle]) ? $valeur[$cle] : null; } } else { // Sinon la valeur est juste celle du nom $valeur = _request($champ); } // Pour la saisie "destinataires" il faut filtrer si jamais on a mis un premier choix vide if ($saisie['saisie'] == 'destinataires') { $valeur = array_filter($valeur); } // On regarde d'abord si le champ est obligatoire if ($obligatoire and $obligatoire != 'non' and ($file and !$_FILES[$champ]['name'] 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']) ? $saisie['options']['erreur_obligatoire'] : _T('info_obligatoire'); } // On continue seulement si ya pas d'erreur d'obligation et qu'il y a une demande de verif if ((!isset($erreurs[$champ]) or !$erreurs[$champ]) and is_array($verifier) and $verif_fonction) { $normaliser = null; // Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur $options = isset($verifier['options']) ? $verifier['options'] : array(); if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) { $erreurs[$champ] = $erreur_eventuelle; // 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)) { set_request($champ, $normaliser); } } } return $erreurs; }
/** * Lorsque l'on affiche les saisies (#VOIR_SAISIES), les saisies ayant une option afficher_si * et dont les conditions ne sont pas remplies doivent être retirées du tableau de saisies. * * Cette fonction sert aussi lors de la vérification des saisies avec saisies_verifier(). * À ce moment là, les saisies non affichées sont retirées de _request * (on passe leur valeur à NULL). * * @param array $saisies * Tableau de descriptions de saisies * @param array|null $env * Tableau d'environnement transmis dans inclure/voi_saisies.html, * NULL si on doit rechercher dans _request (pour saisies_verifier()). * @return array * Tableau de descriptions de saisies */ function saisies_verifier_afficher_si($saisies, $env = NULL) { // eviter une erreur par maladresse d'appel :) if (!is_array($saisies)) { return array(); } foreach ($saisies as $cle => $saisie) { if (isset($saisie['options']['afficher_si'])) { $condition = $saisie['options']['afficher_si']; // On gère le cas @plugin:non_plugin@ preg_match_all('#@plugin:(.+)@#U', $condition, $matches); foreach ($matches[1] as $plug) { if (defined('_DIR_PLUGIN_' . strtoupper($plug))) { $condition = preg_replace('#@plugin:' . $plug . '@#U', 'true', $condition); } else { $condition = preg_replace('#@plugin:' . $plug . '@#U', 'false', $condition); } } // On gère le cas @config:plugin:meta@ suivi d'un test preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches); foreach ($matches[1] as $plugin) { $config = lire_config($plugin); $condition = preg_replace('#@config:' . $plugin . ':' . $matches[2][0] . '@#U', '"' . $config[$matches[2][0]] . '"', $condition); } // On transforme en une condition valide if (is_null($env)) { $condition = preg_replace('#@(.+)@#U', '_request(\'$1\')', $condition); } else { $condition = preg_replace('#@(.+)@#U', '$env["valeurs"][\'$1\']', $condition); } eval('$ok = ' . $condition . ';'); if (!$ok) { unset($saisies[$cle]); if (is_null($env)) { set_request($saisie['options']['nom'], NULL); } } } if (isset($saisies[$cle]['saisies'])) { // S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies $saisies[$cle]['saisies'] = saisies_verifier_afficher_si($saisies[$cle]['saisies'], $env); } } return $saisies; }