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;
}
Exemple #3
0
/**
 * 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;
}