1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/spip_ynh.git synced 2024-09-03 20:25:59 +02:00
spip_ynh/sources/ecrire/inc/cvt_multietapes.php
2015-04-28 17:10:23 +02:00

246 lines
8.1 KiB
PHP

<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2014 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
/*
* CVT Multi etapes
* Module facilitant l'ecriture de formulaires CVT
* en plusieurs etapes
*
* #FORMULAIRE_TRUC
*
* Squelette :
* Chaque etape est representee par un squelette independant qui doit
* implementer un formulaire autonome pour les saisies de l'etape n
* formulaires/truc.html pour l'etape 1
* formulaires/truc_2.html pour l'etape 2
* formulaires/truc_n.html pour l'etape n
*
* Si un squelette formulaires/truc_n.html manque pour l'etape n
* c'est formulaires/truc.html qui sera utilise
* (charge a lui de gerer le cas de cette etape)
*
* Charger :
* formulaires_truc_charger_dist() :
* passer '_etapes' => nombre total d'etapes de saisies (>1 !)
* indiquer toutes les valeurs a saisir sur toutes les pages
* comme si il s'agissait d'un formulaire unique
*
* Verifier :
* le numero d'etape courante est disponible dans $x=_request('_etape'), si necessaire
* _request() permet d'acceder aux saisies effectuees depuis l'etape 1,
* comme si les etapes 1 a $x avaient ete saisies en une seule fois
*
* formulaires_truc_verifier_1_dist() : verifier les saisies de l'etape 1 uniquement
* formulaires_truc_verifier_2_dist() : verifier les saisies de l'etape 2
* formulaires_truc_verifier_n_dist() : verifier les saisies de l'etape n
*
* Il est possible d'implementer toutes les verifications dans une fonction unique qui sera alors appelee
* avec en premier argument le numero de l'etape a verifier
* formulaires_truc_verifier_etape_dist($etape,...) : verifier les saisies de l'etape $etape uniquement
*
* A chaque etape x, les etapes 1 a x sont appelees en verification
* pour verifier l'absence de regression dans la validation (erreur, tentative de reinjection ...)
* en cas d'erreur, la saisie retourne a la premiere etape en erreur.
* en cas de succes, l'etape est incrementee, sauf si c'est la derniere.
* Dans ce dernier cas on declenche traiter()
*
* Traiter
* formulaires_truc_traiter_dist() : ne sera appele que lorsque *toutes*
* les etapes auront ete saisies sans erreur.
* La fonction traiter peut donc traiter l'ensemble des saisies comme si il s'agissait d'un formulaire unique
* dans lequel toutes les donnees auraient ete saisies en une fois
*
*
*/
/**
* Reinjecter dans _request() les valeurs postees
* dans les etapes precedentes
*
* @param string $form
* @return array
*/
function cvtmulti_recuperer_post_precedents($form){
include_spip('inc/filtres');
if ($form
AND $c = _request('cvtm_prev_post')
AND $c = decoder_contexte_ajax($c, $form)){
#var_dump($c);
# reinjecter dans la bonne variable pour permettre de retrouver
# toutes les saisies dans un seul tableau
if ($_SERVER['REQUEST_METHOD']=='POST')
$store = &$_POST;
else
$store = &$_GET;
foreach($c as $k=>$v)
// on ecrase pas si saisi a nouveau !
if (!isset($store[$k]))
$_REQUEST[$k] = $store[$k] = $v;
// mais si tableau des deux cotes, on merge avec priorite a la derniere saisie
elseif(is_array($store[$k])
AND is_array($v)
AND $z = array_keys($v)
AND !is_numeric(reset($z))
AND $z = array_keys($store[$k])
AND !is_numeric(reset($z))
)
$_REQUEST[$k] = $store[$k] = array_merge($v,$store[$k]);
// vider pour eviter un second appel a verifier_n
// en cas de double implementation (unipotence)
set_request('cvtm_prev_post');
return array($c['_etape'],$c['_etapes']);
}
return false;
}
/**
* Sauvegarder les valeurs postees dans une variable encodee
* pour les recuperer a la prochaine etape
*
* @param string $form
* @param bool $je_suis_poste
* @param array $valeurs
* @return array
*/
function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs){
if (!isset($valeurs['_cvtm_prev_post'])){
$post = array('_etape'=>$valeurs['_etape'],'_etapes'=>$valeurs['_etapes']);
foreach(array_keys($valeurs) as $champ){
if (substr($champ,0,1)!=='_'){
if ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])) {
if (($v = _request($champ))!==NULL)
$post[$champ] = $v;
}
}
}
include_spip('inc/filtres');
$c = encoder_contexte_ajax($post,$form);
if (!isset($valeurs['_hidden']))
$valeurs['_hidden'] = '';
$valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='$c' />";
// marquer comme fait, pour eviter double encodage (unipotence)
$valeurs['_cvtm_prev_post'] = true;
}
return $valeurs;
}
/**
* Reperer une demande de formulaire CVT multi page
* et la reformater
*
* @param <type> $flux
* @return <type>
*/
function cvtmulti_formulaire_charger($flux){
#var_dump($flux['data']['_etapes']);
if (is_array($flux['data'])
AND isset($flux['data']['_etapes'])){
$form = $flux['args']['form'];
$je_suis_poste = $flux['args']['je_suis_poste'];
$nb_etapes = $flux['data']['_etapes'];
$etape = _request('_etape');
$etape = min(max($etape,1),$nb_etapes);
set_request('_etape',$etape);
$flux['data']['_etape'] = $etape;
// sauver les posts de cette etape pour les avoir a la prochaine etape
$flux['data'] = cvtmulti_sauver_post($form, $je_suis_poste, $flux['data']);
#var_dump($flux['data']);
}
return $flux;
}
/**
* Verifier les etapes de saisie
*
* @param array $flux
* @return array
*/
function cvtmulti_formulaire_verifier($flux){
#var_dump('Pipe verifier');
if ($form = $flux['args']['form']
AND ($e = cvtmulti_recuperer_post_precedents($form))!==false){
// recuperer l'etape saisie et le nombre d'etapes total
list($etape,$etapes) = $e;
$etape_demandee = _request('aller_a_etape'); // possibilite de poster en entier dans aller_a_etape
// lancer les verifs pour chaque etape deja saisie de 1 a $etape
$erreurs = array();
$derniere_etape_ok = 0;
$e = 0;
while ($e<$etape AND $e<$etapes){
$e++;
$erreurs[$e] = array();
if ($verifier = charger_fonction("verifier_$e","formulaires/$form/",true))
$erreurs[$e] = call_user_func_array($verifier, $flux['args']['args']);
elseif ($verifier = charger_fonction("verifier_etape","formulaires/$form/",true)){
$args = $flux['args']['args'];
array_unshift($args, $e);
$erreurs[$e] = call_user_func_array($verifier, $args);
}
if ($derniere_etape_ok==$e-1 AND !count($erreurs[$e]))
$derniere_etape_ok = $e;
// possibilite de poster dans _retour_etape_x
if (!is_null(_request("_retour_etape_$e")))
$etape_demandee = $e;
}
// si la derniere etape OK etait la derniere
// on renvoie le flux inchange et ca declenche traiter
if ($derniere_etape_ok==$etapes AND !$etape_demandee){
return $flux;
}
else {
$etape = $derniere_etape_ok+1;
if ($etape_demandee>0 AND $etape_demandee<$etape)
$etape = $etape_demandee;
$etape = min($etape,$etapes);
#var_dump("prochaine etape $etape");
// retourner les erreurs de l'etape ciblee
$flux['data'] = isset($erreurs[$etape]) ? $erreurs[$etape] : array() ;
$flux['data']['_etapes'] = "etape suivante $etape";
set_request('_etape',$etape);
}
}
return $flux;
}
/**
* Selectionner le bon fond en fonction de l'etape
* L'etape 1 est sur le fond sans suffixe
* Les autres etapes x sont sur le fond _x
*
* @param array $flux
* @return array
*/
function cvtmulti_styliser($flux){
if (strncmp($flux['args']['fond'],'formulaires/',12)==0
AND isset($flux['args']['contexte']['_etapes'])
AND isset($flux['args']['contexte']['_etape'])
AND ($e=$flux['args']['contexte']['_etape'])>1
AND $ext = $flux['args']['ext']
AND $f=$flux['data']
AND file_exists($f."_$e.$ext"))
$flux['data'] = $f."_$e";
return $flux;
}
?>