Browse Source

branchage phase2

svn/root/tags/v1.42.5 v1.42.5
guy.cesaro@gmail.com 8 years ago
commit
e95ee4e773
  1. 170
      .gitattributes
  2. 38
      action/deplacer_saisie.php
  3. 5
      aide/saisies.html
  4. 28
      balise/configurer_saisie.php
  5. 49
      balise/generer_saisies.php
  6. 180
      balise/saisie.php
  7. 39
      balise/voir_saisie.php
  8. 30
      balise/voir_saisies.php
  9. 4
      contenu/page-saisies_cvt.html
  10. 181
      css/formulaires_constructeur.css
  11. 8
      extra-vues/pays.html
  12. 219
      formulaires/construire_formulaire.html
  13. 533
      formulaires/construire_formulaire.php
  14. 27
      formulaires/inc-construire_formulaire-actions.html
  15. 9
      formulaires/inc-generer_saisies_configurables.html
  16. 24
      formulaires/inc-saisies-cvt.html
  17. 0
      formulaires/saisies_cvt.html
  18. 41
      formulaires/saisies_cvt.php
  19. BIN
      images/formulaire-annuler-16.png
  20. BIN
      images/formulaire-configurer-16.png
  21. BIN
      images/formulaire-deplacer-16.png
  22. BIN
      images/formulaire-dupliquer-16.png
  23. BIN
      images/formulaire-enregistrer-16.png
  24. BIN
      images/formulaire-reinitialiser-24.png
  25. BIN
      images/formulaire-saisie-defaut.png
  26. BIN
      images/formulaire-supprimer-16.png
  27. BIN
      images/logo_saisie_48.png
  28. BIN
      images/saisies_auteurs.png
  29. BIN
      images/saisies_case.png
  30. BIN
      images/saisies_checkbox.png
  31. BIN
      images/saisies_date.png
  32. BIN
      images/saisies_explication.png
  33. BIN
      images/saisies_fieldset.png
  34. BIN
      images/saisies_hidden.png
  35. BIN
      images/saisies_input.png
  36. BIN
      images/saisies_oui_non.png
  37. BIN
      images/saisies_radio.png
  38. BIN
      images/saisies_selecteur_article.png
  39. BIN
      images/saisies_selecteur_rubrique.png
  40. BIN
      images/saisies_selecteur_rubrique_article.png
  41. BIN
      images/saisies_selection.png
  42. BIN
      images/saisies_selection_multiple.png
  43. BIN
      images/saisies_textarea.png
  44. 494
      inc/saisies.php
  45. 429
      inc/saisies_afficher.php
  46. 324
      inc/saisies_lister.php
  47. 303
      inc/saisies_manipuler.php
  48. 19
      inclure/configurer_saisie.html
  49. 38
      inclure/configurer_saisie_fonctions.php
  50. 46
      inclure/generer_saisies.html
  51. 7
      inclure/js_afficher_si.html
  52. 65
      inclure/saisies_aide.html
  53. 7
      inclure/voir_saisies.html
  54. 31
      javascript/saisies.js
  55. 27
      lang/paquet-saisies.xml
  56. 18
      lang/paquet-saisies_ar.php
  57. 17
      lang/paquet-saisies_de.php
  58. 19
      lang/paquet-saisies_en.php
  59. 17
      lang/paquet-saisies_es.php
  60. 17
      lang/paquet-saisies_fr.php
  61. 19
      lang/paquet-saisies_fr_tu.php
  62. 17
      lang/paquet-saisies_nl.php
  63. 17
      lang/paquet-saisies_ru.php
  64. 17
      lang/paquet-saisies_sk.php
  65. 39
      lang/saisies.xml
  66. 119
      lang/saisies_ca.php
  67. 176
      lang/saisies_de.php
  68. 193
      lang/saisies_en.php
  69. 193
      lang/saisies_es.php
  70. 135
      lang/saisies_fa.php
  71. 191
      lang/saisies_fr.php
  72. 190
      lang/saisies_fr_tu.php
  73. 173
      lang/saisies_it.php
  74. 193
      lang/saisies_nl.php
  75. 176
      lang/saisies_ru.php
  76. 193
      lang/saisies_sk.php
  77. 29
      paquet.xml
  78. 65
      plugin.xml
  79. 3
      prive/exec/construire_formulaire.html
  80. 14
      prive/listes/articles_originaux_recursifs.html
  81. 8
      prive/listes/rubriques_recursives.html
  82. 42
      saisies-vues/_base.html
  83. 16
      saisies-vues/auteurs.html
  84. 1
      saisies-vues/case.html
  85. 12
      saisies-vues/checkbox.html
  86. 10
      saisies-vues/date.html
  87. 7
      saisies-vues/destinataires.html
  88. 0
      saisies-vues/explication.html
  89. 5
      saisies-vues/fieldset.html
  90. 9
      saisies-vues/groupe_mots.html
  91. 3
      saisies-vues/mot.html
  92. 1
      saisies-vues/oui_non.html
  93. 4
      saisies-vues/radio.html
  94. 10
      saisies-vues/secteur.html
  95. 30
      saisies-vues/selecteur.html
  96. 23
      saisies-vues/selecteur_article.html
  97. 5
      saisies-vues/selecteur_article_fonctions.php
  98. 3
      saisies-vues/selecteur_document.html
  99. 24
      saisies-vues/selecteur_rubrique.html
  100. 38
      saisies-vues/selecteur_rubrique_article.html
  101. Some files were not shown because too many files have changed in this diff Show More

170
.gitattributes vendored

@ -0,0 +1,170 @@
* text=auto !eol
action/deplacer_saisie.php -text
aide/saisies.html -text
balise/configurer_saisie.php -text
balise/generer_saisies.php -text
balise/saisie.php -text
balise/voir_saisie.php -text
balise/voir_saisies.php -text
contenu/page-saisies_cvt.html -text
css/formulaires_constructeur.css -text
extra-vues/pays.html -text
formulaires/construire_formulaire.html -text
formulaires/construire_formulaire.php -text
formulaires/inc-construire_formulaire-actions.html -text
formulaires/inc-generer_saisies_configurables.html -text
formulaires/inc-saisies-cvt.html -text
formulaires/saisies_cvt.html -text
formulaires/saisies_cvt.php -text
images/formulaire-annuler-16.png -text
images/formulaire-configurer-16.png -text
images/formulaire-deplacer-16.png -text
images/formulaire-dupliquer-16.png -text
images/formulaire-enregistrer-16.png -text
images/formulaire-reinitialiser-24.png -text
images/formulaire-saisie-defaut.png -text
images/formulaire-supprimer-16.png -text
images/logo_saisie_48.png -text
images/saisies_auteurs.png -text
images/saisies_case.png -text
images/saisies_checkbox.png -text
images/saisies_date.png -text
images/saisies_explication.png -text
images/saisies_fieldset.png -text
images/saisies_hidden.png -text
images/saisies_input.png -text
images/saisies_oui_non.png -text
images/saisies_radio.png -text
images/saisies_selecteur_article.png -text
images/saisies_selecteur_rubrique.png -text
images/saisies_selecteur_rubrique_article.png -text
images/saisies_selection.png -text
images/saisies_selection_multiple.png -text
images/saisies_textarea.png -text
inc/saisies.php -text
inc/saisies_afficher.php -text
inc/saisies_lister.php -text
inc/saisies_manipuler.php -text
inclure/configurer_saisie.html -text
inclure/configurer_saisie_fonctions.php -text
inclure/generer_saisies.html -text
inclure/js_afficher_si.html -text
inclure/saisies_aide.html -text
inclure/voir_saisies.html -text
javascript/saisies.js -text
lang/paquet-saisies.xml -text
lang/paquet-saisies_ar.php -text
lang/paquet-saisies_de.php -text
lang/paquet-saisies_en.php -text
lang/paquet-saisies_es.php -text
lang/paquet-saisies_fr.php -text
lang/paquet-saisies_fr_tu.php -text
lang/paquet-saisies_nl.php -text
lang/paquet-saisies_ru.php -text
lang/paquet-saisies_sk.php -text
lang/saisies.xml -text
lang/saisies_ca.php -text
lang/saisies_de.php -text
lang/saisies_en.php -text
lang/saisies_es.php -text
lang/saisies_fa.php -text
lang/saisies_fr.php -text
lang/saisies_fr_tu.php -text
lang/saisies_it.php -text
lang/saisies_nl.php -text
lang/saisies_ru.php -text
lang/saisies_sk.php -text
/paquet.xml -text
/plugin.xml -text
prive/exec/construire_formulaire.html -text
prive/listes/articles_originaux_recursifs.html -text
prive/listes/rubriques_recursives.html -text
saisies-vues/_base.html -text
saisies-vues/auteurs.html -text
saisies-vues/case.html -text
saisies-vues/checkbox.html -text
saisies-vues/date.html -text
saisies-vues/destinataires.html -text
saisies-vues/explication.html -text
saisies-vues/fieldset.html -text
saisies-vues/groupe_mots.html -text
saisies-vues/mot.html -text
saisies-vues/oui_non.html -text
saisies-vues/radio.html -text
saisies-vues/secteur.html -text
saisies-vues/selecteur.html -text
saisies-vues/selecteur_article.html -text
saisies-vues/selecteur_article_fonctions.php -text
saisies-vues/selecteur_document.html -text
saisies-vues/selecteur_rubrique.html -text
saisies-vues/selecteur_rubrique_article.html -text
saisies-vues/selecteur_site.html -text
saisies-vues/selection.html -text
saisies-vues/selection_multiple.html -text
/saisies.css.html -text
saisies/_base.html -text
saisies/articles_originaux.html -text
saisies/auteurs.html -text
saisies/auteurs.yaml -text
saisies/case.html -text
saisies/case.yaml -text
saisies/checkbox.html -text
saisies/checkbox.yaml -text
saisies/choisir_objet.html -text
saisies/choisir_objets.html -text
saisies/couleur.html -text
saisies/date.html -text
saisies/date.yaml -text
saisies/date_jour_mois_annee.html -text
saisies/destinataires.html -text
saisies/destinataires.yaml -text
saisies/email.html -text
saisies/explication.html -text
saisies/explication.yaml -text
saisies/fieldset.html -text
saisies/fieldset.yaml -text
saisies/groupe_mots.html -text
saisies/hidden.html -text
saisies/hidden.yaml -text
saisies/input.html -text
saisies/input.yaml -text
saisies/mot.html -text
saisies/mot.yaml -text
saisies/oui_non.html -text
saisies/oui_non.yaml -text
saisies/pays.html -text
saisies/police.html -text
saisies/position_construire_formulaire.html -text
saisies/radio.html -text
saisies/radio.yaml -text
saisies/recherche.html -text
saisies/secteur.html -text
saisies/selecteur.html -text
saisies/selecteur_article.html -text
saisies/selecteur_article.yaml -text
saisies/selecteur_document.html -text
saisies/selecteur_langue.html -text
saisies/selecteur_rubrique.html -text
saisies/selecteur_rubrique.yaml -text
saisies/selecteur_rubrique_article.html -text
saisies/selecteur_rubrique_article.yaml -text
saisies/selecteur_site.html -text
saisies/selection.html -text
saisies/selection.yaml -text
saisies/selection_multiple.html -text
saisies/selection_multiple.yaml -text
saisies/selection_par_groupe.html -text
saisies/statuts_auteurs.html -text
saisies/telephone.html -text
saisies/textarea.html -text
saisies/textarea.yaml -text
saisies/true_false.html -text
saisies/url.html -text
/saisies_fonctions.php -text
/saisies_options.php -text
/saisies_pipelines.php -text
test/configurer_saisie.html -text
test/generer_saisies.html -text
test/saisie.html -text
test/voir_saisie.html -text
test/voir_saisies.html -text

38
action/deplacer_saisie.php

@ -0,0 +1,38 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_deplacer_saisie_dist() {
include_spip('inc/session');
$session = _request('session');
$identifiant = _request('saisie');
$ou = _request('ou');
// On récupère le formulaire à son état actuel
$formulaire_actuel = session_get($session);
if (!$formulaire_actuel) {
return "";
}
include_spip('inc/saisies');
$saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
if (!isset($saisies_actuelles[$identifiant])) {
return "";
}
// tester @id et [@id] (fieldset)
if ($ou and !isset($saisies_actuelles[$ou]) and !isset($saisies_actuelles[ substr($ou,1,-1) ])) {
return "";
}
// on deplace ou c'est demande...
$formulaire_actuel = saisies_deplacer($formulaire_actuel, $identifiant, $ou);
// On sauve tout ca
$formulaire_actuel = session_set($session, $formulaire_actuel);
}
?>

5
aide/saisies.html

@ -0,0 +1,5 @@
<h1>Références complètes des saisies</h1>
[(#ENV{format}|=={brut}|oui)<textarea style="width:100%; height:100%;">]
[(#VAL|saisies_generer_aide)]
[(#ENV{format}|=={brut}|oui)</textarea>]

28
balise/configurer_saisie.php

@ -0,0 +1,28 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function balise_CONFIGURER_SAISIE_dist($p){
// On recupere le premier argument : le nom de la saisie
$saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p);
// On ajoute le squelette a inclure dans les parametres
$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/configurer_saisie');
// On ajoute l'environnement
$p = Pile::creer_et_ajouter_argument_balise($p, 'env');
// On ajoute le nom recupere
$p = Pile::creer_et_ajouter_argument_balise($p, 'saisie', $saisie);
// On redirige vers la balise INCLURE
if(function_exists('balise_INCLURE'))
return balise_INCLURE($p);
else
return balise_INCLURE_dist($p);
}
?>

49
balise/generer_saisies.php

@ -0,0 +1,49 @@
<?php
/**
* Gestion de la balise GENERER_SAISIES
*
* @package SPIP\Saisies\Balises
*/
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Compile la balise GENERER_SAISIES
*
* La balise accepte 1 paramètre qui est une liste de descriptions de saisies
* dont on veut générer le HTML affichant les champs du formulaires
*
* Cette balise est un raccourcis :
* - #GENERER_SAISIES{#TABLEAU_DE_SAISIES} est équivalent à
* - #INCLURE{fond=generer_saisies,env,saisies=#TABLEAU_DE_SAISIES}
*
* @param Champ $p
* Pile au niveau de la balise
* @return Champ
* Pile complété du code à générer
**/
function balise_GENERER_SAISIES_dist($p){
// On recupere le premier (et seul) argument : le tableau decrivant ce qu'on veut generer
$config = Pile::recuperer_et_supprimer_argument_balise(1, $p);
// On ajoute le squelette a inclure dans les parametres
$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/generer_saisies');
// On ajoute l'environnement
$p = Pile::creer_et_ajouter_argument_balise($p, 'env');
// On ajoute le tableau recupere
$p = Pile::creer_et_ajouter_argument_balise($p, 'saisies', $config);
// On redirige vers la balise INCLURE
if(function_exists('balise_INCLURE'))
return balise_INCLURE($p);
else
return balise_INCLURE_dist($p);
}
?>

180
balise/saisie.php

@ -0,0 +1,180 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
// pour ne pas interferer avec d'eventuelles futures fonctions du core
// on met le tout dans un namespace ; les fonctions sont autonomes.
class Pile {
// les arguments sont dans l'entree 0 du tableau param.
// param[0][0] vaut toujours '' (ou presque ?)
static function recuperer_argument_balise($pos, $p) {
if (!isset($p->param[0])) {
return null;
}
if (!isset($p->param[0][$pos])) {
return null;
}
return $p->param[0][$pos];
}
// les arguments sont dans l'entree 0 du tableau param.
// param[0][0] vaut toujours '' (ou presque ?)
static function supprimer_argument_balise($pos, $p) {
if (!isset($p->param[0])) {
return null;
}
if (!isset($p->param[0][$pos])) {
return null;
}
if ($pos == 0) {
array_shift($p->param[0]);
} else {
$debut = array_slice($p->param[0], 0, $pos);
$fin = array_slice($p->param[0], $pos+1);
$p->param[0] = array_merge($debut, $fin);
}
return $p;
}
static function recuperer_et_supprimer_argument_balise($pos, &$p) {
$arg = Pile::recuperer_argument_balise($pos, $p);
$p = Pile::supprimer_argument_balise($pos, $p);
return $arg;
}
// les arguments sont dans l'entree 0 du tableau param.
// param[0][0] vaut toujours '' (ou presque ?)
static function ajouter_argument_balise($element, $p) {
if (isset($p->param[0][0])) {
$zero = array_shift($p->param[0]);
array_unshift($p->param[0], $element);
array_unshift($p->param[0], $zero);
} else {
if (!is_array($p->param[0])) {
$p->param[0] = array();
}
array_unshift($p->param[0], $element);
}
return $p;
}
// creer_argument_balise(nom) = {nom}
// creer_argument_balise(nom, 'coucou') = {nom=coucou}
// creer_argument_balise(nom, $balise) = {nom=#BALISE}
static function creer_argument_balise($nom, $valeur = null) {
include_spip('public/interfaces');
$s = new Texte;
$s->texte = $nom;
$s->ligne=0;
// si #BALISE cree avec Pile::creer_balise(), le mettre en array, comme les autres
if (is_object($valeur)) {
$valeur = array($valeur);
}
$res = null;
// {nom}
if (is_null($valeur)) {
$res = array($s);
}
// {nom=coucou}
elseif (is_string($valeur)) {
$s->texte .= "=$valeur";
$res = array($s);
}
// {nom=#BALISE}
elseif (is_array($valeur)) {
$s->texte .= "="; // /!\ sans cette toute petite chose, ça ne fait pas d'egalite :)
$res = array_merge(array($s), $valeur);
}
return $res;
}
static function creer_et_ajouter_argument_balise($p, $nom, $valeur = null) {
$new = Pile::creer_argument_balise($nom, $valeur);
return Pile::ajouter_argument_balise($new, $p);
}
// creer une balise
static function creer_balise($nom, $opt) {
include_spip('public/interfaces');
$b = new Champ;
$b->nom_champ = strtoupper($nom);
$vars = get_class_vars('Champ'); // property_exists($b, $o); est en php 5
foreach ($opt as $o=>$val) {
#if (property_exists($b,$o)) {
if (array_key_exists($o, $vars)) {
if ($o == 'param') {
array_unshift($val, '');
$b->$o = array($val);
} else {
$b->$o = $val;
}
}
}
return $b;
}
}
/*
* #saisie{type,nom} : champs obligatoires
*
* collecte des arguments en fonctions du parametre "nom"
* ajoute des arguments
* appelle #INCLURE avec les arguments collectes en plus
*
* il faudrait en faire une balise dynamique (?)
* pour avoir un code plus propre
* mais je n'ai pas reussi a trouver comment recuperer "valeur=#ENV{$nom}"
*
*/
function balise_SAISIE_dist ($p) {
// on recupere les parametres sans les traduire en code d'execution php
$type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $type
$titre = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $titre
// creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
$env_titre = Pile::creer_balise('ENV', array('param' => array($titre), 'etoile' => '*')); // #ENV*{titre}
// on modifie $p pour ajouter des arguments
// {nom=$titre, valeur=#ENV{$titre}, erreurs, type_saisie=$type, fond=saisies/_base}
$p = Pile::creer_et_ajouter_argument_balise($p, 'nom', $titre);
$p = Pile::creer_et_ajouter_argument_balise($p, 'valeur', $env_titre);
$p = Pile::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
$p = Pile::creer_et_ajouter_argument_balise($p, 'erreurs');
$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'saisies/_base');
// on appelle la balise #INCLURE
// avec les arguments ajoutes
if(function_exists('balise_INCLURE'))
return balise_INCLURE($p);
else
return balise_INCLURE_dist($p);
}
?>

39
balise/voir_saisie.php

@ -0,0 +1,39 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
/*
* #VOIR_SAISIE{type,nom} : champs obligatoires
*
* collecte des arguments en fonctions du parametre "nom"
* ajoute des arguments
* appelle #INCLURE avec les arguments collectes en plus
*
*/
function balise_VOIR_SAISIE_dist ($p) {
// on recupere les parametres sans les traduire en code d'execution php
$type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p);
$nom = Pile::recuperer_et_supprimer_argument_balise(1, $p);
// creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
$env_nom = Pile::creer_balise('ENV', array('param' => array($nom), 'etoile' => '*')); // #ENV*{nom}
// on modifie $p pour ajouter des arguments
// {nom=$nom, valeur=#ENV{$nom}, type_saisie=$type, fond=saisies/_base}
$p = Pile::creer_et_ajouter_argument_balise($p, 'nom', $nom);
$p = Pile::creer_et_ajouter_argument_balise($p, 'valeur', $env_nom);
$p = Pile::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'saisies-vues/_base');
// on appelle la balise #INCLURE
// avec les arguments ajoutes
if(function_exists('balise_INCLURE'))
return balise_INCLURE($p);
else
return balise_INCLURE_dist($p);
}
?>

30
balise/voir_saisies.php

@ -0,0 +1,30 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function balise_VOIR_SAISIES_dist($p){
// On recupere les arguments : les tableaux decrivant ce qu'on veut generer + les reponses
$saisies = Pile::recuperer_et_supprimer_argument_balise(1, $p);
$valeurs = Pile::recuperer_et_supprimer_argument_balise(1, $p);
// On ajoute le squelette a inclure dans les parametres
$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/voir_saisies');
// On ajoute l'environnement
$p = Pile::creer_et_ajouter_argument_balise($p, 'env');
// On ajoute les tableaux recuperes
$p = Pile::creer_et_ajouter_argument_balise($p, 'saisies', $saisies);
$p = Pile::creer_et_ajouter_argument_balise($p, 'valeurs', $valeurs);
// On redirige vers la balise INCLURE
if(function_exists('balise_INCLURE'))
return balise_INCLURE($p);
else
return balise_INCLURE_dist($p);
}
?>

4
contenu/page-saisies_cvt.html

@ -0,0 +1,4 @@
<h1>CVT automatique avec Saisies</h1>
<p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
#FORMULAIRE_SAISIES_CVT

181
css/formulaires_constructeur.css

@ -0,0 +1,181 @@
.formulaire_spip .formulaire_spip{
border:none;
background:transparent;
}
#deplacable .ui-state-highlight { height: 5em; line-height: 1.2em; }
#deplacable .ui-sortable {min-height:3em;}
/*
.formulaire_construire_formulaire{
padding:1em;
}
.formulaire_construire_formulaire ul li label{
display:block;
margin:0;
width:auto;
float:none;
clear:both;
line-height:1.7em;
}
.formulaire_construire_formulaire input.text, .formulaire_construire_formulaire input.password, .formulaire_construire_formulaire textarea, .formulaire_construire_formulaire select{
width:auto;
}
*/
.formulaire_construire_formulaire li.actions_formulaire{
margin:0;
padding:1em;
text-align:center;
border:0;
}
.formulaire_construire_formulaire li.actions_formulaire img{
vertical-align:middle;
}
/*
.formulaire_construire_formulaire li.configurable{
position:relative;
padding:1em;
margin:0.5em 0;
background:transparent;
border:1px dashed transparent;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius:5px;
}
.formulaire_construire_formulaire li.configurable.hover{
border-color:#999;
}
*/
.formulaire_construire_formulaire li.en_configuration{
border:5px solid #999;
border-radius:5px;
margin:.5em;
}
.formulaire_construire_formulaire li.fieldset.configurable>fieldset>ul {margin-left:30px;}
/*
.formulaire_construire_formulaire li.fieldset.configurable{
padding:0;
}
.formulaire_construire_formulaire li.fieldset h3.legend{
margin:0;
}
.formulaire_construire_formulaire li.fieldset.configurable > fieldset{
border:1px solid #ddd;
padding:0;
}
.formulaire_construire_formulaire li.fieldset.configurable > fieldset > ul{
padding:0 1em;
}
*/
.formulaire_construire_formulaire .formulaire_configurer{
border-top:3px dashed #999;
margin: 1em -8px 0 -138px;
padding: 1em .5em .5em .5em;
background:white;
}
.formulaire_construire_formulaire .fieldset > .formulaire_configurer{
margin: 1em -8px 0;
}
/*
.formulaire_construire_formulaire li.fieldset.configurable > .formulaire_configurer{
margin:1em 0 0 0;
}
.formulaire_construire_formulaire .formulaire_configurer fieldset{
border:0;
padding:0;
}
.formulaire_construire_formulaire .formulaire_configurer-contenus li.editer{
border:0;
margin:0.5em 0;
padding:0.5em 1em;
}
.formulaire_construire_formulaire .formulaire_configurer li.formulaire_configurer-contenu{
background:white;
border-top:1px solid #ddd;
border-radius:0 0 5px 5px;
-moz-border-radius:0 0 5px 5px;
-webkit-border-radius:0 0 5px 5px;
}
*/
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets {
overflow:auto;
}
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li{
float:left;
width:auto;
clear:none;
padding:0;
background:#eee;
border:1px solid #ddd;
margin-right:1px;
-moz-border-radius:5px 5px 0 0;
-webkit-border-radius:5px 5px 0 0;
-o-border-radius:5px 5px 0 0;
border-radius:5px 5px 0 0;
}
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li.actif{
background:white;
border-bottom:1px solid white;
}
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li.erreur a{
color:#CC3300;
}
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li a{
display:block;
padding:.5em;
}
.formulaire_construire_formulaire .formulaire_configurer .boutons { margin-bottom: -20px; }
.formulaire_configurer-contenus > .fieldset > fieldset:first-child {border-top:0;}
.formulaire_construire_formulaire li.editer,
.formulaire_construire_formulaire li.explication,
.formulaire_construire_formulaire li.fieldset {padding-top:30px; position:relative;}
.formulaire_construire_formulaire li.explication { padding-left:140px; background:transparent; }
.formulaire_construire_formulaire li.explication > p { margin-left:-130px; }
.formulaire_construire_formulaire .formulaire_configurer li.fieldset {padding-top:0px;}
.formulaire_construire_formulaire .formulaire_configurer fieldset fieldset>ul>li.editer:first-child {padding-top:0px;}
.formulaire_construire_formulaire li.hover {background-color:transparent;}
.formulaire_construire_formulaire .actions{
position:absolute;
right:5px;
top:5px;
}
.formulaire_construire_formulaire .actions button{
cursor:pointer;
background:none;
border:none;
opacity:0.7;
}
.formulaire_construire_formulaire .actions button:hover{
opacity:1;
}
.formulaire_construire_formulaire .actions .move {
cursor:move;
}
.formulaire_construire_formulaire li.saisies_disponibles {
/*padding:1em;*/
}
.formulaire_construire_formulaire .ajouter_saisie{
width:45%;
margin:5px;
padding:0.5em 8px 0.5em 36px;
font-size:1em;
text-align:left;
color:black;
cursor:pointer;
background:white url() 8px center no-repeat;
border:1px solid #ccc;
}
.formulaire_construire_formulaire .ajouter_saisie img{
vertical-align:middle;
}

8
extra-vues/pays.html

@ -0,0 +1,8 @@
<B_pays>
<div class="#ENV{champ_extra}">
<strong>#ENV{label_extra}</strong>
<BOUCLE_pays(GEO_PAYS){id_pays=#ENV*{valeur_extra}}>
#NOM
</BOUCLE_pays>
</div>
</B_pays>

219
formulaires/construire_formulaire.html

@ -0,0 +1,219 @@
[(#ENV{erreurs}|table_valeur{positionner}|oui)
<a name="ajax_ancre" href="[(#ENV{erreurs}|table_valeur{positionner})]"></a>
]
<div class="formulaire_spip formulaire_editer formulaire_#ENV{form}[ (#ENV{formulaire_modifie}|oui) modifie]">
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
<p id="message_attention" class="message_reinitialiser reponse_formulaire reponse_formulaire_ok">#ENV*{_message_attention}</p>
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<BOUCLE_editable(CONDITION){si #ENV{editable}|oui}>
<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<input style="display:none;" type="submit" class="submit" name="enregistrer" value="<:bouton_enregistrer:>" />
<ul id="deplacable">
<li id="reinitialiser" class="actions_formulaire">
<button type="submit" class="submit" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
<img src="#CHEMIN{images/formulaire-reinitialiser-24.png}" alt="" />
<:saisies:construire_reinitialiser:>
</button>
</li>
<BOUCLE_contenu(POUR){tableau #ENV{_contenu}}>
[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
[(#VALEUR**|formidable_generer_saisie_configurable{#ENV**|unserialize})]
]
</BOUCLE_contenu>
<li class="aucun"><em class="attention"><:saisies:construire_aucun_champs:></em></li>
<//B_contenu>
<B_saisies_disponibles>
<li class="editer haut saisies_disponibles" id="attrapable">
<label><:saisies:construire_ajouter_champ:></label>
<BOUCLE_saisies_disponibles(POUR){tableau #ENV{_saisies_disponibles}}{par cle}>
<button type="submit" name="ajouter_saisie" value="#CLE" class="submit ajouter_saisie"[ title="(#VALEUR|table_valeur{description})"] [style="background-image:url((#VALEUR|table_valeur{icone}|sinon{#CHEMIN{images/formulaire-saisie-defaut.png}}))"]>
<span>[(#VALEUR|table_valeur{titre})]</span>
</button>
</BOUCLE_saisies_disponibles>
</li>
</B_saisies_disponibles>
</ul>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<span class='image_loading'></span>
</div></form>
<style>
.message_reinitialiser,#reinitialiser {display: none}
.modifie .message_reinitialiser,.modifie #reinitialiser {display: block}
</style>
<script type="text/javascript">
jQuery(function(){
jQuery('.formulaire_construire_formulaire li.configurable')
.hover(
function(){
jQuery(this)
.addClass('hover')
.find('> .actions')
.show()
.end()
.parents('li.configurable:not(.en_configuration)')
.mouseout();
},
function(){
if (!jQuery(this).is('.en_configuration'))
jQuery(this)
.removeClass('hover')
.find('> .actions')
.hide()
.end()
.parents('li.configurable').eq('0')
.mouseover();
}
)
.filter(':not(.en_configuration)')
.find('> .actions')
.hide()
.end()
.end();
// On lance la création des onglets
formulaire_configurer_onglets();
// Gérer la liste des vérifications
jQuery('.liste_verifications')
.each(function(){
var options = jQuery(this).siblings('.options_verifier').hide();
var select = jQuery(this).find('select');
select
.change(function(){
var montrer = jQuery(this).val() ? jQuery(this).val() : 'soigfeg';
options.hide().filter('.'+montrer).show();
})
.change();
});
// On déplie toujours les fieldsets plés par défaut
jQuery('li.fieldset.plie')
.each(function(){
jQuery(this)
.removeClass('plie')
.find('> fieldset > ul').show();
});
[(#ENV{erreurs}|non|et{#ENV{_chemin_ui}})
$.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.core.js}", function(){
$.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.widget.js}", function(){
$.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.mouse.js}", function(){
$.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.sortable.js}", function(){
if ($.fn.sortable) {
jQuery( "#deplacable, #deplacable ul" ).sortable({
revert: true,
containment: '#deplacable',
connectWith: "#deplacable, #deplacable ul",
placeholder: "ui-state-highlight",
handle: '>.actions .deplacer_saisie',
start: function(event, ui) {
jQuery('.ui-state-highlight')
.css('height', ui.item.css('height'))
.css('height', '+=20px');
},
update: function(event, ui) {
id = ui.item.data('id');
ou = ui.item.next().data('id');
// avant le suivant
if (!ou) {
// sinon dans le parent
ou = ui.item.closest('.fieldset').data('id');
if (ou) {
ou = '[(#VAL{91}|chr)]' + ou + '[(#VAL{93}|chr)]';
}
}
url = "#URL_ECRIRE";
$.get(url, {
session: '#ENV{_identifiant_session}',
action: 'deplacer_saisie',
saisie: id,
ou: ou
}, function() {
//jQuery('input.vide').submit();
jQuery('.formulaire_#ENV{form}').addClass('modifie').trigger('modifsaisies');
});
}
});
}
});
/*
$.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.draggable.js}", function(){
if ($.fn.draggable) {
jQuery( "#attrapable" ).draggable({
connectToSortable: "#deplacable, #deplacable ul",
helper: "clone"
});
}
});
*/
});});});
]
});
function formulaire_configurer_onglets(){
var formulaire_configurer = jQuery('.formulaire_configurer');
var onglets = jQuery('<ul class="formulaire_configurer-onglets"></ul>');
var contenus = formulaire_configurer.find('> ul > li.fieldset');
// On ajoute le conteneur des onglets
formulaire_configurer
.prepend(onglets);
// On parcourt les contenus pour générer les onglets
contenus
.each(function(i){
// On ajoute un identifiant et une classe
jQuery(this)
.attr('id', 'formulaire_configurer-contenu-'+i)
.addClass('formulaire_configurer-contenu');
// On récupère le titre (en le cachant au passage)
var titre = jQuery(this).find('h3').eq(0).hide().text();
// On crée un onglet
var onglet = jQuery('<li><a href="#formulaire_configurer-contenu-'+i+'">'+titre+'</a></li>');
onglet
.click(function(){
contenus.hide();
jQuery(
jQuery(this)
.siblings()
.removeClass('actif')
.end()
.addClass('actif')
.find('a')
.attr('href')
).show();
return false;
});
// On active le premier onglet au démarrage
if (i == 0) onglet.addClass('actif');
// S'il y a des erreurs dans cette partie du contenu, on met une classe "erreurs" à l'onglet aussi
if (jQuery(this).find('li.erreur').length > 0)
onglet.addClass('erreur');
// On ajoute l'onglet
onglets
.append(onglet);
})
.hide()
.eq(0)
.show();
}
</script>
</BOUCLE_editable>
</div>

533
formulaires/construire_formulaire.php

@ -0,0 +1,533 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function formulaires_construire_formulaire_charger($identifiant, $formulaire_initial=array(), $options=array()){
include_spip('inc/saisies');
$contexte = array();
// On ajoute un préfixe devant l'identifiant, pour être sûr
$identifiant = 'constructeur_formulaire_'.$identifiant;
$contexte['_identifiant_session'] = $identifiant;
// On vérifie ce qui a été passé en paramètre
if (!is_array($formulaire_initial)) $formulaire_initial = array();
// On initialise la session si elle est vide
if (is_null($formulaire_actuel = session_get($identifiant))){
session_set($identifiant, $formulaire_initial);
$formulaire_actuel = $formulaire_initial;
}
// Si le formulaire actuel est différent du formulaire initial on agite un drapeau pour le dire
if ($formulaire_actuel != $formulaire_initial){
$contexte['formulaire_modifie'] = true;
}
$contexte['_message_attention'] = _T('saisies:construire_attention_modifie');
// On passe ça pour l'affichage
$contexte['_contenu'] = $formulaire_actuel;
// On passe ça pour la récup plus facile des champs
$contexte['_saisies_par_nom'] = saisies_lister_par_nom($formulaire_actuel);
// Pour déclarer les champs modifiables à CVT
foreach(array_keys($contexte['_saisies_par_nom']) as $nom){
$contexte["saisie_modifiee_$nom"] = array();
}
// La liste des saisies
$saisies_disponibles = saisies_lister_disponibles();
$contexte['_saisies_disponibles'] = $saisies_disponibles;
$contexte['fond_generer'] = 'formulaires/inc-generer_saisies_configurables';
// On cherche jquery UI pour savoir si on pourra glisser-déplacer
// SPIP 3 - jquery_ui
if (find_in_path('javascript/ui/jquery.ui.sortable.js') and find_in_path('javascript/ui/jquery.ui.draggable.js')){
$contexte['_chemin_ui'] = 'javascript/ui/';
}
// plugin jquery_ui >= 1.8
elseif (find_in_path('javascript/jquery-ui/ui/jquery.ui.sortable.js') and find_in_path('javascript/jquery-ui/ui/jquery.ui.draggable.js')){
$contexte['_chemin_ui'] = 'javascript/jquery-ui/ui/';
}
// plugin jquery_ui < 1.8
elseif (find_in_path('javascript/jquery-ui-1.8.16/ui/jquery.ui.sortable.js') and find_in_path('javascript/jquery-ui-1.8.16/ui/jquery.ui.draggable.js')){
$contexte['_chemin_ui'] = 'javascript/jquery-ui-1.8.16/ui/';
}
else{
$contexte['_chemin_ui'] = false;
}
return $contexte;
}
function formulaires_construire_formulaire_verifier($identifiant, $formulaire_initial=array(), $options=array()){
include_spip('inc/saisies');
$erreurs = array();
// l'une ou l'autre sera presente
$configurer_saisie = $enregistrer_saisie = '';
// Pas d'erreur si l'on ne demande rien
if (!($nom_ou_id = $configurer_saisie = _request('configurer_saisie')
OR $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))) {
return $erreurs;
}
// 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);
// On récupère les saisies actuelles, par identifiant ou par nom
if ($nom_ou_id[0] == '@') {
$saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
$nom = $saisies_actuelles[$nom_ou_id]['options']['nom'];
} else {
$saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
$nom = $nom_ou_id;
}
$noms_autorises = array_keys($saisies_actuelles);
// le nom (ou identifiant) doit exister
if (!in_array($nom_ou_id, $noms_autorises)) {
return $erreurs;
}
// La liste des saisies
$saisies_disponibles = saisies_lister_disponibles();
$saisie = $saisies_actuelles[$nom_ou_id];
$formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
array_walk_recursive($formulaire_config, 'formidable_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]");
$formulaire_config = saisie_identifier(array('saisies'=>$formulaire_config));
$formulaire_config = $formulaire_config['saisies'];
// Si la saisie possede un identifiant, on l'ajoute
// au formulaire de configuration pour ne pas le perdre en route
if (isset($saisie['identifiant']) and $saisie['identifiant']) {
$formulaire_config = saisies_inserer(
$formulaire_config,
array(
'saisie' => 'hidden',
'options' => array(
'nom' => "saisie_modifiee_${nom}[identifiant]",
'defaut' => $saisie['identifiant']
),
)
);
}
// S'il y a l'option adéquat, on ajoute le champ pour modifier le nom
if (isset($options['modifier_nom']) and $options['modifier_nom']
and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))
{
$chemin_nom[] = 'saisies';
$chemin_nom[] = '0';
$formulaire_config = saisies_inserer(
$formulaire_config,
array(
'saisie' => 'input',
'options' => array(
'nom' => "saisie_modifiee_${nom}[options][nom]",
'label' => _T('saisies:option_nom_label'),
'explication' => _T('saisies:option_nom_explication'),
'obligatoire' => 'oui',
'size' => 50
),
'verifier' => array(
'type' => 'regex',
'options' => array(
'modele' => '/^[\w]+$/'
)
)
),
$chemin_nom
);
}
// liste des options de vérification
$verif_options = array();
// S'il y a un groupe "validation" alors on va construire le formulaire des vérifications
if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)){
include_spip('inc/verifier');
$liste_verifications = verifier_lister_disponibles();
$chemin_validation[] = 'saisies';
$chemin_validation[] = 1000000; // à la fin
// On construit la saisie à insérer et les fieldset des options
$saisie_liste_verif = array(
'saisie' => 'selection',
'options' => array(
'nom' => "saisie_modifiee_${nom}[verifier][type]",
'label' => _T('saisies:construire_verifications_label'),
'option_intro' => _T('saisies:construire_verifications_aucune'),
'li_class' => 'liste_verifications',
'datas' => array()
)
);
foreach ($liste_verifications as $type_verif => $verif){
$saisie_liste_verif['options']['datas'][$type_verif] = $verif['titre'];
// Si le type de vérif a des options, on ajoute un fieldset
if (isset($verif['options']) and $verif['options'] and is_array($verif['options'])){
$groupe = array(
'saisie' => 'fieldset',
'options' => array(
'nom' => 'options',
'label' => $verif['titre'],
'li_class' => "$type_verif options_verifier"
),
'saisies' => $verif['options']
);
array_walk_recursive($groupe, 'formidable_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
$verif_options[$type_verif] = $groupe;
}
}
$verif_options = array_merge(array($saisie_liste_verif), $verif_options);
}
if ($enregistrer_saisie){
// La saisie modifié
$saisie_modifiee = _request("saisie_modifiee_${nom}");
// On cherche les erreurs de la configuration
$vraies_erreurs = saisies_verifier($formulaire_config);
// Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie
if (isset($options['modifier_nom']) and $options['modifier_nom']
and isset($options['nom_unique']) and $options['nom_unique'])
{
$nom_modifie = $saisie_modifiee['options']['nom'];
if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie))
$vraies_erreurs["saisie_modifiee_${nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique');
}
// On regarde s'il a été demandé un type de vérif
if (isset($saisie_modifiee['verifier']['type'])
and (($type_verif = $saisie_modifiee['verifier']['type']) != '')
and $verif_options[$type_verif])
{
// On ne vérifie que les options du type demandé
$vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies']));
}
}
// On insère chaque saisie des options de verification
if ($verif_options){
foreach ($verif_options as $saisie_verif){
$formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation);
}
}
$erreurs['configurer_'.$nom] = $formulaire_config;
$erreurs['positionner'] = '#configurer_'.$nom;
if ($enregistrer_saisie) {
if ($vraies_erreurs)
$erreurs = array_merge($erreurs, $vraies_erreurs);
else
$erreurs = array();
}
return $erreurs;
}
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 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;
}
// À utiliser avec un array_walk_recursive()
// Applique une transformation à la @valeur@ de tous les champs "nom" d'un formulaire, y compris loin dans l'arbo
function formidable_transformer_nom(&$valeur, $cle, $transformation){
if ($cle == 'nom' and is_string($valeur)){
$valeur = str_replace('@valeur@', $valeur, $transformation);
}
}
// Préparer une saisie pour la transformer en truc configurable
function formidable_generer_saisie_configurable($saisie, $env){
// On récupère le nom
$nom = $saisie['options']['nom'];
$identifiant = $saisie['identifiant'];
// On cherche si ya un formulaire de config
$formulaire_config = isset($env['erreurs']['configurer_'.$nom]) ? $env['erreurs']['configurer_'.$nom] : "";
// On ajoute une classe
if (!isset($saisie['options']['li_class'])) {
$saisie['options']['li_class'] = ''; // initialisation
}
$saisie['options']['li_class'] .= ' configurable';
// On ajoute l'option "tout_afficher"
$saisie['options']['tout_afficher'] = 'oui';
// On ajoute les boutons d'actions, mais seulement s'il n'y a pas de configuration de lancée
if (!$env['erreurs']) {
$saisie = saisies_inserer_html(
$saisie,
recuperer_fond(
'formulaires/inc-construire_formulaire-actions',
array(
'nom' => $nom,
'identifiant' => $identifiant,
'formulaire_config' => $formulaire_config,
'deplacable' => $env['_chemin_ui']
)
),
'debut'
);
}
// On ajoute une ancre pour s'y déplacer
$saisie = saisies_inserer_html(
$saisie,
"\n<a id=\"configurer_$nom\"></a>\n",
'debut'
);
// Si ya un form de config on l'ajoute à la fin
if (is_array($formulaire_config)){
// On double l'environnement
$env2 = $env;
// On ajoute une classe
$saisie['options']['li_class'] .= ' en_configuration';
// Si possible on met en readonly
$saisie['options']['readonly'] = 'oui';
// On vire les sous-saisies s'il y en a
if (isset($saisie['saisies']) and $saisie['saisies'] and is_array($saisie['saisies'])){
$nb_champs_masques = count(saisies_lister_champs($saisie['saisies']));
$saisie['saisies'] = array(
array(
'saisie' => 'explication',
'options' => array(
'nom' => 'truc',
'texte' => _T('saisies:construire_info_nb_champs_masques', array('nb'=>$nb_champs_masques)),
)
)
);
}
// On va ajouter le champ pour la position
if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))){
$chemin_description = array(0);
$formulaire_config = saisies_inserer(
$formulaire_config,
array(
'saisie' => 'fieldset',
'options' => array(
'nom' => "saisie_modifiee_${nom}[options][description]",
'label' => _T('saisies:option_groupe_description')
),
'saisies' => array()
),
0
);
}
$chemin_description[] = 'saisies';
$chemin_description[] = '0'; // tout au début
$formulaire_config = saisies_inserer(
$formulaire_config,
array(
'saisie' => 'position_construire_formulaire',
'options' => array(
'nom' => "saisie_modifiee_${nom}[position]",
'label' => _T('saisies:construire_position_label'),
'explication' => _T('saisies:construire_position_explication'),
'formulaire' => $env['_contenu'],
'saisie_a_positionner' => $nom
)
),
$chemin_description
);
$env2['saisies'] = $formulaire_config;
// Un test pour savoir si on prend le _request ou bien
$erreurs_test = $env['erreurs'];
unset($erreurs_test['configurer_'.$nom]);
unset($erreurs_test['positionner']);
if ($erreurs_test){
// Là aussi on désinfecte à la main
if (is_array($env2["saisie_modifiee_$nom"]['options']))
spip_desinfecte($env2["saisie_modifiee_$nom"]['options']);
}
else{
$env2["saisie_modifiee_$nom"] = $env2['_saisies_par_nom'][$nom];
// il n'y a pas toujours de verification...
if (isset($env2["saisie_modifiee_$nom"]['verifier'])) {
$env2["saisie_modifiee_$nom"]['verifier'][ $env2["saisie_modifiee_$nom"]['verifier']['type'] ]
= $env2["saisie_modifiee_$nom"]['verifier']['options'];
}
}
$env2['fond_generer'] = 'inclure/generer_saisies';
$saisie = saisies_inserer_html(
$saisie,
'<div class="formulaire_configurer"><ul class="formulaire_configurer-contenus">'
.recuperer_fond(
'inclure/generer_saisies',
$env2
)
.'<li class="boutons">
<input type="hidden" name="enregistrer_saisie" value="'.$nom.'" />
<button type="submit" class="submit link" name="enregistrer_saisie" value="">'._T('bouton_annuler').'</button>
<input type="submit" class="submit" name="enregistrer" value="'._T('bouton_valider').'" />
</li>'
.'</ul></div>',
'fin'
);
}
// On génère le HTML de la saisie
$html = saisies_generer_html($saisie, $env);
return $html;
}
/**
* Callback d'array_filter()
* Permet de retourner tout ce qui n'est pas un contenu vide.
* La valeur '0' est par contre retournée.
*
* @param $var La variable a tester
* @return bool L'accepte-t-on ?
**/
function saisie_option_contenu_vide($var) {
if (!$var) {
if (is_string($var) AND strlen($var)) {
return true;
}
return false;
}
return true;
}
?>

27
formulaires/inc-construire_formulaire-actions.html

@ -0,0 +1,27 @@
<div class="actions">
#SET{nom,#ENV{identifiant,#ENV{nom}}}
[(#ENV{formulaire_config}|is_array|non)
[(#ENV{deplacable}|oui)
<span class="move deplacer_saisie" title="<:saisies:construire_action_deplacer:>">
<img src="[(#CHEMIN{images/formulaire-deplacer-16.png})]" alt="<:saisies:construire_action_deplacer:>"/>
</span>
]
<button type="submit" class="submit configurer_saisie" name="configurer_saisie" value="#GET{nom}" title="<:saisies:construire_action_configurer:>">
<img src="[(#CHEMIN{images/formulaire-configurer-16.png})]" alt="<:saisies:construire_action_configurer:>"/>
</button>
<button type="submit" class="submit dupliquer_saisie" name="dupliquer_saisie" value="#GET{nom}" title="<:saisies:construire_action_dupliquer:>">
<img src="[(#CHEMIN{images/formulaire-dupliquer-16.png})]" alt="<:saisies:construire_action_dupliquer:>"/>
</button>
<button type="submit" class="submit supprimer_saisie" name="supprimer_saisie" value="#GET{nom}" title="<:saisies:construire_action_supprimer:>" onclick="javascript:return confirm('<:saisies:construire_confirmer_supprimer_champ:>');">
<img src="[(#CHEMIN{images/formulaire-supprimer-16.png})]" alt="<:saisies:construire_action_supprimer:>"/>
</button>
]
[(#ENV{formulaire_config}|is_array|oui)
<button type="submit" class="submit enregistrer_saisie" name="enregistrer_saisie" value="#GET{nom}" title="<:bouton_enregistrer:>">
<img src="[(#CHEMIN{images/formulaire-enregistrer-16.png})]" alt="<:bouton_enregistrer:>"/>
</button>
<button type="submit" class="submit annuler" name="enregistrer_saisie" value="" title="<:saisies:construire_action_annuler:>">
<img src="[(#CHEMIN{images/formulaire-annuler-16.png})]" alt="<:saisies:construire_action_annuler:>"/>
</button>
]
</div>

9
formulaires/inc-generer_saisies_configurables.html

@ -0,0 +1,9 @@
[(#REM)
Exemple d'appel :
#INCLURE{fond=formulaires/inc-generer_saisies_configurables, env, fond_generer=formulaires/inc-generer_saisies_configurables, saisies=#ENV{tableau}}
]
<BOUCLE_contenu(POUR){tableau #ENV{saisies}}>
[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
[(#VALEUR**|formidable_generer_saisie_configurable{#ENV{_env}|sinon{#ENV**|unserialize}})]
]
</BOUCLE_contenu>

24