Browse Source

Après des jours de recherche… Gros bug avec un énième (c'est récurent au fil des années) oubli de prendre en compte quand les champs ne sont pas des noms simples mais des sous-tableaux. Là c'est quand on cherche à vider les valeurs de request des champs masqués donc désactivés par afficher_si. Ça faisait un set_request() basique, qui ne faisait donc rien si le nom était tableau[index]. Tout comme il y a saisies_request, on fait donc une fonction saisies_set_request qui fait ça proprement et mutualisé. MAIS comme dit dans le ticket #29 ça n'a strictement rien de propre à Saisies ! On devrait donc prendre en compte ces cas directement dans _request() et set_request() du core, d'après moi.

pull/34/head v3.42.5
RastaPopoulos 2 years ago
parent
commit
ed8fab3352
  1. 45
      inc/saisies.php
  2. 4
      inc/saisies_afficher_si_php.php
  3. 2
      paquet.xml

45
inc/saisies.php

@ -393,8 +393,13 @@ function saisies_verifier_valeurs_acceptables($saisies, $erreurs) {
/**
* Trouve le résultat d'une saisie (_request())
* en tenant compte du fait que la saisie peut être décrit sous forme de sous entrées d'un tableau
* @param string $champ nom du champ de la saisie, y compris avec crochets pour sous entrées
* return string|array résultat du _request()
*
* @todo Prendre en compte aussi la notation champ/index/index
* @todo Prendre un arg en plus pour chercher dans un autre tableau que le GET/POST
* @param string $champ
* Nom du champ de la saisie, y compris avec crochets pour sous entrées
* @return string|array
* Résultat du _request()
**/
function saisies_request($champ) {
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
@ -408,8 +413,44 @@ function saisies_request($champ) {
// Sinon la valeur est juste celle du champ
$valeur = _request($champ);
}
return $valeur;
}
/**
* Modifie la valeur d'un saisie postée en tenant compte que ça puisse être un tableau
*
* @todo Prendre en compte aussi la notation champ/index/index
* @todo Prendre un arg en plus pour enregistrer la valeur dans un autre tableau que le GET/POST
* @param string $nom
* Nom du champ
* @param $valeur
* Valeur à remplir dans le request
* @return void
*/
function saisies_set_request($champ, $valeur) {
// Si on détecte que c'est un tableau[index][index]
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
$nom_champ_principal = $separe[1];
$champ_principal = _request($nom_champ_principal);
$enfant = &$champ_principal;
// On va chercher au fond du tableau
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
foreach ($index[1] as $cle) {
$enfant = &$enfant[$cle];
}
// Une fois descendu tout en bas, on met la valeur
$enfant = $valeur;
// Et on reinjecte le tout
set_request($nom_champ_principal, $champ_principal);
}
// Sinon la valeur est juste celle du nom
else {
set_request($champ, $valeur);
}
}
/**
* Trouve le champ datas ou datas (pour raison historique)
* parmis les paramètres d'une saisie

4
inc/saisies_afficher_si_php.php

@ -80,7 +80,9 @@ function saisies_verifier_afficher_si($saisies, $env = null) {
* @param array $saisie
**/
function saisies_set_request_null_recursivement($saisie) {
set_request($saisie['options']['nom'], null);
// Attention, tout champ peut être un sous-tableau !
saisies_set_request($saisie['options']['nom'], null);
if (isset($saisie['saisies'])) {
foreach ($saisie['saisies'] as $sous_saisie) {
saisies_set_request_null_recursivement($sous_saisie);

2
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="saisies"
categorie="outil"
version="3.42.4"
version="3.42.5"
etat="stable"
compatibilite="[3.0.0;3.2.*]"
logo="images/logo_saisie_48.png"

Loading…
Cancel
Save