示例#1
0
/**
 * 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;
}
示例#2
0
/**
 * 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;
}