/**
 * Vérification de la validité des champs extras
 *
 * Lorsqu'un formulaire 'editer_xx' se présente, la fonction effectue,
 * pour chaque champs extra les vérifications prévues dans la
 * définition de la saisie, et retourne les éventuelles erreurs rencontrées.
 * 
 * @pipeline formulaire_verifier
 * @param array $flux Données du pipeline
 * @return array      Données du pipeline
**/
function cextras_formulaire_verifier($flux)
{
    $form = $flux['args']['form'];
    if (strncmp($form, 'editer_', 7) !== 0) {
        return $flux;
    }
    $objet = substr($form, 7);
    if ($saisies = champs_extras_objet($table = table_objet_sql($objet))) {
        include_spip('inc/autoriser');
        include_spip('inc/saisies');
        // restreindre les saisies selon les autorisations
        $id_objet = $flux['args']['args'][0];
        // ? vraiment toujours ?
        $saisies = champs_extras_autorisation('modifier', $objet, $saisies, array_merge($flux['args'], array('id' => $id_objet, 'contexte' => array())));
        // nous ne connaissons pas le contexte dans ce pipeline
        // restreindre les vérifications aux saisies enregistrables
        $saisies = champs_extras_saisies_lister_avec_sql($saisies);
        $verifier = charger_fonction('verifier', 'inc', true);
        foreach ($saisies as $saisie) {
            // verifier obligatoire
            $nom = $saisie['options']['nom'];
            if (isset($saisie['options']['obligatoire']) and $saisie['options']['obligatoire'] and !_request($nom)) {
                $flux['data'][$nom] = _T('info_obligatoire');
                // verifier (api) + normalisation
            } elseif ($verifier and isset($saisie['verifier']['type']) and $verif = $saisie['verifier']['type']) {
                $options = isset($saisie['verifier']['options']) ? $saisie['verifier']['options'] : array();
                $normaliser = null;
                $valeur = _request($nom);
                if ($erreur = $verifier($valeur, $verif, $options, $normaliser)) {
                    $flux['data'][$nom] = $erreur;
                    // si une valeur de normalisation a ete transmis, la prendre.
                } elseif (!is_null($normaliser)) {
                    set_request($nom, $normaliser);
                } else {
                    // [FIXME] exceptions connues de vérifications (pour les dates entre autres)
                    // en attendant une meilleure solution !
                    //
                    // Lorsque le champ n'est pas rempli dans le formulaire
                    // alors qu'une normalisation est demandée,
                    // verifier() sort sans indiquer d'erreur (c'est normal).
                    //
                    // Sauf que la donnée alors soumise à SQL sera une chaine vide,
                    // ce qui ne correspond pas toujours à ce qui est attendu.
                    if ((is_string($valeur) and !strlen($valeur) or is_array($valeur) and $saisie['saisie'] == 'date') and isset($options['normaliser']) and $norme = $options['normaliser']) {
                        // Charger la fonction de normalisation théoriquement dans verifier/date
                        // et si on en trouve une, obtenir la valeur normalisée
                        // qui est théoriquement la valeur par défaut, puisque $valeur est vide
                        include_spip("verifier/{$verif}");
                        if ($normaliser = charger_fonction("{$verif}_{$norme}", "normaliser", true)) {
                            $erreur = null;
                            $defaut = $normaliser($valeur, $options, $erreur);
                            if (is_null($erreur)) {
                                set_request($nom, $defaut);
                            } else {
                                // on affecte l'erreur, mais il est probable que
                                // l'utilisateur ne comprenne pas grand chose
                                $flux['data'][$nom] = $erreur;
                            }
                        } else {
                            include_spip('inc/cextras');
                            extras_log("Fonction de normalisation pour {$verif}_{$norme} introuvable");
                        }
                    }
                }
            }
        }
    }
    return $flux;
}
Beispiel #2
0
/**
 * Supprimer les champs extras (colonne dans la base de données)
 * definies par le lot de saisies donné
 *
 * @param string $table
 *     Nom de la table SQL
 * @param array $saisies
 *     Description des saisies
 * @return bool
 *     False si pas de table, aucune saisie de type SQL, ou une suppression en erreur
 *     True si toutes les suppressions sont OK
**/
function champs_extras_supprimer($table, $saisies)
{
    if (!$table) {
        return false;
    }
    if (!is_array($saisies) or !count($saisies)) {
        return false;
    }
    $saisies = champs_extras_saisies_lister_avec_sql($saisies);
    if (!$saisies) {
        return false;
    }
    $desc = lister_tables_objets_sql($table);
    $ok = true;
    foreach ($saisies as $saisie) {
        $nom = $saisie['options']['nom'];
        if (isset($desc['field'][$nom])) {
            $ok &= sql_alter("TABLE {$table} DROP COLUMN {$nom}");
        }
    }
    return $ok;
}
Beispiel #3
0
/**
 * Déclarer les nouvelles infos sur les champs extras ajoutés
 * en ce qui concerne les traitements automatiques sur les balises.
 *
 * @pipeline declarer_tables_interfaces
 * @param array $interfaces
 *     Déclarations d'interface pour le compilateur
 * @return array
 *     Déclarations d'interface pour le compilateur
**/
function cextras_declarer_tables_interfaces($interfaces)
{
    include_spip('inc/cextras');
    include_spip('inc/saisies');
    // si saisies a ete supprime par ftp, on sort tranquilou sans tuer SPIP.
    // champs extras sera ensuite desactive par admin plugins.
    if (!function_exists('saisies_lister_avec_sql')) {
        return $tables;
    }
    // recuperer les champs crees par les plugins
    $saisies_tables = pipeline('declarer_champs_extras', array());
    if (!$saisies_tables) {
        return $interfaces;
    }
    foreach ($saisies_tables as $table => $saisies) {
        $saisies = champs_extras_saisies_lister_avec_sql($saisies);
        $saisies = saisies_lister_avec_traitements($saisies);
        foreach ($saisies as $saisie) {
            $traitement = $saisie['options']['traitements'];
            $balise = strtoupper($saisie['options']['nom']);
            // definir
            if (!isset($interfaces['table_des_traitements'][$balise])) {
                $interfaces['table_des_traitements'][$balise] = array();
            }
            // le traitement peut etre le nom d'un define
            $traitement = defined($traitement) ? constant($traitement) : $traitement;
            // SPIP 3 permet de declarer par la table sql directement.
            $interfaces['table_des_traitements'][$balise][$table] = $traitement;
        }
    }
    // ajouter les champs au tableau spip
    return $interfaces;
}