/** * 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; }
/** * 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; }
/** * 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; }