Compare commits

...

113 Commits
master ... v3

Author SHA1 Message Date
Maïeul 3c77d7912d build: v3.56.4 2 weeks ago
Maïeul 715732f2c2 fix: Revert "add: `saisies_chercher_formulaire()` peut rechercher `_saisies` dans la" 2 weeks ago
b_b 66790c913f build: version 3.56.3 2 weeks ago
Maïeul 5a54713db9 fix(formidable/120): Pour la saisie explication, seul le bouton d'affichage/masquage affiche/masque, pas les boutons du constructeur de formulaire. 2 weeks ago
b_b fadaaab02c fix: compat PHP < 7 2 weeks ago
Maïeul 6f586ae11d add: `saisies_chercher_formulaire()` peut rechercher `_saisies` dans la 2 weeks ago
b_b e3aa4c6998 fix: réparer l'utilisation des saisies dans un cvt multi étapes avec `#GENERER_SAISIES` 2 weeks ago
Maïeul de2b45925a fix(formidable/120): Pour la saisie explication, seul le bouton d'affichage/masquage affiche/masque, pas les boutons du constructeur de formulaire. 2 months ago
Maïeul 5eed3b415e Correction de `selecteur_document.yaml` mal formaté (problème 4 months ago
Maïeul 168d85490c Up de z suite correctif 4 months ago
Maïeul 1a7743eff6 44363f04ce avait supprimé par erreur une négation de test 4 months ago
Maïeul fd78d5e191 fix warning 4 months ago
Maïeul d7bf8531da up de y 4 months ago
Maïeul c0f25880ba Fix #199 : constructeur de saisie : tout ce qui est afficher_si dans un 4 months ago
Maïeul 64dfad4dd9 Inclure le fichier `saisies/base/options_dev` dans la v3, pour les 4 months ago
RastaPopoulos 4c0cc4d18c Z++ pour backport de la correction de bug sur les classes de label qui pète les frameworks (avait été fusionné uniquement en master v4) 5 months ago
RastaPopoulos fa3efd0d3e Issue #129 : mettre la classe .label est trop spécifique. On change ça pour .editer-label pour suivre la norme existante (editer-groupe, etc). SAUF pour les legend des fieldsets, car pour l'instant le noyau n'a pas encore changé sur ce point. Dans ce cas là uniquement on rajoute .label tout court aussi. Mais quand le core sera corrigé, on pourra le virer complètement. Dans la CSS, on est donc pas aussi générique, on ne l'applique que si legend.label, ou le nouveau .editer-label qui est plus spécifique. 5 months ago
Maïeul 44363f04ce Fix bug signalé ici https://discuter.spip.net/t/affichage-conditionnel-de-saisie-syntaxe-des-tests-spip3-2-13/159418 7 months ago
erational fe6573433c report de 3b5c0df514 - ne pas afficher les dates vides 7 months ago
Maïeul 630722070e Message d'erreur sur les saisies dont le name est un tableau : les 8 months ago
Maïeul 7e680e39f2 coquille appel chaine de langue 8 months ago
Maïeul 29ba0745ff oh punaise 8 months ago
Maïeul 5bc4b92c7a commentaire mort 8 months ago
Maïeul fd021a0aeb Up de y suite aux différents commits, notamment 8 months ago
Maïeul c73fef4acd 20bef58911 avait cassé le retour de l'icone de saisie si elle était inexistante (ca change concrètement rien du coup, c'est juste histoire d'être cohérent) 8 months ago
Maïeul 3e5c2bda2e code de debug qui trainait 8 months ago
Maïeul 8c227729fb fix warning dans , si on veut insérer après une saisie qui n'existe pas : dans ce cas insérer tout à la fin 8 months ago
Maïeul d1ca71291e fix warning dans si on veut insérer une mauvaise saisie 8 months ago
Maïeul e647a41e36 Ajout de `saisie_deplacer_avant()` et `saisies_deplacer_apres()` (qui encapsulent 8 months ago
Maïeul 0bc10102cf commentaire inutile 8 months ago
Maïeul 6a828a7b45 Préambule à la résolution de #155 : des tests unitaires (old school) sur 8 months ago
Maïeul dc5a9da7ba coquille PHPdoc 8 months ago
Maïeul f57736587d pour faire plaisir à @marcimat, utiliser des tests stricts :) 8 months ago
Maïeul 908e8b3403 Dans les fonction PHP d'évaluation des afficher_si, utiliser des noms de 8 months ago
Maïeul 0d6c29a903 erreur PHPdoc 8 months ago
Maïeul 4b37620c7b Afficher_si, 8 months ago
Maïeul 088a15f109 Une fonction pour sérialiser les champs extras dont la saisie est de type `choix_grille`. 8 months ago
Maïeul 7af78ce413 Une fonction pour afficher `#LISTER_VALEURS` dans le cas où le champ 8 months ago
Maïeul 803913e11b Ordre des paramètres dans `join()` 8 months ago
Maïeul b252583a7e grille de question : proposer des data par défaut, pour éviter des warnings dans les constructeurs de form 8 months ago
RastaPopoulos 0ca56362aa Fix spip-contrib-extensions/formidable#82 : f123b5e0e6 résolvant #135 avait cassé le fait que par défaut, ça doit toujours renvoyer la valeur brute de départ. Le test de regex ne servait qu'à transformer que si SQL, mais sinon ça laissait tel quel avant. Donc il faut remettre le #SET du début mais si ya plus vider_date. 8 months ago
Maïeul 9cdf5ba6e6 Pour l'icone des saisies, aller chercher d'abord dans le dossier 8 months ago
Maïeul dc971a92c8 COnstructeur de formulaire : lorsqu'on transforme les afficher_si, ne 8 months ago
Maïeul eeb02c7b76 encore un cas où l'on cherchait dans les options globales des saisies, alors qu'en fait on ne voulait chercher que dans les saisies elles-même 8 months ago
Maïeul 1bc95131e2 oups 8 months ago
Maïeul 6f1e051ad1 Fix #159. 8 months ago
Maïeul 9865dbea3e Fix #128 8 months ago
Maïeul a517cca728 up de z 8 months ago
Maïeul 80214cba05 la saisie `choix_grille` peut raisonnablement être considérée comme tabulaire 8 months ago
Maïeul 4085b1488a Vu de la saisie grille : 8 months ago
Maïeul f123b5e0e6 A priori ce n'est pas à la vue de décider si on accepte les dates nulles 9 months ago
Maïeul 724db5b408 Fix #148 9 months ago
Maïeul 0ef583ab66 pour les cases, préferer label_case 9 months ago
tcharlss 253c8b15f2 Version 3.54.9 (up de z) 10 months ago
tcharlss 23eeef1650 Retirer l'attribut name=submit du bouton de validation principal. (#146) 10 months ago
nicod_ 0b9fecd54f Une classe spécifique pour les champs disabled 1 year ago
Maïeul 9da31d7155 up de z 1 year ago
Maïeul 98d157774d afficher_si sur les champs hidden 1 year ago
Maïeul 4c1a0ecf48 On affiche les saisies masquées par afficher_si avec erreur qu'au 1 year ago
Maïeul eec7744bce Fix #127. 1 year ago
Maïeul f04543c0c0 une taille max pour les icones des saisies, lorsqu'on les a en svg (commit uniquement sur branche v3) 1 year ago
Maïeul 2f9106f3b6 release en v3 suite au derniers bugfix 1 year ago
Maïeul c6bfe582f0 Fix spip-contrib-extensions/formidable#73 1 year ago
Maïeul 559982e465 ancre mal nommé 1 year ago
RastaPopoulos a9520a34d5 Z+ en V3 suite au backport des 3 dernières corrections 1 year ago
RastaPopoulos 806b573d26 Encore un cas où ça n'utilisait pas saisies_request() et ça cherche directement une clé dans le tableau, et donc où ça ne marchait pas pour les names en tableau. J'espère qu'il n'y en a plus, normalement c'était l'objet de #29 mais il restait encore des endroits où ça ne l'utilisait pas. Aussi deuxième bug au passage, même sans les names tableau : pour afficher_si ça ne cherchait la valeur que dans l'env valeurs, alors que depuis le départ dans generer_vue ça cherche dans l'env valeurs et sinon dans l'env directement. Du coup incohérence entre les deux. Par compat dans les deux endroits j'ai rajouté une transformation en chaine vide si c'est null, car saisies_request renvoie null quand ça n'existe pas, alors qu'avant à ces endroits ça mettait chaine vide. Ce n'est peutêtre pas utile pourrait être retiré. 1 year ago
tcharlss 09d73774e6 Test plus robuste pour activer l'onglet par défaut (sinon erreur JS dans certains cas) 1 year ago
RastaPopoulos 1f77067492 Perf : il n'y a pas à lancer tout une machinerie de parsing, preg_match_all etc sur 5 fonctions d'affilés, pour une chaine qui est dès le départ vide. 1 year ago
RastaPopoulos a2fc2aabb1 Z+ en v3 suite aux backports de correction de bugs 1 year ago
RastaPopoulos a5a0677578 Retour sur 9e50d12418 qui cassait complètement les affichages dès que les champs avaient des noms en tableau, puisque la clé de chaque nom ne correspond absolument pas aux clés du tableau valeurs. Il n'y a pas à faire d'exception pour les fieldsets, il est dit depuis le départ que c'est #GET reponse qui doit absolument être vide s'il n'y a pas de réponse. C'est donc à la saisie fieldset de ne pas générer de titre et d'entourage, si son intérieur est vide aussi. Et justement on utilise déjà #INCLURE, qui sert justement à pouvoir mettre du conditionnel autour. Donc on met l'entourage dans ce conditionnel. 1 year ago
RastaPopoulos 5e4988809e Fix #28 comme indiqué dans le ticket. 1) Simplification de saisies_request qui n'a pas besoin de tester le tableau lui-même, puisque _request de base permet déjà de lui passer un tableau explicite. 2) Simplification à mort de l'affichage de la vue car on ne doit pas répéter X fois le traitement des champs tableaux avec crochets, c'est saisies_request qui le fait. Ce qui corrige le bug que ça n'utilisait pas env valeurs pour le cas où c'était des tableaux, et ça cherchait que dans env. Tout en simplifiant le code. 1 year ago
RastaPopoulos fc706fe44e Une nouvelle saisie générique statuts_objet, plutôt que faire des trucs en dur comme le statuts_auteur qui existait déjà. Là ça marche pour n'importe quel objet suivant la déclaration. 1 year ago
Maïeul 5dae98ec40 up de z suite aux différents correctifs 1 year ago
RealET 1dbde503e2 Même chose pour SPIP 3, fix #117 1 year ago
Maïeul 23357674da Revert "Fix #120, le bouton de validation par défaut devient 'Envoyer' plutôt que 'Enregistrer' : plus générique + correspond à ce qui était historiquement le cas pour Formidable" 1 year ago
Maïeul 871d498d97 up de z suitte aux différents correctis de la semaine passée 1 year ago
Maïeul dde43bd13d Fix #120, le bouton de validation par défaut devient 'Envoyer' plutôt que 'Enregistrer' : plus générique + correspond à ce qui était historiquement le cas pour Formidable 1 year ago
Maïeul 73f16fbbc5 certains labels peuvent avoir des balise html dedans, il faut les afficher correctement sur la vue 1 year ago
Maïeul 1caf57aa3e Fix #20 1 year ago
Maïeul 69a98c0b40 Rétablir le parsing correct des chaines de langue dans le bouton de soumission d'un formulaire. 1 year ago
Maïeul 1f31fd9e6a les saisies radios peuvent avoir des sous groupes, alors autant l'expliquer 1 year ago
Maïeul ad6d68ea99 Afficher_si et regexp : permettre plusieurs modificateurs 1 year ago
Maïeul 0873a993fc fix #117, avoir des id valables (ce bug est suite à une correction trop 1 year ago
Maïeul 79d5048369 up de z sur les différents correctifs des derniers jours 1 year ago
Maïeul 23d7f7f209 fléche de pliage/depliage de fieldset, ne pas se tromper 1 year ago
Maïeul d56a8c0591 Gérer la triple contraintes sur les formulaires automagique de config 1 year ago
Maïeul b7ca5d7bfc optimisation dans le recherche du meta_casier, on a deja cherché sa valeur avant 1 year ago
Maïeul 9e3f01fc02 z sur les différents bugfiz de la demi-semaine 1 year ago
Maïeul 7bc9ddb546 La vérification des valeurs acceptables dépend parfois des afficher_si 1 year ago
Maïeul 2a8be6929c Un strong popour la vue des legend des fieldset, en attendant qu'on casse encore le markup 1 year ago
Maïeul 2c67cc2708 Déclaration automagique des formulaires de config. Si jamais on a une saisie `meta_casier`, alors il faut aller chercher les valeurs dans ce meta là, et non pas dans un meta homonyme au formulaire (pour les squelettes comme Escal qui utilise une 30 aines de formulaires de config !). 1 year ago
Maïeul 634689443c Retour sur le commit 625631c038. 1 year ago
Maïeul e5b721f2ed up de y (accessibilité + perf) 1 year ago
Maïeul c385fd9dc1 Perf 1 year ago
Maïeul 3e17de3abe Inutile d'avoir un fichier _options partout, vu que _T_ou_typo est appelé uniquement dans certaines fonctions 1 year ago
Maïeul 4bfb9c3284 Coquille PHpDoc 1 year ago
Maïeul 982a7156b7 Lorsqu'on a des sous groupes au sein d'une saisie radio, affecter 1 year ago
Maïeul 645c99581f espacement 1 year ago
nicod_ 1795e61fe0 Pb #88, accessibilité 1 year ago
nicod_ 12ab9541f8 Suite à la mise à jour des styles de formulaires, réduire cette marge dans le construteur (testé sur 3.2 et 3.3) 1 year ago
Maïeul d5c8dbcedf coquille phpDoc, bis 1 year ago
Maïeul e94c6b7ac0 coquille phpdoc 1 year ago
RastaPopoulos c1709e9508 Revert de style des labels : la CSS saisies.css vaut pour partout et ne devrait contenir que des styles fonctionnels obligatoires pour faire marcher telle ou telle saisies. Elle ne doit pas servir à corriger les styles par défaut de la dist publique par exemple. 1 year ago
RastaPopoulos 45256d682a Ne lancer le JS d'afficher_si que sur les forms concernés + dans 1 year ago
Eric Lupinacci 6e517a5ff2 SPIP 2 et CFG sont loin, on évite d'en parler dans la description 1 year ago
Maïeul e8c6553ccd Quitte à avoir fait une chaine de langue spéciale, autant l'utiliser 1 year ago
Maïeul fd35066cd3 ordre des arguments de join (fix warning, et sans doute erreur dans le futur) 1 year ago
nicod_ 8157e8a413 Les labels des choix en ligne à côté des choix 1 year ago
nicod_ 8556ad5e89 Toujours afficher les labels des formulaires 1 year ago
Maïeul 00bf167930 v3 de saisies uniquement pour spip 3.y, pour spip 4.x, prendre le master 1 year ago
Maïeul 5944ba8a38 les changements de la semaine mèritent un up de z 1 year ago
Maïeul 6a230d0d14 Dans le constructeur de formulaire, permettre de déplacer au sein de 1 year ago
Maïeul 1094f764ba un " qui trainait 1 year ago
  1. 48
      champs_extras/calculer_balise_lister_valeurs_choix_grille.php
  2. 18
      champs_extras/serialiser_choix_grille.php
  3. 3
      css/formulaires_constructeur.css
  4. 42
      css/saisies.css
  5. 4
      formulaires/construire_formulaire.html
  6. 2
      formulaires/construire_formulaire.php
  7. 4
      formulaires/inc-saisies-cvt-boutons.html
  8. 53
      inc/saisies.php
  9. 46
      inc/saisies_afficher.php
  10. 93
      inc/saisies_afficher_si_commun.php
  11. 2
      inc/saisies_afficher_si_js.php
  12. 11
      inc/saisies_afficher_si_php.php
  13. 17
      inc/saisies_data.php
  14. 19
      inc/saisies_lister.php
  15. 11
      inc/saisies_lister_disponibles.php
  16. 69
      inc/saisies_manipuler.php
  17. 21
      inc/saisies_request.php
  18. 14
      inc/saisies_verifier.php
  19. 8
      javascript/saisies.js
  20. 82
      javascript/saisies_afficher_si.js
  21. 2
      lang/paquet-saisies_fr.php
  22. 5
      lang/saisies_fr.php
  23. 5
      paquet.xml
  24. 2
      prive/squelettes/contenu/saisies_doc.html
  25. 16
      prive/style_prive_plugin_saisies.html
  26. 12
      saisies-vues/_base.html
  27. 2
      saisies-vues/checkbox.html
  28. 10
      saisies-vues/choix_grille.html
  29. 11
      saisies-vues/date.html
  30. 19
      saisies-vues/fieldset.html
  31. 2
      saisies-vues/radio.html
  32. 2
      saisies-vues/selection.html
  33. 4
      saisies-vues/selection_multiple.html
  34. 47
      saisies/_base.html
  35. 16
      saisies/_base/options_dev.yaml
  36. 8
      saisies/auteurs.yaml
  37. 10
      saisies/case.yaml
  38. 40
      saisies/checkbox.html
  39. 15
      saisies/checkbox.yaml
  40. 11
      saisies/choix_grille.html
  41. 18
      saisies/choix_grille.yaml
  42. 8
      saisies/date.yaml
  43. 2
      saisies/destinataires.html
  44. 7
      saisies/destinataires.yaml
  45. 8
      saisies/email.yaml
  46. 9
      saisies/explication.html
  47. 18
      saisies/explication.yaml
  48. 2
      saisies/fieldset.html
  49. 9
      saisies/fieldset.yaml
  50. 2
      saisies/hidden.html
  51. 4
      saisies/hidden.yaml
  52. 2
      saisies/input.html
  53. 8
      saisies/input.yaml
  54. 8
      saisies/mot.yaml
  55. 8
      saisies/oui_non.yaml
  56. 16
      saisies/radio.html
  57. 17
      saisies/radio.yaml
  58. 8
      saisies/selecteur_article.yaml
  59. 8
      saisies/selecteur_document.yaml
  60. 8
      saisies/selecteur_rubrique.yaml
  61. 8
      saisies/selecteur_rubrique_article.yaml
  62. 3
      saisies/selection.html
  63. 15
      saisies/selection.yaml
  64. 11
      saisies/selection_multiple.html
  65. 15
      saisies/selection_multiple.yaml
  66. 9
      saisies/statuts_objet.html
  67. 8
      saisies/textarea.yaml
  68. 68
      saisies_options.php
  69. 80
      saisies_pipelines.php
  70. 5
      tests/saisies_afficher_si/saisies_afficher_si_verifier_syntaxe.php
  71. 28
      tests/saisies_afficher_si/saisies_tester_condition_afficher_si.php
  72. 246
      tests/saisies_deplacer/saisies_deplacer.php
  73. 1144
      tests/saisies_deplacer/saisies_deplacer_apres.php
  74. 1129
      tests/saisies_deplacer/saisies_deplacer_avant.php

48
champs_extras/calculer_balise_lister_valeurs_choix_grille.php

@ -0,0 +1,48 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Déclaration de la balise LISTER_VALEURS pour la saisie `choix_grille`
* @param string $objet
* Type d'objet
* @param string $colonne
* Nom de la colonne SQL
* @param string $cles
* Valeurs enregistrées pour ce champ dans la bdd pour l'objet en cours
* @return array|string vide
* Tableau de type 'Clé de ligne|Valeur de ligne' => 'Ligne en valeur humaine|Valeur de ligne en humain'.
* Par ex 'Ligne1|Colonne1' => 'Ma première ligne|Ma première colonne'
**/
function champs_extras_calculer_balise_LISTER_VALEURS_choix_grille($objet, $colonne, $cles) {
if (
$options = calculer_balise_CHAMP_EXTRA($objet, $colonne)
and isset($options['data_rows'])
and isset($options['data_cols'])
) {
$data_rows = saisies_chaine2tableau($options['data_rows']);
$data_cols = saisies_chaine2tableau($options['data_cols']);
$retour = [];
$valeurs = saisies_chaine2tableau($cles);
foreach ($valeurs as $cle => $valeur) {
if (is_array($valeur)) {
$colonne_humaine = join('|',
array_map(
function ($i) use ($data_cols) {
return $data_cols[$i];
},
$valeur
)
);
$retour["$cle|".join('|', $valeur)] = $data_rows[$cle].'|'.$colonne_humaine;
} else {
$retour["$cle|$valeur"] = $data_rows[$cle].'|'.$data_cols[$valeur];
}
}
return $retour;
} else {
return '';
}
}

18
champs_extras/serialiser_choix_grille.php

@ -0,0 +1,18 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Sérialise les réponses à un champ extra de type `choix_grille` pour encodage en base.
* @param array $extra
* La valeur reçue en POST
* @param array $saisie
* La description de la saisie
* @return string
* Forme serialisé, en l'occurence avec saisies_tableau2chaine
**/
function champs_extras_serialiser_choix_grille($extra, $saisie) {
include_spip('inc/saisies');
return saisies_tableau2chaine($extra);
}

3
css/formulaires_constructeur.css

@ -28,7 +28,7 @@
border:1px dashed #999;
}
.formulaire_construire_formulaire .fieldset.configurable>fieldset>.editer-groupe {
margin-left:30px;
margin-left: 0;
}
.formulaire_construire_formulaire .formulaire_configurer{
@ -117,6 +117,7 @@
color:black;
cursor:pointer;
background:white 8px center no-repeat;
background-size: auto 24px;
border:1px solid #ccc;
}

42
css/saisies.css

@ -1,5 +1,8 @@
/* Dans l'espace privé, afficher les labels des vues de Saisies */
#wysiwyg .afficher .label{ display:block; }
/* Dans l'espace privé, afficher les labels de Saisies */
#wysiwyg .formulaire_spip .label,
#wysiwyg .afficher .label {
display:block;
}
/* Correction d'un bug de navigateur. On l'ajoute là pour tout le monde, c'est gentil. https://stackoverflow.com/a/17863685 */
fieldset {
@ -10,16 +13,17 @@ fieldset {
cursor:pointer;
}
.fieldset.pliable:not(.plie) > fieldset > .legend span:before{
content: ' ';
content: ' ';
}
[dir='rtl'] .fieldset.pliable:not(.plie) > fieldset > .legend span:before{
content: ' ';
.fieldset.plie > fieldset > .legend span:before{
content: ' ';
}
.fieldset.plie > fieldset > .legend span:before{
content: ' ';
[dir='rtl'] .fieldset.plie > fieldset > .legend span:before{
content: ' ';
}
/*date triple champs...
@ -56,16 +60,24 @@ fieldset {
overflow-x: auto;
}
.formulaire_spip .editer .choix-groupe label,
.formulaire_spip .editer .choix-groupe .label {
float: none;
.formulaire_spip .choix-groupe {
border: none;
margin-top: 0;
margin-bottom: 0;
margin-left: 0;
margin-bottom: 0.25em;
width: auto;
padding: 0;
}
.formulaire_spip .editer .choix-groupe + .choix-groupe {
margin-top: 1em;
.formulaire_spip .choix-groupe label,
.formulaire_spip .choix-groupe legend.label,
.formulaire_spip .choix-groupe .editer-label {
float: none;
background-color: transparent;
margin-left: 0;
margin-bottom: 0.5em;
padding-left: 0;
padding-bottom: 0;
width: auto;
}
/* Base minimale des onglets des saisies fieldsets */
@ -130,4 +142,4 @@ fieldset {
padding-left: 1.5em;
border-left: 1px solid #E3E3E3;
border-radius: 12px;
}
}

4
formulaires/construire_formulaire.html

@ -170,10 +170,10 @@
// avant le suivant
if (!ou) {
// sinon dans le parent
ou = ui.item.closest('.fieldset').data('id');
ou = ui.item.closest('.avec_sous_saisies').data('id');
// Si jamais match lui-même, ca veut dire qu'on déplace un fieldest
if (ou == id) {
ou = ui.item.parents('.fieldset').first().data("id");
ou = ui.item.parents('.avec_sous_saisies').first().data("id");
}
if (ou) {
ou = '\[' + ou + '\]';

2
formulaires/construire_formulaire.php

@ -493,7 +493,7 @@ function construire_formulaire_transformer_nom(&$valeur, $cle, $transformation)
// Applique une transformation à la valeur de tous les champs "afficher_si" d'un formulaire, y compris loin dans l'arbo
function construire_formulaire_transformer_afficher_si(&$valeur, $cle, $transformation) {
if ($cle == 'afficher_si' and is_string($valeur)) {
$valeur = preg_replace("#@(.*)@#U", '@'.$transformation.'[${1}]@', $valeur);
$valeur = preg_replace("#@((?!config:)(?!plugin).*)@#U", '@'.$transformation.'[${1}]@', $valeur);
}
}

4
formulaires/inc-saisies-cvt-boutons.html

@ -1,11 +1,11 @@
<p class="boutons" [ data-afficher_si="(#ENV*{_saisies/options/afficher_si_submit}|saisies_afficher_si_js{#ENV{_saisies}})"]>
<span class="image_loading"></span>
[(#SET{label_valider, #ENV{_saisies/options/texte_submit, #ENV*{saisies_texte_submit, <:bouton_enregistrer:>}}})]
[(#SET{label_valider, #ENV*{_saisies/options/texte_submit, #ENV*{saisies_texte_submit, <:bouton_enregistrer:>}}})]
[(#ENV{_etape}|et{#ENV{_etape}|!={#ENV{_etapes}}})
[(#SET{label_valider, #ENV*{_saisies/options/etapes_suivant, <:bouton_suivant:>}})]
]
[(#ENV{_etape}|>{1}|oui)
<button type="submit" class="submit submit__precedent" name="aller_a_etape" value="[(#ENV{_saisies}|saisies_determiner_recul_rapide{#ENV{_etape}})]" >[(#ENV*{_saisies/options/etapes_precedent, <:precedent|ucfirst:>}|_T_ou_typo)]</button>
]
<button type="submit" class="submit[(#ENV{_etapes}|oui) submit__suivant]" name="submit" value="1">[(#GET{label_valider}|_T_ou_typo)]</button>
<button type="submit" class="submit[(#ENV{_etapes}|oui) submit__suivant]" value="1">[(#GET{label_valider}|_T_ou_typo)]</button>
</p>

53
inc/saisies.php

@ -47,5 +47,56 @@ include_spip('inc/saisies_formulaire');
// Les outils pour faciliter les conversion de name
include_spip('inc/saisies_name');
// _T_ou_Typo, parce que je ne sais pas ou le ranger...
if (!function_exists('_T_ou_typo')) {
/**
* 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 mixed $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 mixed
* Retourne la valeur éventuellement modifiée.
*/
function _T_ou_typo($valeur, $mode_typo = 'toujours') {
if (!in_array($mode_typo, array('toujours', 'multi', 'jamais'))) {
$mode_typo = 'toujours';
}
// Si la valeur est bien une chaine (et pas non plus un entier déguisé)
if (is_string($valeur) and !is_numeric($valeur)) {
// Si la chaine est du type <:truc:> on passe à _T()
if (strpos($valeur, '<:') !== false
and preg_match('/^\<:([^>]*?):\>$/', $valeur, $match)) {
$valeur = _T($match[1]);
} else {
// Sinon on la passe a typo() si c'est pertinent
if (
$mode_typo === 'toujours'
or ($mode_typo === 'multi' and strpos($valeur, '<multi>') !== false)
or (
$mode_typo === 'multi'
and strpos($valeur, '<:') !== false
and include_spip('inc/filtres')
and preg_match(_EXTRAIRE_IDIOME, $valeur))
) {
include_spip('inc/texte');
$valeur = typo($valeur);
}
}
}
// Si c'est un tableau, on réapplique la fonction récursivement
elseif (is_array($valeur)) {
foreach ($valeur as $cle => $valeur2) {
$valeur[$cle] = _T_ou_typo($valeur2, $mode_typo);
}
}
return $valeur;
}
}

46
inc/saisies_afficher.php

@ -116,15 +116,11 @@ function saisies_generer_html($champ, $env = array()) {
}
// S'il y a le détail des saisies du même formulaire, on le passe en contexte. Utiliser pour générer correctement les afficher_si
// Attention, en cas de multi-étapes, on passe le contexte de toutes les saisies, classées par etape en cherchant par priorit dans `saisies_par_etapes`, puis `_saisies_par_etapes`, puis `saisies` qu'on regroupe en étape.
if (isset($env['_etape'])) {
if (isset($env['saisies_par_etapes'])) {
$contexte['_saisies'] = $env['saisies_par_etapes'];
} elseif (isset($env['_saisies_par_etapes'])) {
$contexte['_saisies'] = $env['_saisies_par_etapes'];
} else {
$contexte['_saisies'] = isset($env['saisies']) ? saisies_lister_par_etapes($env['saisies']) : array();
}
// Attention, en cas de multi-étapes, on passe le contexte de toutes les saisies, classées par etape en cherchant par priorité dans `saisies_par_etapes`, puis `_saisies_par_etapes`, puis `saisies` qu'on regroupe en étapes.
if (isset($env['_etape']) and isset($env['saisies_par_etapes'])) {
$contexte['_saisies'] = $env['saisies_par_etapes'];
} elseif (isset($env['_etape']) and isset($env['_saisies_par_etapes'])) {
$contexte['_saisies'] = $env['_saisies_par_etapes'];
} else {
$contexte['_saisies'] = isset($env['saisies']) ? $env['saisies'] : array();
}
@ -132,9 +128,9 @@ function saisies_generer_html($champ, $env = array()) {
// Peut-être des transformations à faire sur les options textuelles
$options = isset($champ['options']) ? $champ['options'] : array();
foreach ($options as $option => $valeur) {
if ($option == 'datas' or $option == 'data') {
// exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
$options[$option] = saisies_chaine2tableau($valeur);
if (substr($option, 0, 4) === 'data' and !is_array($valeur)) {//data, ou datas, ou data_rows, ou data_cols
// exploser une chaine datas en tableau
$options[$option] = _T_ou_typo(saisies_chaine2tableau($valeur), 'multi');
} else {
$options[$option] = _T_ou_typo($valeur, 'multi');
}
@ -143,6 +139,8 @@ function saisies_generer_html($champ, $env = array()) {
if (!empty($options['li_class'])) {
$options['conteneur_class'] = $options['li_class'];
}
// Ne pas passer les sous saisies qui auraient été mise dans $options directement dans le le contexte, cf https://git.spip.net/spip-contrib-extensions/saisies/issues/127
unset($options['saisies']);
// On ajoute les options propres à la saisie
$contexte = array_merge($contexte, $options);
@ -251,9 +249,8 @@ function saisies_generer_vue($saisie, $env = array(), $env_obligatoire = array()
// Peut-être des transformations à faire sur les options textuelles
$options = $saisie['options'];
foreach ($options as $option => $valeur) {
if ($option == 'datas' or $option == 'data') {
// exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
$options[$option] = saisies_chaine2tableau($valeur);
if (substr($option, 0, 4) === 'data' and !is_array($valeur)) {//data, ou datas, ou data_rows, ou data_cols
$options[$option] = _T_ou_typo(saisies_chaine2tableau($valeur), 'multi');
} else {
$options[$option] = _T_ou_typo($valeur, 'multi');
}
@ -291,21 +288,10 @@ function saisies_generer_vue($saisie, $env = array(), $env_obligatoire = array()
}
// 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 (!empty($env['valeurs']) and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])) {
$contexte['valeur'] = $env['valeurs'][$contexte['nom']];
} elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', saisie_nom2name($contexte['nom']), $separe)) {
// Si le nom du champ est un tableau indexé, il faut parser !
$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 {
// Sinon la valeur est juste celle du nom
// certains n'ont pas de nom (fieldset)
$contexte['valeur'] = isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : '';
// On regarde en priorité s'il y a un tableau listant toutes les valeurs, sinon on cherchera dans l'env
$contexte['valeur'] = saisies_request($contexte['nom'], (!empty($env['valeurs']) and is_array($env['valeurs'])) ? $env['valeurs'] : $env);
if (is_null($contexte['valeur'])) {
$contexte['valeur'] = '';
}
// Si ya des enfants on les remonte dans le contexte

93
inc/saisies_afficher_si_commun.php

@ -105,43 +105,53 @@ function saisies_afficher_si_evaluer_plugin($champ, $negation = '') {
/**
* Teste une condition d'afficher_si
* @param string|array champ le champ à tester. Cela peut être :
* @param string|array $valeur_champ la valeur du champ à tester. Cela peut être :
* - un string
* - un tableau
* - un tableau sérializé
* @param string $total TOTAL si on demande de faire le décompte dans un tableau
* @param string $operateur : l'opérateur:
* @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23", "25"
* @param string $operateur : l'opérateur
* @param string $valeur la valeur à tester
* @param string $negation y-a-t-il un négation avant le test ? '!' si oui
* @return bool false / true selon la condition
**/
function saisies_tester_condition_afficher_si($champ, $total, $operateur='', $valeur='', $negation = '') {
function saisies_tester_condition_afficher_si($valeur_champ, $total, $operateur='', $valeur='', $negation = '') {
// Si pas operateur ni de valeur on test juste qu'un champ est cochée / validé
if (!$operateur and !$valeur) {
if ($negation) {
return !(isset($champ) and $champ);
return !(isset($valeur_champ) and $valeur_champ);
}
else {
return isset($champ) and $champ;
return isset($valeur_champ) and $valeur_champ;
}
}
if (is_null($champ)) {
$champ = '';
if (is_null($valeur_champ)) {
$valeur_champ = '';
}
//Si champ est de type string, tenter d'unserializer
if (!is_array($champ)) {
$tenter_unserialize = @unserialize($champ);
if (!is_array($valeur_champ)) {
$tenter_unserialize = @unserialize($valeur_champ);
if ($tenter_unserialize) {
$champ = $tenter_unserialize;
$valeur_champ = $tenter_unserialize;
}
}
// Transformation en tableau des valeurs et valeur_champ, si IN/!IN
if ($operateur === 'IN' or $operateur === '!IN') {
if (!is_array($valeur_champ)) {
if ($valeur_champ) {
$valeur_champ = array($valeur_champ);
} else {
$valeur_champ = array();
}
}
}
//Et maintenant appeler les sous fonctions qui vont bien
if (is_string($champ)) {
$retour = saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur);
} elseif (is_array($champ)) {
$retour = saisies_tester_condition_afficher_si_array($champ, $total, $operateur, $valeur);
if (is_string($valeur_champ)) {
$retour = saisies_tester_condition_afficher_si_string($valeur_champ, $operateur, $valeur);
} elseif (is_array($valeur_champ)) {
$retour = saisies_tester_condition_afficher_si_array($valeur_champ, $total, $operateur, $valeur);
} else {
$retour = false;
}
@ -154,47 +164,47 @@ function saisies_tester_condition_afficher_si($champ, $total, $operateur='', $va
/**
* Teste un condition d'afficher_si lorsque la valeur envoyée par le formulaire est une chaîne
* @param string champ le champ à tester.
* @param string $valeur_champ la valeur du champ à tester.
* @param string $operateur : l'opérateur:
* @param string|int $valeur la valeur à tester.
* @return bool false / true selon la condition
**/
function saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur) {
if ($operateur == "==") {
return $champ == $valeur;
} elseif ($operateur == "!=") {
return $champ != $valeur;
} elseif ($operateur == '<') {
return $champ < $valeur;
} elseif ($operateur == '<=') {
return $champ <= $valeur;
} elseif ($operateur == '>') {
return $champ > $valeur;
} elseif ($operateur == '>=') {
return $champ >= $valeur;
} elseif ($operateur == 'MATCH') {
return preg_match($valeur, $champ);
} elseif ($operateur == '!MATCH') {
return !preg_match($valeur, $champ);
function saisies_tester_condition_afficher_si_string($valeur_champ, $operateur, $valeur) {
if ($operateur === '==') {
return $valeur_champ == $valeur;
} elseif ($operateur === '!=') {
return $valeur_champ != $valeur;
} elseif ($operateur === '<') {
return $valeur_champ < $valeur;
} elseif ($operateur === '<=') {
return $valeur_champ <= $valeur;
} elseif ($operateur === '>') {
return $valeur_champ > $valeur;
} elseif ($operateur === '>=') {
return $valeur_champ >= $valeur;
} elseif ($operateur === 'MATCH') {
return preg_match($valeur, $valeur_champ);
} elseif ($operateur === '!MATCH') {
return !preg_match($valeur, $valeur_champ);
} else {//Si mauvaise operateur -> on annule
return false;
}
}
/**
* Teste un condition d'afficher_si lorsque la valeur postée est un tableau
* @param array champ le champ à tester.
* Teste un condition d'afficher_si lorsque la valeur postée est un tableau
* @param array $valeur_champ la valeur du champ à tester.
* @param string $operateur : l'opérateur:
* @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23", "25"
* @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23,25"
* @return bool false / true selon la condition
**/
function saisies_tester_condition_afficher_si_array($champ, $total, $operateur, $valeur) {
function saisies_tester_condition_afficher_si_array($valeur_champ, $total, $operateur, $valeur) {
if ($total) {//Cas 1 : on demande à compter le nombre total de champ
return saisies_tester_condition_afficher_si_string(count($champ), $operateur, $valeur);
return saisies_tester_condition_afficher_si_string(count($valeur_champ), $operateur, $valeur);
} else {//Cas deux : on test une valeur
$valeur = explode(',', $valeur);
$intersection = array_intersect($champ, $valeur);
if ($operateur == "==" or $operateur == "IN") {
$intersection = array_intersect($valeur_champ, $valeur);
if ($operateur === '==' or $operateur === 'IN') {
return count($intersection) > 0;
} else {
return count($intersection) == 0;
@ -289,9 +299,10 @@ function saisies_afficher_si_verifier_syntaxe($condition, $tests=array()) {
* @return array(
* 'regexp' => string,
* 'modificateur' => string
* )
**/
function afficher_si_parser_valeur_MATCH($valeur) {
preg_match('#^\/(.*)\/(.?)$#', $valeur, $m);
preg_match('#^\/(.*)\/(.*)$#', $valeur, $m);
if($m) {
return array(
'regexp' => $m[1],

2
inc/saisies_afficher_si_js.php

@ -26,7 +26,7 @@ function saisies_afficher_si_js($condition, $saisies_par_etapes = array()) {
return '';
}
$saisies_par_etapes = pipeline('saisies_afficher_si_saisies', $saisies_par_etapes);
if ($etape = _request('_etape')) {
if ($etape = _request('_etape') and array_key_exists('etape_1', $saisies_par_etapes)) {
$saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes["etape_$etape"]['saisies']);
$saisies_toutes_par_nom = saisies_lister_par_nom($saisies_par_etapes);
} else {

11
inc/saisies_afficher_si_php.php

@ -50,8 +50,8 @@ function saisies_verifier_afficher_si($saisies, $env = null, $saisies_toutes_par
foreach ($saisies as $cle => $saisie) {
if (
isset($saisie['options']['afficher_si'])
and $condition = trim($saisie['options']['afficher_si'])
) {
$condition = $saisie['options']['afficher_si'];
// Est-ce uniquement au remplissage?
if (isset($saisie['options']['afficher_si_remplissage_uniquement'])
and $saisie['options']['afficher_si_remplissage_uniquement']=='on'){
@ -173,9 +173,8 @@ function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies_par_nom) {
$valeur = saisies_request($champ);
}
} else {
if (isset($env['valeurs'][$champ])) {
$valeur = $env['valeurs'][$champ];
} else {
$valeur = saisies_request($champ, (!empty($env['valeurs']) and is_array($env['valeurs'])) ? $env['valeurs'] : $env);
if (is_null($valeur)) {
$valeur = '';
}
}
@ -239,8 +238,10 @@ function saisies_transformer_condition_afficher_si($condition, $env = null, $sai
if ($no_arobase === null) {
$nom_champ = $test['champ'];
} else {
$nom_champ = '';
}
if (!$saisies_par_nom or isset($saisies_par_nom[$nom_champ]) or strpos($nom_champ, 'config:') === 0 or strpos($nom_champ, 'plugin:')) {
if (!$saisies_par_nom or isset($saisies_par_nom[$nom_champ]) or strpos($nom_champ, 'config:') === 0 or strpos($nom_champ, 'plugin:') === 0) {
if ($no_arobase === null) {
$valeur_champ = saisies_afficher_si_get_valeur_champ($nom_champ, $env, $saisies_par_nom);
} else {

17
inc/saisies_data.php

@ -78,8 +78,7 @@ function saisies_chaine2tableau($chaine, $separateur = "\n") {
return $tableau;
}
elseif (is_array($chaine)) {
// Si c'est déjà un tableau on lui applique _T_ou_typo (qui fonctionne de manière récursive avant de le renvoyer
return _T_ou_typo($chaine, 'multi');
return $chaine;
}
else {
return array();
@ -200,11 +199,11 @@ function saisies_trouver_choix_alternatif($data, $valeur) {
* Ex : les data d'une saisie de type select
*
* @param array $tab Le tableau à aplatir
* @param bool $montrer_groupe mettre à false pour ne pas montrer le sous-groupe dans les label humain
* @param bool $masquer_sous_groupe mettre à true pour ne pas montrer le sous-groupe dans les label humain
*
* @return array
*/
function saisies_aplatir_tableau($tab, $montrer_groupe = true) {
function saisies_aplatir_tableau($tab, $masquer_sous_groupe = false) {
$nouveau_tab = array();
if (is_string($tab)) {
$tab = saisies_chaine2tableau($tab);
@ -213,10 +212,10 @@ function saisies_aplatir_tableau($tab, $montrer_groupe = true) {
foreach ($tab as $entree => $contenu) {
if (is_array($contenu)) {
foreach ($contenu as $cle => $valeur) {
if ($montrer_groupe) {
$nouveau_tab[$cle] = _T('saisies:saisies_aplatir_tableau_montrer_groupe', array('valeur' => $valeur, 'groupe' => $entree));
} else {
if ($masquer_sous_groupe) {
$nouveau_tab[$cle] = $valeur;
} else {
$nouveau_tab[$cle] = _T('saisies:saisies_aplatir_tableau_montrer_groupe', array('valeur' => $valeur, 'groupe' => $entree));
}
}
} else {
@ -230,8 +229,8 @@ function saisies_aplatir_tableau($tab, $montrer_groupe = true) {
/**
* Trouve le champ datas ou datas (pour raison historique)
* parmis les paramètres d'une saisie
* Trouve le champ data ou datas (pour raison historique)
* parmi les paramètres d'une saisie
* et le retourne après avoir l'avoir transformé en tableau si besoin
* @param array $description description de la saisie
* @bool $disable_choix : si true, supprime les valeurs contenu dans l'option disable_choix des data

19
inc/saisies_lister.php

@ -202,24 +202,25 @@ function saisies_lister_par_type($contenu) {
*
* @param array $saisies
* Liste des saisies
* @param bool $check_only = false, si true, se contente de vérifier si on gère les étapes, mais ne construit pas le tableau d'étape
* @return array|bool
* Retourne un tableau associatif par numéro d'étape avec pour chacune leurs saisies, false si pas d'étapes
* Retourne un tableau associatif par numéro d'étape avec pour chacune leurs saisies (ou bien true si check_only est à true), false si pas d'étapes
* Retourne un tableau associatif "etape_xxx" => "contenu de l'étape" avec pour chacune leurs saisies, false si pas d'étapes
* Ajoute si besoin une étape N+1 "Récapitulatif"
* Les noms des étapes sont automatiquement passés dans _T_ou_typo
*/
function saisies_lister_par_etapes($saisies) {
function saisies_lister_par_etapes($saisies, $check_only = false) {
$saisies_etapes = false;
$etapes = 0;
if (isset($saisies['options']['etapes_activer']) and $saisies['options']['etapes_activer']) {
// Un premier parcourt pour compter les étapes
if (isset($saisies['options']['etapes_ignorer_recapitulatif'])) {
$ignorer_recapitulatif = $saisies['options']['etapes_ignorer_recapitulatif'];
} else {
$ignorer_recapitulatif = false;
}
// Un premier parcourt pour compter les étapes
unset($saisies['options']);
foreach ($saisies as $cle => $saisie) {
if (is_array($saisies) and $saisie['saisie'] == 'fieldset') {
@ -229,6 +230,9 @@ function saisies_lister_par_etapes($saisies) {
// Seulement s'il y a au moins deux étapes
if ($etapes > 1) {
if ($check_only) {
return true;
}
$saisies_etapes = array();
$compteur_etape = 0;
@ -251,10 +255,10 @@ function saisies_lister_par_etapes($saisies) {
// Sinon si champ externe à un groupe, on l'ajoute à toutes les étapes
elseif (isset($saisie['saisie'])) {
for ($e=1;$e<=$etapes;$e++) {
if (!isset($saisies_etapes[$e]['saisies'])) {
$saisies_etapes[$e] = array('saisies'=>array());
if (!isset($saisies_etapes["etape_$e"]['saisies'])) {
$saisies_etapes["etape_$e"] = array('saisies'=>array());
}
array_push($saisies_etapes[$e]['saisies'], $saisie);
array_push($saisies_etapes["etape_$e"]['saisies'], $saisie);
}
}
}
@ -464,7 +468,7 @@ function saisies_autonomes() {
* @return return bool true si la saisie est tabulaire, false sinon
**/
function saisies_saisie_est_tabulaire($saisie) {
if (in_array($saisie['saisie'], array('checkbox', 'selection_multiple'))) {
if (in_array($saisie['saisie'], array('checkbox', 'selection_multiple', 'choix_grille'))) {
$est_tabulaire = true;
} else {
if ($saisie['saisie'] === 'selection' and isset($saisie['options']['multiple']) and $saisie['options']['multiple']) {
@ -498,6 +502,7 @@ function saisies_saisie_est_fichier($saisie) {
* @return array Retourne soit la saisie, soit son chemin, soit null
*/
function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin = false) {
unset($saisies['options']);
if (is_array($saisies) and $id_ou_nom_ou_chemin) {
if (is_string($id_ou_nom_ou_chemin)) {
$nom = $id_ou_nom_ou_chemin;

11
inc/saisies_lister_disponibles.php

@ -114,8 +114,15 @@ function saisies_charger_infos($type_saisie, $saisies_repertoire = 'saisies') {
? _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']) : '';
if (isset($saisie['icone']) and $saisie['icone']) {
$icone = $saisie['icone'];
$saisie['icone'] = chemin_image($icone);
if (!$saisie['icone']) {
$saisie['icone'] = find_in_path($icone);
}
} else {
$saisie['icone'] = '';
}
}
$cache[$fichier] = $saisie;
}

69
inc/saisies_manipuler.php

@ -1,7 +1,7 @@
<?php
/**
* Gestion de l'affichage des saisies.
* Gestion de la manipulation des saisies.
*
* @return SPIP\Saisies\Manipuler
**/
@ -85,7 +85,7 @@ function saisies_inserer($saisies, $saisie, $id_ou_nom_ou_chemin = array()) {
$chemin = array_merge($parent, array('saisies', $position));
$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $chemin);
} else {
$saisies = saisies_inserer_avant($saisies, $saisie, $id_ou_nom_ou_chemin); //saisies_inserer_avant($saisies, $saisie, $id_ou_nom_ou_chemin);
$saisies = saisies_inserer_avant($saisies, $saisie, $id_ou_nom_ou_chemin);
}
} else {
$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $id_ou_nom_ou_chemin);
@ -127,9 +127,14 @@ function saisies_inserer_apres($saisies, $saisie, $id_ou_nom_ou_chemin) {
} else {
$chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
}
// Si la saisie que l'on cherche n'existe pas, insérer tout à la fin
if ($chemin === null) {
$saisies = saisies_inserer_selon_chemin($saisies, $saisie);
} else {
$chemin[count($chemin)-1]++;
$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $chemin);
}
//Augmenter de 1 le dernier element du chemin
$chemin[count($chemin)-1]++;
$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $chemin);
return $saisies;
}
@ -153,7 +158,7 @@ function saisies_inserer_selon_chemin($saisies, $saisie, $chemin = array()) {
unset($saisies['options']);
}
// On vérifie quand même que ce qu'on veut insérer est correct
if ($saisie['saisie'] and $saisie['options']['nom']) {
if (isset($saisie['saisie']) and isset($saisie['options']['nom'])) {
// ajouter un identifiant
$saisie = saisie_identifier($saisie);
@ -227,11 +232,18 @@ function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin) {
*
* @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] (et dans ce cas on déplace à la fin de conteneur)
*
* @param string $ou
* - Le nom de la saisie devant laquelle on déplacera
* - OU le nom d'un conteneur entre crochets [conteneur] (et dans ce cas on déplace à la fin de conteneur)
* - OU le nom d'un conteneur entre crochets suivi d'un identifiant numérique entre crochets [conteneur][x] (et dans ce cas on déplace à la position x au sein du conteneur)
* @param string $avant_ou_apres (optionel) : valeur possible : `'avant'` ou `'apres'`, pour inserer respectivent avant/après la saisie `$ou`
* @return array Retourne le tableau modifié des saisies
*/
function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) {
function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou, $avant_ou_apres = 'avant') {
// Si le paramètre $avant_ou_apres est erronné, on arrête là
if ($avant_ou_apres !== 'avant' and $avant_ou_apres !== 'apres') {
return $saisies;
}
// On récupère le contenu de la saisie à déplacer
$saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
@ -242,7 +254,7 @@ function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) {
if (!$ou) {
$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
$chemin = array(count($saisies));
} elseif (preg_match('/^\[(@?[\w]*)\]$/', $ou, $match)) {
} elseif (preg_match('/^\[(@?[\w]*)\](\[([\d])*\])*$/', $ou, $match)) {
// Si l'endroit est entre crochet, c'est un conteneur
$parent = $match[1];
// Si dans les crochets il n'y a rien, on met à la fin du formulaire
@ -254,7 +266,13 @@ function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) {
// 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));
//Si [fieldset], inserer à la fin du fieldset, si [fieldset][X] inserer à la position X dans le fieldset
if (isset($match[3])) {
$position = $match[3];
} else {
$position = 10000000;
}
$chemin = array_merge($parent, array('saisies', $position));
} else {
$chemin = false;
}
@ -273,13 +291,42 @@ function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) {
// Si seulement on a bien trouvé un nouvel endroit où la placer, alors on déplace
if ($chemin) {
$saisies = saisies_inserer($saisies, $saisie, $chemin);
if ($avant_ou_apres === 'avant') {
$saisies = saisies_inserer($saisies, $saisie, $chemin);
} else {
$saisies = saisies_inserer_apres($saisies, $saisie, $chemin);
}
}
}
return $saisies;
}
/**
* Déplacer une saisie existante avant une autre
* @param array $saisies Un tableau décrivant les saisies
* @param unknown_type $id_ou_nom_ou_chemin L'