예제 #1
0
function action_associer_champ_sql_comme_champ_extra($table, $champ)
{
    // recuperer la description du champ
    include_spip('inc/cextras');
    include_spip('inc/iextras');
    $champs = extras_champs_anormaux();
    if (isset($champs[$table][$champ])) {
        $sql = $champs[$table][$champ];
        $saisies = iextras_champs_extras_definis($table);
        include_spip('inc/saisies');
        $saisies_sql = saisies_lister_disponibles_sql();
        $type_saisie = 'textarea';
        $saisies = saisies_inserer($saisies, array('saisie' => $type_saisie, 'options' => array_merge($saisies_sql[$type_saisie]['defaut']['options'], array('nom' => $champ, 'label' => ucfirst($champ)))));
        // sauver
        ecrire_meta('champs_extras_' . $table, serialize($saisies));
        // supprimer la session d'edition du formulaire pour le remettre a zero
        session_set('constructeur_formulaire_champs_extras_' . $table, null);
    }
}
예제 #2
0
/**
 * Ajouter les saisies SQL et de recherche
 * sur les options de config d'une saisie (de champs extras)
 *
 * @param array
 * @return array
**/
function iextras_formulaire_verifier($flux) {
	if ($flux['args']['form'] == 'construire_formulaire'
	AND strpos($flux['args']['args'][0], 'champs_extras_')===0
	AND $nom_ou_id = _request('configurer_saisie') ) {

		// On ajoute le préfixe devant l'identifiant
		$identifiant = 'constructeur_formulaire_'.$flux['args']['args'][0];
		// On récupère le formulaire à son état actuel
		$formulaire_actuel = session_get($identifiant);

		if ($nom_ou_id[0] == '@') {
			$saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
			$name = $saisies_actuelles[$nom_ou_id]['options']['nom'];
		} else {
			$saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
			$name = $nom_ou_id;
		}

		// saisie inexistante => on sort
		if (!isset($saisies_actuelles[$nom_ou_id])) {
			return $flux;
		}

		$nom = 'configurer_' . $name;
		$table = substr($flux['args']['args'][0], strlen('champs_extras_'));


		// on ajoute le fieldset de restrictions de champs
		// (des autorisations pre-reglées en quelque sorte)
		$saisies_restrictions = array();

		// les restrictions de X ne peuvent apparaître que
		// si l'objet possede un Y.
		// secteurs -> id_secteur
		// branches -> id_rubrique
		// groupes -> id_groupe
		$desc = lister_tables_objets_sql($table);
		$types = array(
			'secteurs' => 'id_secteur',
			'branches' => 'id_rubrique',
			'groupes'  => 'id_groupe',
		);
		foreach ($types as $type => $champ) {
			if (isset($desc['field'][$champ])) {
				$saisies_restrictions[] = array(
					'saisie' => 'input',
					'options' => array(
						'nom' => "saisie_modifiee_${name}[options][restrictions][$type]",
						'label' => _T('iextras:label_restrictions_' . $type),
						'explication' => _T('iextras:precisions_pour_restrictions_' . $type),
						'defaut' => '',
					)
				);
			}
		}

		// ajout des restrictions voir | modifier par auteur
		$actions = array('voir', 'modifier');
		foreach ($actions as $action) {
			$saisies_restrictions[] = array(
					'saisie' => 'fieldset',
					'options' => array(
						'nom' => "saisie_modifiee_${name}[options][restrictions][$action]",
						'label' => _T('iextras:legend_restrictions_' . $action),
					),
					'saisies' => array(
						array(
							'saisie' => 'radio',
							'options' => array(
								'nom' => "saisie_modifiee_${name}[options][restrictions][$action][auteur]",
								'label' => _T('iextras:label_restrictions_auteur'),
								'defaut' => '',
								'datas' => array(
									'' => _T('iextras:radio_restrictions_auteur_aucune'),
									'admin' => _T('iextras:radio_restrictions_auteur_admin'),
									'admin_complet' => _T('iextras:radio_restrictions_auteur_admin_complet'),
									'webmestre' => _T('iextras:radio_restrictions_auteur_webmestre'),
								)
							)
						)
					)
				);
		}


		$flux['data'][$nom] = saisies_inserer($flux['data'][$nom], array(
			'saisie' => 'fieldset',
			'options' => array(
				'nom' => "saisie_modifiee_${name}[options][restrictions]",
				'label' => _T('iextras:legend_restriction'),
			),
			'saisies' => $saisies_restrictions
		));



		// on récupère les informations de la saisie
		// pour savoir si c'est un champs éditable (il a une ligne SQL)
		// et dans ce cas, on ajoute les options techniques
		$type_saisie = $saisies_actuelles[$nom_ou_id]['saisie'];
		$saisies_sql = saisies_lister_disponibles_sql();

		if (isset($saisies_sql[$type_saisie])) {

			// liste 'type_de_saisie' => 'Titre de la saisie'
			$liste_saisies = array();
			foreach ($saisies_sql as $s=>$d) {
				$liste_saisies[$s] = $d['titre'];
			}

			$sql = $saisies_sql[$type_saisie]['defaut']['options']['sql'];
			$flux['data'][$nom] = saisies_inserer($flux['data'][$nom], array(

				'saisie' => 'fieldset',
				'options' => array(
					'nom' => "saisie_modifiee_${name}[options][options_techniques]",
					'label' => _T('iextras:legend_options_techniques'),
				),
				'saisies' => array(
					array(
						'saisie' => 'input',
						'options' => array(
							'nom' => "saisie_modifiee_${name}[options][sql]",
							'label' => _T('iextras:label_sql'),
							'obligatoire' => 'oui',
							'size' => 50,
							'defaut' => $sql
						)
					),
					array(
						'saisie' => 'oui_non',
						'options' => array(
							'nom' => "saisie_modifiee_${name}[options][rechercher]",
							'label' => _T('iextras:label_rechercher'),
							'explication' => _T('iextras:precisions_pour_rechercher'),
							'defaut' => ''
						)
					),
					array(
						'saisie' => 'input',
						'options' => array(
							'nom' => "saisie_modifiee_${name}[options][rechercher_ponderation]",
							'label' => _T('iextras:label_rechercher_ponderation'),
							'explication' => _T('iextras:precisions_pour_rechercher_ponderation'),
							'defaut' => 2,
							'afficher_si' => "@saisie_modifiee_${name}[options][rechercher]@ != ''",
						)
					),
					array(
						'saisie' => 'radio',
						'options' => array(
							'nom' => "saisie_modifiee_${name}[options][traitements]",
							'label' => _T('iextras:label_traitements'),
							'explication' => _T('iextras:precisions_pour_traitements'),
							'defaut' => '',
							'datas' => array(
								'' => _T('iextras:radio_traitements_aucun'),
								'_TRAITEMENT_TYPO' => _T('iextras:radio_traitements_typo'),
								'_TRAITEMENT_RACCOURCIS' => _T('iextras:radio_traitements_raccourcis'),
							)
						)
					),
					array(
						'saisie' => 'oui_non',
						'options' => array(
							'nom' => "saisie_modifiee_${name}[options][versionner]",
							'label' => _T('iextras:label_versionner'),
							'explication' => _T('iextras:precisions_pour_versionner'),
							'defaut' => ''
						)
					),
					array(
						'saisie' => 'selection',
						'options' => array(
							'nom' => "saisie_modifiee_${name}[options][nouveau_type_saisie]",
							'label' => _T('iextras:label_saisie'),
							'explication' => _T('iextras:precisions_pour_nouvelle_saisie'),
							'attention' => _T('iextras:precisions_pour_nouvelle_saisie_attention'),
							'defaut' => $type_saisie,
							'datas' => $liste_saisies
						)
					),
				)));
		}
	}
	return $flux;
}
예제 #3
0
/**
 * Déplace une saisie existante autre part
 *
 * @param array $saisies Un tableau décrivant les saisies
 * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer
 * @param string $ou Le nom de la saisie devant laquelle on déplacera OU le nom d'un conteneur entre crochets [conteneur]
 * @return array Retourne le tableau modifié des saisies
 */
function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou)
{
    // On récupère le contenu de la saisie à déplacer
    $saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
    // Si on l'a bien trouvé
    if ($saisie) {
        // On cherche l'endroit où la déplacer
        // Si $ou est vide, c'est à la fin de la racine
        if (!$ou) {
            $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
            $chemin = array(count($saisies));
        } elseif (preg_match('/^\\[(@?[\\w]*)\\]$/', $ou, $match)) {
            $parent = $match[1];
            // Si dans les crochets il n'y a rien, on met à la fin du formulaire
            if (!$parent) {
                $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
                $chemin = array(count($saisies));
            } elseif (saisies_chercher($saisies, $parent, true)) {
                // S'il existe on supprime la saisie et on recherche la nouvelle position
                $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
                $parent = saisies_chercher($saisies, $parent, true);
                $chemin = array_merge($parent, array('saisies', 1000000));
            } else {
                $chemin = false;
            }
        } else {
            // On vérifie que le champ existe
            if (saisies_chercher($saisies, $ou, true)) {
                // S'il existe on supprime la saisie
                $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
                // Et on recherche la nouvelle position qui n'est plus forcément la même maintenant qu'on a supprimé une saisie
                $chemin = saisies_chercher($saisies, $ou, true);
            } else {
                $chemin = false;
            }
        }
        // Si seulement on a bien trouvé un nouvel endroit où la placer, alors on déplace
        if ($chemin) {
            $saisies = saisies_inserer($saisies, $saisie, $chemin);
        }
    }
    return $saisies;
}
예제 #4
0
function saisies_groupe_inserer($formulaire_actuel, $saisie){
	include_spip('inclure/configurer_saisie_fonctions');
	
		//le groupe de saisies
		$saisies_charger_infos = saisies_charger_infos($saisie,$saisies_repertoire = "saisies/groupes");
		
		//le tableau est-il en options ou en saisies ?
		$classique_yaml=count($saisies_charger_infos['options']);
		$formidable_yaml=count($saisies_charger_infos['saisies']);
		if($classique_yaml>0) {
			$champ_options = 'options';
		}
		if($formidable_yaml>0) { 
			$champ_options = 'saisies';
		}
		
		//les champs du groupe 
		foreach($saisies_charger_infos[$champ_options] as $info_saisie){
			unset($info_saisie['identifiant']);
			$saisies_disponibles = saisies_lister_disponibles();
			$construire_nom = $info_saisie[$champ_options]['nom'] ? $info_saisie[$champ_options]['nom'] : $info_saisie['saisie'];
			$nom = $info_saisie[$champ_options]['nom'] = saisies_generer_nom($formulaire_actuel,$construire_nom);
			
			$formulaire_actuel = saisies_inserer($formulaire_actuel, $info_saisie);
		}
		return $formulaire_actuel;
}
예제 #5
0
/**
 * Ajouter les saisies SQL et de recherche
 * sur les options de config d'une saisie (de champs extras)
 *
 * @param array
 * @return array
**/
function iextras_saisies_construire_formulaire_config($flux)
{
    if (strpos($flux['args']['identifiant'], 'constructeur_formulaire_champs_extras_') === 0) {
        $table = substr($flux['args']['identifiant'], strlen('constructeur_formulaire_champs_extras_'));
        $name = $flux['args']['nom'];
        $formulaire_actuel = $flux['data'];
        $type_saisie = $flux['args']['saisie']['saisie'];
        // on ajoute le fieldset de restrictions de champs
        // (des autorisations pre-reglées en quelque sorte)
        $saisies_restrictions = array();
        // les restrictions de X ne peuvent apparaître que
        // si l'objet possede un Y.
        // secteurs -> id_secteur
        // branches -> id_rubrique
        // groupes -> id_groupe
        $desc = lister_tables_objets_sql($table);
        $types = array('secteurs' => 'id_secteur', 'branches' => 'id_rubrique', 'groupes' => 'id_groupe');
        foreach ($types as $type => $champ) {
            if (isset($desc['field'][$champ])) {
                $saisies_restrictions[] = array('saisie' => 'input', 'options' => array('nom' => "saisie_modifiee_{$name}[options][restrictions][{$type}]", 'label' => _T('iextras:label_restrictions_' . $type), 'explication' => _T('iextras:precisions_pour_restrictions_' . $type), 'defaut' => ''));
            }
        }
        // ajout des restrictions voir | modifier par auteur
        $actions = array('voir', 'modifier');
        foreach ($actions as $action) {
            $saisies_restrictions[] = array('saisie' => 'fieldset', 'options' => array('nom' => "saisie_modifiee_{$name}[options][restrictions][{$action}]", 'label' => _T('iextras:legend_restrictions_' . $action)), 'saisies' => array(array('saisie' => 'radio', 'options' => array('nom' => "saisie_modifiee_{$name}[options][restrictions][{$action}][auteur]", 'label' => _T('iextras:label_restrictions_auteur'), 'defaut' => '', 'datas' => array('' => _T('iextras:radio_restrictions_auteur_aucune'), 'admin' => _T('iextras:radio_restrictions_auteur_admin'), 'admin_complet' => _T('iextras:radio_restrictions_auteur_admin_complet'), 'webmestre' => _T('iextras:radio_restrictions_auteur_webmestre'))))));
        }
        $flux['data'] = saisies_inserer($flux['data'], array('saisie' => 'fieldset', 'options' => array('nom' => "saisie_modifiee_{$name}[options][restrictions]", 'label' => _T('iextras:legend_restriction')), 'saisies' => $saisies_restrictions));
        // On récupère les informations de la saisie
        // pour savoir si c'est un champs éditable (il a une ligne SQL)
        // et dans ce cas :
        //
        // - on modifie le type de vérification du nom du champ (regexp > nom_champ_extra)
        //   Cette vérification crée une erreur si le nom est déjà utilisé par SPIP ou un plugin, et si c'est un mot clé SQL
        //
        // - on ajoute les options techniques
        $saisies_sql = saisies_lister_disponibles_sql();
        if (isset($saisies_sql[$type_saisie])) {
            // Modification du type de vérification
            // Normalement le premier champ du premier onglet
            if ($flux['data'][0]['saisies'][0]['verifier']['type'] == 'regex') {
                $flux['data'][0]['saisies'][0]['verifier']['type'] = 'nom_champ_extra';
                $flux['data'][0]['saisies'][0]['verifier']['options']['table'] = $table;
            }
            // Ajout de l'onglet Technique
            // liste 'type_de_saisie' => 'Titre de la saisie'
            $liste_saisies = array();
            foreach ($saisies_sql as $s => $d) {
                $liste_saisies[$s] = $d['titre'];
            }
            $sql = $saisies_sql[$type_saisie]['defaut']['options']['sql'];
            $flux['data'] = saisies_inserer($flux['data'], array('saisie' => 'fieldset', 'options' => array('nom' => "saisie_modifiee_{$name}[options][options_techniques]", 'label' => _T('iextras:legend_options_techniques')), 'saisies' => array(array('saisie' => 'input', 'options' => array('nom' => "saisie_modifiee_{$name}[options][sql]", 'label' => _T('iextras:label_sql'), 'obligatoire' => 'oui', 'size' => 50, 'defaut' => $sql)), array('saisie' => 'oui_non', 'options' => array('nom' => "saisie_modifiee_{$name}[options][rechercher]", 'label' => _T('iextras:label_rechercher'), 'explication' => _T('iextras:precisions_pour_rechercher'), 'defaut' => '')), array('saisie' => 'input', 'options' => array('nom' => "saisie_modifiee_{$name}[options][rechercher_ponderation]", 'label' => _T('iextras:label_rechercher_ponderation'), 'explication' => _T('iextras:precisions_pour_rechercher_ponderation'), 'defaut' => 2, 'afficher_si' => "@saisie_modifiee_{$name}[options][rechercher]@ != ''")), array('saisie' => 'radio', 'options' => array('nom' => "saisie_modifiee_{$name}[options][traitements]", 'label' => _T('iextras:label_traitements'), 'explication' => _T('iextras:precisions_pour_traitements'), 'defaut' => '', 'datas' => array('' => _T('iextras:radio_traitements_aucun'), '_TRAITEMENT_TYPO' => _T('iextras:radio_traitements_typo'), '_TRAITEMENT_RACCOURCIS' => _T('iextras:radio_traitements_raccourcis')))), array('saisie' => 'oui_non', 'options' => array('nom' => "saisie_modifiee_{$name}[options][versionner]", 'label' => _T('iextras:label_versionner'), 'explication' => _T('iextras:precisions_pour_versionner'), 'defaut' => '')), array('saisie' => 'selection', 'options' => array('nom' => "saisie_modifiee_{$name}[options][nouveau_type_saisie]", 'label' => _T('iextras:label_saisie'), 'explication' => _T('iextras:precisions_pour_nouvelle_saisie'), 'attention' => _T('iextras:precisions_pour_nouvelle_saisie_attention'), 'defaut' => $type_saisie, 'datas' => $liste_saisies)))));
        }
    }
    return $flux;
}
예제 #6
0
function formidable_generer_saisie_configurable($saisie, $env)
{
    // On récupère le nom
    $nom = $saisie['options']['nom'];
    $identifiant = $saisie['identifiant'];
    // On cherche si ya un formulaire de config
    $formulaire_config = isset($env['erreurs']['configurer_' . $nom]) ? $env['erreurs']['configurer_' . $nom] : "";
    // On ajoute une classe
    if (!isset($saisie['options']['li_class'])) {
        $saisie['options']['li_class'] = '';
        // initialisation
    }
    $saisie['options']['li_class'] .= ' configurable';
    // On ajoute l'option "tout_afficher"
    $saisie['options']['tout_afficher'] = 'oui';
    // On ajoute les boutons d'actions, mais seulement s'il n'y a pas de configuration de lancée
    if (!$env['erreurs']) {
        $saisie = saisies_inserer_html($saisie, recuperer_fond('formulaires/inc-construire_formulaire-actions', array('nom' => $nom, 'identifiant' => $identifiant, 'formulaire_config' => $formulaire_config, 'deplacable' => $env['_chemin_ui'])), 'debut');
    }
    // On ajoute une ancre pour s'y déplacer
    $saisie = saisies_inserer_html($saisie, "\n<a id=\"configurer_{$nom}\"></a>\n", 'debut');
    // Si ya un form de config on l'ajoute à la fin
    if (is_array($formulaire_config)) {
        // On double l'environnement
        $env2 = $env;
        // On ajoute une classe
        $saisie['options']['li_class'] .= ' en_configuration';
        // Si possible on met en readonly
        $saisie['options']['readonly'] = 'oui';
        // On vire les sous-saisies s'il y en a
        if (isset($saisie['saisies']) and $saisie['saisies'] and is_array($saisie['saisies'])) {
            $nb_champs_masques = count(saisies_lister_champs($saisie['saisies']));
            $saisie['saisies'] = array(array('saisie' => 'explication', 'options' => array('nom' => 'truc', 'texte' => _T('saisies:construire_info_nb_champs_masques', array('nb' => $nb_champs_masques)))));
        }
        // On va ajouter le champ pour la position
        if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_{$nom}[options][description]", true))) {
            $chemin_description = array(0);
            $formulaire_config = saisies_inserer($formulaire_config, array('saisie' => 'fieldset', 'options' => array('nom' => "saisie_modifiee_{$nom}[options][description]", 'label' => _T('saisies:option_groupe_description')), 'saisies' => array()), 0);
        }
        $chemin_description[] = 'saisies';
        $chemin_description[] = '0';
        // tout au début
        $formulaire_config = saisies_inserer($formulaire_config, array('saisie' => 'position_construire_formulaire', 'options' => array('nom' => "saisie_modifiee_{$nom}[position]", 'label' => _T('saisies:construire_position_label'), 'explication' => _T('saisies:construire_position_explication'), 'formulaire' => $env['_contenu'], 'saisie_a_positionner' => $nom)), $chemin_description);
        $env2['saisies'] = $formulaire_config;
        // Un test pour savoir si on prend le _request ou bien
        $erreurs_test = $env['erreurs'];
        unset($erreurs_test['configurer_' . $nom]);
        unset($erreurs_test['positionner']);
        unset($erreurs_test['message_erreur']);
        if ($erreurs_test) {
            // Là aussi on désinfecte à la main
            if (isset($env2["saisie_modifiee_{$nom}"]['options']) and is_array($env2["saisie_modifiee_{$nom}"]['options'])) {
                spip_desinfecte($env2["saisie_modifiee_{$nom}"]['options']);
            }
        } else {
            $env2["saisie_modifiee_{$nom}"] = $env2['_saisies_par_nom'][$nom];
            // il n'y a pas toujours de verification...
            if (isset($env2["saisie_modifiee_{$nom}"]['verifier'])) {
                $env2["saisie_modifiee_{$nom}"]['verifier'][$env2["saisie_modifiee_{$nom}"]['verifier']['type']] = $env2["saisie_modifiee_{$nom}"]['verifier']['options'];
            }
        }
        $env2['fond_generer'] = 'inclure/generer_saisies';
        $saisie = saisies_inserer_html($saisie, '<div class="formulaire_configurer"><ul class="formulaire_configurer-contenus">' . recuperer_fond('inclure/generer_saisies', $env2) . '<li class="boutons">
				<input type="hidden" name="enregistrer_saisie" value="' . $nom . '" />
				<button type="submit" class="submit link" name="enregistrer_saisie" value="">' . _T('bouton_annuler') . '</button>
				<input type="submit" class="submit" name="enregistrer" value="' . _T('bouton_valider') . '" />
			</li>' . '</ul></div>', 'fin');
    }
    // On génère le HTML de la saisie
    $html = saisies_generer_html($saisie, $env);
    return $html;
}
/**
 * Importe une description de champs extras donnée
 *
 * @param array $description 
 *    description des champs extras (table sql => liste des champs extras)
 * @param string $message
 *    message de retour, rempli par cette fonction
 * @param bool $fusionner_doublons
 *    true si on fusionne les champs présents dans la sauvegarde et aussi présents sur le site. False pour les ignorer.
 * @return bool
 *    true si tout s'est bien passé, false sinon
**/
function iextras_importer_description($description, &$message, $fusionner_doublons = false)
{
    include_spip('inc/iextras');
    include_spip('inc/saisies');
    include_spip('inc/texte');
    include_spip('inc/cextras');
    $tables_sql_presentes = array_keys(lister_tables_objets_sql());
    $message = '';
    $nbt = count($description);
    $message .= "{{Fichier importé :}}\n";
    $message .= "- {$nbt} objets éditoriaux.\n";
    $nbc = 0;
    foreach ($description as $table => $saisies) {
        $nbc += count($saisies);
    }
    $message .= "- {$nbc} champs extras.\n";
    foreach ($description as $table => $saisies) {
        if (!in_array($table, $tables_sql_presentes)) {
            $message .= "\nTable {{ {$table} }} absente sur le site\n";
            $message .= count($saisies) . " champs extras ignorés !!\n";
            continue;
        }
        $champs_presents = $champs_futurs = iextras_champs_extras_definis($table);
        $champs_presents_par_nom = saisies_lister_par_nom($champs_presents);
        $objet = objet_type($table);
        $titre = _T(objet_info($objet, 'texte_objets'));
        $message .= "\n{{ {$titre} :}}\n";
        $message .= count($saisies) . " champs extras\n";
        foreach ($saisies as $saisie) {
            $nom = isset($saisie['options']['nom']) ? $saisie['options']['nom'] : '';
            if (!$nom) {
                $message .= "- !! Saisie sans nom ignorée\n";
                continue;
            }
            // champ déjà présent ?
            if (isset($champs_presents_par_nom[$nom])) {
                if ($fusionner_doublons) {
                    $message .= "- {{ {$nom} :}} modifié (déjà présent)\n";
                    $champs_futurs = saisies_modifier($champs_futurs, $nom, $saisie);
                } else {
                    $message .= "- {{ {$nom} :}} ignoré (déjà présent)\n";
                }
            } else {
                $message .= "- {{ {$nom} :}} ajouté\n";
                $champs_futurs = saisies_inserer($champs_futurs, $saisie);
            }
        }
        $diff = saisies_comparer_par_identifiant($champs_presents, $champs_futurs);
        // ajouter les nouveaux champs;
        if ($diff['ajoutees']) {
            $message .= count($diff['ajoutees']) . " champs ajoutés.\n";
            champs_extras_creer($table, $diff['ajoutees']);
        }
        // modifier les champs modifies;
        if ($diff['modifiees']) {
            $message .= count($diff['modifiees']) . " champs modifiés.\n";
            $anciennes = saisies_lister_par_identifiant($champs_presents);
            $anciennes = array_intersect_key($anciennes, $diff['modifiees']);
            champs_extras_modifier($table, $diff['modifiees'], $anciennes);
        }
        // enregistrer la nouvelle config
        if ($diff['ajoutees'] or $diff['modifiees']) {
            ecrire_meta("champs_extras_" . $table, serialize($champs_futurs));
        } else {
            $message .= "Aucune modification !\n";
        }
    }
    $message = propre($message);
    return true;
}