X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fplugins%2Fauto%2Fsaisies%2Finc%2Fsaisies_manipuler.php;fp=www%2Fplugins%2Fauto%2Fsaisies%2Finc%2Fsaisies_manipuler.php;h=f5eb189e77c4939401dcfded7e67f9380004a0f5;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/plugins/auto/saisies/inc/saisies_manipuler.php b/www/plugins/auto/saisies/inc/saisies_manipuler.php new file mode 100644 index 0000000..f5eb189 --- /dev/null +++ b/www/plugins/auto/saisies/inc/saisies_manipuler.php @@ -0,0 +1,266 @@ + count($parent)) $position = count($parent); + } + // Et enfin on insère + array_splice($parent, $position, 0, array($saisie)); + } + + return $saisies; +} + +/* + * Duplique une saisie (ou groupe de saisies) + * en placant la copie à la suite de la saisie d'origine. + * Modifie automatiquement les identifiants des saisies + * + * @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 a dupliquer + * @return array Retourne le tableau modifié des saisies + */ +function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin){ + // On récupère le contenu de la saisie à déplacer + $saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin); + if ($saisie) { + list($clone) = saisies_transformer_noms_auto($saisies, array($saisie)); + // insertion apres quoi ? + $chemin_validation = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true); + // 1 de plus pour mettre APRES le champ trouve + $chemin_validation[count($chemin_validation)-1]++; + // On ajoute "copie" après le label du champs + $clone['options']['label'] .= ' '._T('saisies:construire_action_dupliquer_copie'); + + // Création de nouveau identifiants pour le clone + $clone = saisie_identifier($clone, true); + + $saisies = saisies_inserer($saisies, $clone, $chemin_validation); + } + + return $saisies; +} + +/* + * 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)); + } + // Si l'endroit est entre crochet, c'est un conteneur + 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)); + } + // Sinon on vérifie que ce conteneur existe + 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; + } + // Sinon ça sera devant un champ + 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; +} + +/* + * Modifie une saisie + * + * @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 à modifier + * @param array $modifs Le tableau des modifications à apporter à la saisie + * @return Retourne le tableau décrivant les saisies, mais modifié + */ +function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs){ + $chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true); + $position = array_pop($chemin); + $parent =& $saisies; + foreach ($chemin as $cle){ + $parent =& $parent[$cle]; + } + + // On récupère le type, le nom s'il n'y est pas, et les enfants tels quels + $modifs['saisie'] = $parent[$position]['saisie']; + if (!isset($modifs['options']['nom'])) $modifs['options']['nom'] = $parent[$position]['options']['nom']; + if (is_array($parent[$position]['saisies'])) $modifs['saisies'] = $parent[$position]['saisies']; + + // Si une option 'nouveau_type_saisie' est donnee, c'est que l'on souhaite + // peut être changer le type de saisie ! + if (isset($modifs['options']['nouveau_type_saisie']) and $type = $modifs['options']['nouveau_type_saisie']) { + $modifs['saisie'] = $type; + unset($modifs['options']['nouveau_type_saisie']); + } + + // On remplace tout + $parent[$position] = $modifs; + + // Cette méthode ne marche pas trop + //$parent[$position] = array_replace_recursive($parent[$position], $modifs); + + return $saisies; +} + +/* + * Transforme tous les noms du formulaire avec un preg_replace + * + * @param array $saisies Un tableau décrivant les saisies + * @param string $masque Ce que l'on doit chercher dans le nom + * @param string $remplacement Ce par quoi on doit remplacer + * @return array Retourne le tableau modifié des saisies + */ +function saisies_transformer_noms($saisies, $masque, $remplacement){ + if (is_array($saisies)){ + foreach ($saisies as $cle => $saisie){ + $saisies[$cle]['options']['nom'] = preg_replace($masque, $remplacement, $saisie['options']['nom']); + if (is_array($saisie['saisies'])) + $saisies[$cle]['saisies'] = saisies_transformer_noms($saisie['saisies'], $masque, $remplacement); + } + } + + return $saisies; +} + +/* + * Transforme les noms d'une liste de saisies pour qu'ils soient + * uniques dans le formulaire donné. + * + * @param array $formulaire Le formulaire à analyser + * @param array $saisies Un tableau décrivant les saisies. + * @return array Retourne le tableau modifié des saisies + */ +function saisies_transformer_noms_auto($formulaire, $saisies){ + + if (is_array($saisies)){ + foreach ($saisies as $cle => $saisie){ + $saisies[$cle]['options']['nom'] = saisies_generer_nom($formulaire, $saisie['saisie']); + // il faut prendre en compte dans $formulaire les saisies modifiees + // sinon on aurait potentiellement 2 champs successifs avec le meme nom. + // on n'ajoute pas les saisies dont les noms ne sont pas encore calculees. + $new = $saisies[$cle]; + unset($new['saisies']); + $formulaire[] = $new; + + if (is_array($saisie['saisies'])) + $saisies[$cle]['saisies'] = saisies_transformer_noms_auto($formulaire, $saisie['saisies']); + } + } + + return $saisies; +} + +/* + * Insère du HTML au début ou à la fin d'une saisie + * + * @param array $saisie La description d'une seule saisie + * @param string $insertion Du code HTML à insérer dans la saisie + * @param string $ou L'endroit où insérer le HTML : "debut" ou "fin" + * @return array Retourne la description de la saisie modifiée + */ +function saisies_inserer_html($saisie, $insertion, $ou='fin'){ + if (!in_array($ou, array('debut', 'fin'))) + $ou = 'fin'; + + if ($ou == 'debut') + $saisie['options']['inserer_debut'] = $insertion.$saisie['options']['inserer_debut']; + elseif ($ou == 'fin') + $saisie['options']['inserer_fin'] = $saisie['options']['inserer_fin'].$insertion; + + return $saisie; +} + +?>