/** * une fonction qui regarde si $texte est une chaine de langue * de la forme <:qqch:> * si oui applique _T() * si non applique typo() suivant le mode choisi * * @param unknown_type $valeur Une valeur à tester. Si c'est un tableau, la fonction s'appliquera récursivement dessus. * @param string $mode_typo Le mode d'application de la fonction typo(), avec trois valeurs possibles "toujours", "jamais" ou "multi". * @return unknown_type Retourne la valeur éventuellement modifiée. */ function _T_ou_typo($valeur, $mode_typo='toujours') { // Si la valeur est bien une chaine (et pas non plus un entier déguisé) if (is_string($valeur) and !intval($valeur)){ // Si la chaine est du type <:truc:> on passe à _T() if (preg_match('/^\<:(.*?):\>$/', $valeur, $match)) $valeur = _T($match[1]); // Sinon on la passe a typo() else { if (!in_array($mode_typo, array('toujours', 'multi', 'jamais'))) $mode_typo = 'toujours'; if ($mode_typo == 'toujours' or ($mode_typo == 'multi' and strpos($valeur, '<multi>') !== false)){ include_spip('inc/texte'); $valeur = typo($valeur); } } } // Si c'est un tableau, on reapplique la fonction récursivement elseif (is_array($valeur)){ foreach ($valeur as $cle => $valeur2){ $valeur[$cle] = _T_ou_typo($valeur2, $mode_typo); } } return $valeur; }
function verifier_generer_aide(){ // On a déjà la liste par saisie $verifications = verifier_lister_disponibles(); // On construit une liste par options $options = array(); foreach ($verifications as $type_verif=>$verification){ $options_verification = saisies_lister_par_nom($verification['options'], false); foreach ($options_verification as $nom=>$option){ // Si l'option n'existe pas encore if (!isset($options[$nom])){ $options[$nom] = _T_ou_typo($option['options']); } // On ajoute toujours par qui c'est utilisé $options[$nom]['utilisee_par'][] = $type_verif; } ksort($options_verification); $verifications[$type_verif]['options'] = $options_verification; } ksort($options); return array( 'verifications' => $verifications, 'options' => $options ); }
/** * Charger les informations contenues dans le yaml d'une vérification * * @param string $type_verif * Le type de la vérification * * @param string $repertoire * Dans quel repertoire chercher les yaml. * * @return array Un tableau contenant le YAML décodé */ function verifier_charger_infos($type_verif, $repertoire = 'verifier') { include_spip('inc/yaml'); $fichier = find_in_path("{$repertoire}/{$type_verif}.yaml"); $verif = yaml_decode_file($fichier); if (is_array($verif)) { $verif['titre'] = (isset($verif['titre']) and $verif['titre']) ? _T_ou_typo($verif['titre']) : $type_verif; $verif['description'] = (isset($verif['description']) and $verif['description']) ? _T_ou_typo($verif['description']) : ''; $verif['icone'] = (isset($verif['icone']) and $verif['icone']) ? _T_ou_typo($verif['icone']) : ''; } return $verif; }
/** * Charger les informations contenues dans le xml d'une composition * * @param string $nom * @param string $info * @return array|string */ function compositions_charger_infos($nom,$info=""){ // on peut appeller avec le nom du squelette $nom = preg_replace(',[.]html$,i','',$nom).".xml"; include_spip('inc/xml'); $composition = array(); if ($xml = spip_xml_load($nom,false)){ if (count($xml['composition'])){ $xml = reset($xml['composition']); $composition['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom'])); $composition['description'] = isset($xml['description'])?_T_ou_typo(spip_xml_aplatit($xml['description'])):''; if (isset($xml['icon'])) { $icon = chemin_image(reset($xml['icon'])); if (!$icon) { $icon = find_in_path(reset($xml['icon'])); } } else { $icon = ''; } $composition['image_exemple'] = isset($xml['image_exemple']) ? find_in_path(reset($xml['image_exemple'])) : ''; $composition['icon'] = $icon; $composition['class'] = isset($xml['class']) ? trim(reset($xml['class'])) : ''; $composition['configuration'] = isset($xml['configuration']) ? spip_xml_aplatit($xml['configuration']) : ''; $composition['branche'] = array(); if (spip_xml_match_nodes(',^branche,', $xml, $branches)){ foreach (array_keys($branches) as $branche){ list($balise, $attributs) = spip_xml_decompose_tag($branche); $composition['branche'][$attributs['type']] = $attributs['composition']; } } } } if (!$info) return $composition; else return isset($composition[$info])?$composition[$info]:""; }
/** * Génère une page d'aide listant toutes les saisies et leurs options * * Retourne le résultat du squelette `inclure/saisies_aide` auquel * on a transmis toutes les saisies connues. * * @return string Code HTML */ function saisies_generer_aide() { // On a déjà la liste par saisie $saisies = saisies_lister_disponibles(); // On construit une liste par options $options = array(); foreach ($saisies as $type_saisie => $saisie) { $options_saisie = saisies_lister_par_nom($saisie['options'], false); foreach ($options_saisie as $nom => $option) { // Si l'option n'existe pas encore if (!isset($options[$nom])) { $options[$nom] = _T_ou_typo($option['options']); } // On ajoute toujours par qui c'est utilisé $options[$nom]['utilisee_par'][] = $type_saisie; } ksort($options_saisie); $saisies[$type_saisie]['options'] = $options_saisie; } ksort($options); return recuperer_fond('inclure/saisies_aide', array('saisies' => $saisies, 'options' => $options)); }
function formulaires_construire_formulaire_traiter($identifiant, $formulaire_initial=array(), $options=array()){ include_spip('inc/saisies'); $retours = array(); $saisies_disponibles = saisies_lister_disponibles(); // On ajoute un préfixe devant l'identifiant $identifiant = 'constructeur_formulaire_'.$identifiant; // On récupère le formulaire à son état actuel $formulaire_actuel = session_get($identifiant); // Si on demande à ajouter un groupe if ($ajouter_saisie = _request('ajouter_groupe_saisie')){ $formulaire_actuel = saisies_groupe_inserer($formulaire_actuel, $ajouter_saisie); } // Si on demande à ajouter une saisie if ($ajouter_saisie = _request('ajouter_saisie')){ $nom = saisies_generer_nom($formulaire_actuel, $ajouter_saisie); $saisie = array( 'saisie' => $ajouter_saisie, 'options' => array( 'nom' => $nom ) ); // S'il y a des valeurs par défaut pour ce type de saisie, on les ajoute if (($defaut = $saisies_disponibles[$ajouter_saisie]['defaut']) and is_array($defaut)){ $defaut = _T_ou_typo($defaut, 'multi'); //Compatibilite PHP<5.3.0 //source : http://www.php.net/manual/en/function.array-replace-recursive.php#92574 if (!function_exists('array_replace_recursive')) { function array_replace_recursive($array, $array1) { function recurse($array, $array1) { foreach ($array1 as $key => $value) { // create new key in $array, if it is empty or not an array if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key]))) { $array[$key] = array(); } // overwrite the value in the base array if (is_array($value)) { $value = recurse($array[$key], $value); } $array[$key] = $value; } return $array; } // handle the arguments, merge one by one $args = func_get_args(); $array = $args[0]; if (!is_array($array)) { return $array; } for ($i = 1; $i < count($args); $i++) { if (is_array($args[$i])) { $array = recurse($array, $args[$i]); } } return $array; } } $saisie = array_replace_recursive($saisie, $defaut); } $formulaire_actuel = saisies_inserer($formulaire_actuel, $saisie); } // Si on demande à dupliquer une saisie if ($dupliquer_saisie = _request('dupliquer_saisie')) { $formulaire_actuel = saisies_dupliquer($formulaire_actuel, $dupliquer_saisie); } // Si on demande à supprimer une saisie if ($supprimer_saisie = _request('supprimer_saisie')){ $formulaire_actuel = saisies_supprimer($formulaire_actuel, $supprimer_saisie); } // Si on enregistre la conf d'une saisie if ($nom = _request('enregistrer_saisie')){ // On récupère ce qui a été modifié $saisie_modifiee = _request("saisie_modifiee_$nom"); // On regarde s'il y a une position à modifier if (isset($saisie_modifiee['position'])){ $position = $saisie_modifiee['position']; unset($saisie_modifiee['position']); // On ne déplace que si ce n'est pas la même chose if ($position != $nom) $formulaire_actuel = saisies_deplacer($formulaire_actuel, $nom, $position); } // On regarde s'il y a des options de vérification à modifier if (isset($saisie_modifiee['verifier']['type']) and ($type_verif = $saisie_modifiee['verifier']['type']) != '') { $saisie_modifiee['verifier'] = array( 'type' => $type_verif, 'options' => $saisie_modifiee['verifier'][$type_verif] ); } else { unset($saisie_modifiee['verifier']); } // On récupère les options postées en enlevant les chaines vides $saisie_modifiee['options'] = array_filter($saisie_modifiee['options'], 'saisie_option_contenu_vide'); if (isset($saisie_modifiee['verifier']['options']) and $saisie_modifiee['verifier']['options']) { $saisie_modifiee['verifier']['options'] = array_filter($saisie_modifiee['verifier']['options'], 'saisie_option_contenu_vide'); } // On désinfecte à la main if (is_array($saisie_modifiee['options'])) spip_desinfecte($saisie_modifiee['options']); // On modifie enfin $formulaire_actuel = saisies_modifier($formulaire_actuel, $nom, $saisie_modifiee); } // Si on demande à réinitialiser if (_request('reinitialiser') == 'oui'){ $formulaire_actuel = $formulaire_initial; } // On enregistre en session la nouvelle version du formulaire session_set($identifiant, $formulaire_actuel); // Le formulaire reste éditable $retours['editable'] = true; return $retours; }
/** * Charger les informations contenues dans le YAML d'une saisie. * * @param string $type_saisie Le type de la saisie * * @return array Un tableau contenant le YAML décodé */ function saisies_charger_infos($type_saisie,$saisies_repertoire = "saisies") { if (defined('_DIR_PLUGIN_YAML')) { include_spip('inc/yaml'); $fichier = find_in_path("$saisies_repertoire/$type_saisie.yaml"); $saisie = yaml_decode_file($fichier); if (is_array($saisie)) { $saisie['titre'] = (isset($saisie['titre']) and $saisie['titre']) ? _T_ou_typo($saisie['titre']) : $type_saisie; $saisie['description'] = (isset($saisie['description']) and $saisie['description']) ? _T_ou_typo($saisie['description']) : ''; $saisie['icone'] = (isset($saisie['icone']) and $saisie['icone']) ? find_in_path($saisie['icone']) : ''; } } else { $saisie = array(); } return $saisie; }
/** * 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); }