function action_supprimer_champ_sql($table, $champ) { // recuperer les descriptions // pour verifier que le champ n'est pas declare par quelqu'un include_spip('inc/cextras'); $champs = extras_champs_anormaux(); if (isset($champs[$table][$champ])) { // suppression extras_log("Suppression du champ {$table}/{$champ} par auteur " . $GLOBALS['auteur_session']['id_auteur'], true); sql_alter("TABLE {$table} DROP COLUMN " . $champ); } }
/** * 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; }
/** * Cree en base les champs extras demandes * @param $champs : objet ChampExtra ou tableau d'objets ChampExtra */ function creer_champs_extras($champs) { if (!$champs) { return; } if (!is_array($champs)) $champs = array($champs); // on recupere juste les differentes tables a mettre a jour $tables = array(); foreach ($champs as $c){ if ($table = $c->_table_sql) { $tables[$table] = $table; } else { // ici on est bien ennuye, vu qu'on ne pourra pas creer ce champ. extras_log("Aucune table trouvee pour le champs extras ; il ne pourra etre cree :", true); extras_log($c, true); } } if (!$tables) { return false; } // on met a jour les tables trouvees // recharger les tables principales et auxiliaires include_spip('base/serial'); include_spip('base/auxiliaires'); global $tables_principales, $tables_auxiliaires; base_serial($tables_principales); base_auxiliaires($tables_auxiliaires); // inclure les champs extras declares ALORS que le pipeline // n'est pas encore actif : important lorsqu'on active // en meme temps CE2 et un plugin dependant // et non l'un apres l'autre if (!defined('_CHAMPS_EXTRAS_DECLARES')) { include_spip('base/cextras'); $tables_principales = cextras_declarer_tables_principales($tables_principales); } // executer la mise a jour include_spip('base/create'); maj_tables($tables); // pour chaque champ a creer, on verifie qu'il existe bien maintenant ! $trouver_table = charger_fonction('trouver_table','base'); $trouver_table(''); // recreer la description des tables. $retour = true; foreach ($champs as $c){ if ($objet = $c->_objet) { $desc = $trouver_table($objet); if (!isset($desc['field'][$c->champ])) { extras_log("Le champ extra '" . $c->champ . "' sur $objet n'a pas ete cree :(", true); $retour = false; } } else { $retour = false; } } return $retour; }