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); }
/** * 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; }