function montants_str2array($str, $abo = "")
{
    include_spip('inc/saisies');
    include_spip('inc/texte');
    /* Vérification du format de la chaine. Elle doit être sous la forme
     * « [montant] | [label] », par exemple « 10 | 10 € ». */
    foreach (explode("\n", trim($str)) as $l) {
        if (!preg_match('/^[0-9]+\\|.*/', $l)) {
            return false;
        }
    }
    if ($abo) {
        $str = $abo . trim(str_replace("\n", "\n{$abo}", $str));
    }
    $res = saisies_chaine2tableau(saisies_aplatir_chaine($str));
    $res = array_map('typo', $res);
    return $res;
}
/**
 * Simplifie l'écriture d'une saisie de champs extras
 *
 * @param array Description de saisie
 * @return array
**/
function iextras_preparer_export_php_saisie($saisie) {

	// 1 mettre 'saisie' en tout premier, c'est plus pratique !
	$saisie = array('saisie' => $saisie['saisie']) + $saisie;

	// 2 mettre 'saisies' en dernier
	if (isset($saisie['saisies'])) {
		$saisies = $saisie['saisies'];
		unset($saisie['saisies']);
		$saisie['saisies'] = $saisies;
		// 2 bis : traiter toutes les saisies enfants
		foreach ($saisie['saisies'] as $k => $s) {
			$saisie['saisies'][$k] = iextras_preparer_export_php_saisie($s);
		}
	}

	// 3 pas besoin d'identifiant
	unset($saisie['identifiant']);
	// 4 nettoyage de quelques champs souvent vides
	if (isset($saisie['options']['restrictions'])) {
		if (empty($saisie['options']['restrictions']['secteurs'])) {
			unset($saisie['options']['restrictions']['secteurs']);
		}
		if (empty($saisie['options']['restrictions']['branches'])) {
			unset($saisie['options']['restrictions']['branches']);
		}
		if (empty($saisie['options']['restrictions']['voir']['auteur'])) {
			unset($saisie['options']['restrictions']['voir']['auteur']);
		}
		if (empty($saisie['options']['restrictions']['modifier']['auteur'])) {
			unset($saisie['options']['restrictions']['modifier']['auteur']);
		}
		if (empty($saisie['options']['restrictions']['voir'])) {
			unset($saisie['options']['restrictions']['voir']);
		}
		if (empty($saisie['options']['restrictions']['modifier'])) {
			unset($saisie['options']['restrictions']['modifier']);
		}
		if (empty($saisie['options']['restrictions'])) {
			unset($saisie['options']['restrictions']);
		}
	}

	// 5 les datas doivent être des tableaux
	if (isset($saisie['options']['datas'])) {
		if (!is_array($saisie['options']['datas'])) {
			$saisie['options']['datas'] = saisies_chaine2tableau($saisie['options']['datas']);
		}
	}

	return $saisie;
}
/**
 * Retourne les choix possibles d'un champ extra indiqué
 *
 * @note
 *     Le plugin saisies tolère maintenant des sélections avec
 *     un affichage par groupe (optgroup / options) avec une syntaxe
 *     spécifique. Ici nous devons pouvoir applatir
 *     toutes les cle => valeur.
 * 
 * @param string $objet
 *     Type d'objet
 * @param string $colonne
 *     Nom de la colonne SQL
 * @param bool $applatir
 *     true pour applatir les choix possibles au premier niveau
 *     même si on a affaire à une liste de choix triée par groupe
 * @return string|array
 *     - Tableau des couples (clé => valeur) des choix
 *     - Chaîne vide si le champs extra n'est pas trouvé
 */
function calculer_balise_LISTER_CHOIX($objet, $colonne, $applatir = true) {
	if ($options = calculer_balise_CHAMP_EXTRA($objet, $colonne)) {
		if (isset($options['datas']) and $options['datas']) {
			include_spip('inc/saisies');
			$choix = saisies_chaine2tableau($options['datas']);
			// applatir les sous-groupes si présents
			if ($applatir) {
				$choix = saisies_aplatir_tableau($choix);
			}
			return $choix;
		}
	}
	return '';
}
/**
 * Pour les saisies multiples (type checkbox) proposant un choix alternatif,
 * retrouve à partir des data de choix proposés
 * et des valeurs des choix enregistrés
 * le texte enregistré pour le choix alternatif.
 *
 * @param array $data
 * @param array $valeur
 * @return string choix_alternatif
**/
function saisies_trouver_choix_alternatif($data, $valeur)
{
    if (!is_array($valeur)) {
        $valeur = saisies_chaine2tableau($valeur);
    }
    if (!is_array($data)) {
        $data = saisies_chaine2tableau($data);
    }
    $choix_theorique = array_keys($data);
    $choix_alternatif = array_values(array_diff($valeur, $choix_theorique));
    return $choix_alternatif[0];
    //on suppose que personne ne s'est amusé à proposer deux choix alternatifs
}
/**
 * Génère une vue d'une saisie à partir d'un tableau la décrivant
 *
 * @see saisies_generer_html()
 * @param array $saisie
 *     Tableau de description d'une saisie
 * @param array $env
 *     L'environnement, contenant normalement la réponse à la saisie
 * @param array $env_obligatoire
 *     ???
 * @return string
 *     Code HTML de la vue de la saisie
 */
function saisies_generer_vue($saisie, $env = array(), $env_obligatoire = array())
{
    // Si le paramètre n'est pas bon, on génère du vide
    if (!is_array($saisie)) {
        return '';
    }
    $contexte = array();
    // On sélectionne le type de saisie
    $contexte['type_saisie'] = $saisie['saisie'];
    // Peut-être des transformations à faire sur les options textuelles
    $options = $saisie['options'];
    foreach ($options as $option => $valeur) {
        if ($option == 'datas') {
            // exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
            $options[$option] = saisies_chaine2tableau($valeur);
        } else {
            $options[$option] = _T_ou_typo($valeur, 'multi');
        }
    }
    // On ajoute les options propres à la saisie
    $contexte = array_merge($contexte, $options);
    // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
    if (isset($contexte['env']) or isset($saisie['saisies']) and is_array($saisie['saisies'])) {
        unset($contexte['env']);
        // on sauve l'ancien environnement
        // car les sous-saisies ne doivent pas être affectees
        // par les modification sur l'environnement servant à generer la saisie mère
        $contexte['_env'] = $env;
        // À partir du moment où on passe tout l'environnement, il faut enlever
        // certains éléments qui ne doivent absolument provenir que des options
        $saisies_disponibles = saisies_lister_disponibles();
        if (is_array($saisies_disponibles[$contexte['type_saisie']]['options'])) {
            $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
            foreach ($options_a_supprimer as $option_a_supprimer) {
                unset($env[$option_a_supprimer]);
            }
        }
        $contexte = array_merge($env, $contexte);
    }
    // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
    // On regarde en priorité s'il y a un tableau listant toutes les valeurs
    if ($env['valeurs'] and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])) {
        $contexte['valeur'] = $env['valeurs'][$contexte['nom']];
    } elseif (preg_match('/([\\w]+)((\\[[\\w]+\\])+)/', $contexte['nom'], $separe)) {
        $contexte['valeur'] = $env[$separe[1]];
        preg_match_all('/\\[([\\w]+)\\]/', $separe[2], $index);
        // On va chercher au fond du tableau
        foreach ($index[1] as $cle) {
            $contexte['valeur'] = $contexte['valeur'][$cle];
        }
    } else {
        // certains n'ont pas de nom (fieldset)
        $contexte['valeur'] = isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : '';
    }
    // Si ya des enfants on les remonte dans le contexte
    if (isset($saisie['saisies']) and is_array($saisie['saisies'])) {
        $contexte['saisies'] = $saisie['saisies'];
    }
    if (is_array($env_obligatoire)) {
        $contexte = array_merge($contexte, $env_obligatoire);
    }
    // On génère la saisie
    return recuperer_fond('saisies-vues/_base', $contexte);
}
Exemple #6
0
/**
 * Transforme une valeur en tableau d'élements si ce n'est pas déjà le cas
 *
 * @param mixed $valeur
 * @return array Tableau de valeurs
**/
function saisies_valeur2tableau($valeur)
{
    if (is_array($valeur)) {
        return $valeur;
    }
    if (!strlen($valeur)) {
        return array();
    }
    $t = saisies_chaine2tableau($valeur);
    if (count($t) > 1) {
        return $t;
    }
    // qu'une seule valeur, c'est qu'elle a peut etre un separateur a virgule
    // et a donc une cle est 0 dans ce cas la d'ailleurs
    if (isset($t[0])) {
        $t = saisies_chaine2tableau($t[0], ',');
    }
    return $t;
}