
commit
e95ee4e773
170 changed files with 10081 additions and 0 deletions
@ -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 |
@ -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); |
||||
} |
||||
|
||||
?> |
@ -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>] |
@ -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); |
||||
|
||||
} |
||||
|
||||
?> |
@ -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); |
||||
|
||||
} |
||||
|
||||
?> |
@ -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); |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
?> |
@ -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); |
||||
|
||||
} |
||||
|
||||
?> |
@ -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); |
||||
|
||||
} |
||||
|
||||
?> |
@ -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 |
@ -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; |
||||
} |
||||
|
@ -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> |
@ -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> |
@ -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; |
||||
} |
||||
?> |
@ -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> |
@ -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> |