function formulaires_editer_champs_extras_traiter_dist($objet, $redirect = '')
{
    $retour = array('redirect' => $redirect);
    $table = table_objet_sql($objet);
    include_spip('inc/iextras');
    $saisies = iextras_champs_extras_definis($table);
    $nouvelles_saisies = session_get('constructeur_formulaire_champs_extras_' . $table);
    $diff = saisies_comparer_par_identifiant($saisies, $nouvelles_saisies);
    $extras = array();
    include_spip('inc/cextras');
    // supprimer les champs supprimes
    champs_extras_supprimer($table, $diff['supprimees']);
    // ajouter les nouveaux champs;
    champs_extras_creer($table, $diff['ajoutees']);
    // modifier les champs modifies;
    if ($diff['modifiees']) {
        $anciennes = saisies_lister_par_identifiant($saisies);
        $anciennes = array_intersect_key($anciennes, $diff['modifiees']);
        champs_extras_modifier($table, $diff['modifiees'], $anciennes);
    }
    # champs_extras_modifier($table, # modifiees nouvelles, # modifiees anciennes);
    ecrire_meta("champs_extras_" . $table, serialize($nouvelles_saisies));
    $retour['message_ok'] = 'Super !';
    return $retour;
}
Esempio n. 2
0
function iextras_declarer_champs_extras($saisies_tables = array())
{
    include_spip('inc/iextras');
    // lors du renouvellement de l'alea, au demarrage de SPIP
    // les chemins de plugins ne sont pas encore connus.
    // il faut se mefier et charger tout de meme la fonction, sinon page blanche.
    if (!function_exists('iextras_champs_extras_definis')) {
        spip_log("ERREUR : inclusion inc/iextras non executee", 'iextras');
        include_once dirname(__FILE__) . '/../inc/iextras.php';
    }
    // recuperer le tableau de champ et les ajouter.
    $extras = iextras_champs_extras_definis();
    $saisies_tables = array_merge_recursive($saisies_tables, $extras);
    return $saisies_tables;
}
Esempio n. 3
0
/**
 * Compter les saisies extras d'une table
 *
 * @param String $table Table sql
 * @return Int Nombre d'éléments.
**/
function compter_champs_extras($table)
{
    static $tables = array();
    if (!count($tables)) {
        include_spip('inc/saisies');
        $saisies_tables = iextras_champs_extras_definis();
        foreach ($saisies_tables as $t => $s) {
            if ($s = saisies_lister_par_nom($s)) {
                $tables[$t] = count($s);
            }
        }
    }
    if (isset($tables[$table])) {
        return $tables[$table];
    }
}
Esempio n. 4
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);
    }
}
/**
 * Vérifié une valeur comme devant être un nom de champ extra
 * 
 * Ce champ ne doit pas être utilisé par SPIP ou un plugin,
 * et ne doit pas être un mot clé de mysql.
 * 
 * Si c'est bon, doit aussi vérifier une expression régulière donnée
 * 
 * Options :
 * - modele : chaine représentant l'expression régulière tolérée
 *
 * @param string $valeur
 *   La valeur à vérifier.
 * @param array $options
 *   Contient une chaine représentant l'expression.
 * @return string
 *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
 */
function verifier_nom_champ_extra_dist($valeur, $options = array())
{
    include_spip('base/objets');
    include_spip('inc/iextras');
    include_spip('inc/saisies');
    $erreur = '';
    $table = $options['table'];
    $valeur = strtolower($valeur);
    // Champs extras (interface) / Saisies gérent déjà l'unicité des champs extras
    // déclarés dans une table : on ne peut créer 2 champs extras de même nom.
    // Ici on vérifie en plus que ce champ n'existe pas hors de champs extras.
    $tables_spip = lister_tables_objets_sql($table);
    $champs_declares = array_keys($tables_spip['field']);
    $champs_declares = array_filter($champs_declares, 'strtolower');
    // precaution
    $champs_iextras = iextras_champs_extras_definis($table);
    $champs_iextras = array_keys(saisies_lister_avec_sql($champs_iextras));
    $champs_iextras = array_filter($champs_iextras, 'strtolower');
    // precaution
    // les champs utilisés en dehors de champs extras, sont la différence
    $champs_utilises = array_diff($champs_declares, $champs_iextras);
    if (in_array($valeur, $champs_utilises)) {
        $erreur = _T('iextras:erreur_nom_champ_utilise');
    }
    // vérifier que le champ n'est pas un mot clé sql
    if (!$erreur) {
        if (in_array(strtoupper($valeur), iextras_sql_reserved_keywords())) {
            $erreur = _T('iextras:erreur_nom_champ_mysql_keyword');
        }
    }
    // vérifier que le champ est bien formaté  (expression régulière)
    if (!$erreur) {
        $verifier = charger_fonction('verifier', 'inc');
        $options += array('modele' => '/^[\\w]+$/');
        $erreur = $verifier($valeur, 'regex', $options);
    }
    return $erreur;
}
Esempio n. 6
0
/**
 * Retourne un champ extra d'un objet
 *
 * @param string $objet
 * @param string $champ
**/
function iextras_exporter_objet_champ($objet, $champ) {
	include_spip('inc/iextras');
	$champs = array();
	$table = table_objet_sql($objet);
	if ($liste = iextras_champs_extras_definis($table)) {
		include_spip('inc/saisies');
		$liste = saisies_lister_par_nom($liste);
		if (!empty($liste[$champ])) {
			$champs[$table] = array();
			$champs[$table][] = $liste[$champ];
		}
	}
	return $champs;
}
/**
 * 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;
}