You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
4.0 KiB
PHP
123 lines
4.0 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Oautils pour faciliter la construction de formulaires CVT sous formes de listes de saisies
|
|
*
|
|
* @package SPIP\Saisies\Saisies
|
|
**/
|
|
|
|
// Sécurité
|
|
if (!defined('_ECRIRE_INC_VERSION')) {
|
|
return;
|
|
}
|
|
|
|
|
|
/**
|
|
* Cherche la description des saisies d'un formulaire CVT dont on donne le nom
|
|
*
|
|
* @param string $form Nom du formulaire dont on cherche les saisies
|
|
* @param array $args Tableau d'arguments du formulaire
|
|
* @return array Retourne les saisies du formulaire sinon false
|
|
*/
|
|
function saisies_chercher_formulaire($form, $args, $je_suis_poste=false) {
|
|
$saisies = array();
|
|
|
|
if ($fonction_saisies = charger_fonction('saisies', 'formulaires/'.$form, true)) {
|
|
$saisies = call_user_func_array($fonction_saisies, $args);
|
|
}
|
|
|
|
// Si on a toujours un tableau, on passe les saisies dans un pipeline normé comme pour CVT
|
|
if (is_array($saisies)) {
|
|
$saisies = pipeline(
|
|
'formulaire_saisies',
|
|
array(
|
|
'args' => array('form' => $form, 'args' => $args, 'je_suis_poste' => $je_suis_poste),
|
|
'data' => $saisies
|
|
)
|
|
);
|
|
}
|
|
|
|
if (!is_array($saisies)) {
|
|
$saisies = false;
|
|
}
|
|
|
|
return $saisies;
|
|
}
|
|
|
|
|
|
/**
|
|
* Génère un nom unique pour un champ d'un formulaire donné
|
|
*
|
|
* @param array $formulaire
|
|
* Le formulaire à analyser
|
|
* @param string $type_saisie
|
|
* Le type de champ dont on veut un identifiant
|
|
* @return string
|
|
* Un nom unique par rapport aux autres champs du formulaire
|
|
*/
|
|
function saisies_generer_nom($formulaire, $type_saisie) {
|
|
$champs = saisies_lister_champs($formulaire);
|
|
|
|
// Tant que type_numero existe, on incrémente le compteur
|
|
$compteur = 1;
|
|
while (array_search($type_saisie.'_'.$compteur, $champs) !== false) {
|
|
$compteur++;
|
|
}
|
|
|
|
// On a alors un compteur unique pour ce formulaire
|
|
return $type_saisie.'_'.$compteur;
|
|
}
|
|
|
|
|
|
/**
|
|
* Détermine si peut faire une avance rapide en sautant des étapes qui sont "masquées" par afficher_si
|
|
* @param array $saisies le tableau d'ensemble des saisies
|
|
* @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
|
|
* @return int l'étape où avancer
|
|
**/
|
|
function saisies_determiner_avance_rapide($saisies, $etape) {
|
|
return saisies_determiner_deplacement_rapide($saisies, $etape, +1);
|
|
}
|
|
|
|
/**
|
|
* Détermine si peut faire un recul rapide en sautant des étapes qui sont "masquées" par afficher_si
|
|
* @param array $saisies le tableau d'ensemble des saisies
|
|
* @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
|
|
* @return int l'étape où avancer
|
|
**/
|
|
function saisies_determiner_recul_rapide($saisies, $etape) {
|
|
return saisies_determiner_deplacement_rapide($saisies, $etape, -1);
|
|
}
|
|
|
|
/**
|
|
* Détermine si peut faire un déplacement rapide en sautant des étapes qui sont "masquées" par afficher_si
|
|
* Pour le confort de lecture, on pourra préférer les fonctions appellantes
|
|
* `saisies_determiner_avance_rapide()` et `saisies_determiner_recul_rapide()`
|
|
* @param array $saisies le tableau d'ensemble des saisies
|
|
* @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
|
|
* @param int $sens 1 (avance) ou -1 (recule)
|
|
* @return int l'étape où avancer
|
|
**/
|
|
function saisies_determiner_deplacement_rapide($saisies, $etape, $sens) {
|
|
if (abs($sens) != 1) {
|
|
spip_log("Argument $sens invalide dans saisies_determiner_deplacement_rapide ($sens)", 'saisies.'._LOG_ERREUR);
|
|
return $etape;
|
|
}
|
|
$saisies_par_etapes = saisies_lister_par_etapes($saisies);
|
|
$saisies_afficher_si_liste_masquees = saisies_afficher_si_liste_masquees('get');
|
|
$nb_total_etapes = count($saisies_par_etapes);
|
|
$i = $etape + $sens;
|
|
$etape_a_conserver = false;//Basculé à true dès qu'un afficher_si réussit ou si pas d'afficher_si
|
|
while (!$etape_a_conserver and $i <= $nb_total_etapes) {//Tester les futures étapes 1 par 1
|
|
$etape = $saisies_par_etapes["etape_$i"];
|
|
if (!isset($etape['options']['afficher_si']) or !$etape['options']['afficher_si']) {
|
|
$etape_a_conserver = true;
|
|
} elseif (!in_array($etape, $saisies_afficher_si_liste_masquees)) {
|
|
$etape_a_conserver = true;
|
|
} else {
|
|
$i = $i + $sens;
|
|
}
|
|
}
|
|
return $i;
|
|
}
|