Browse Source

Dans les tests de condition *en PHP*, on sait moins facilement si on attend un tableau ou pas, suivant comment ça a été stocké en base (pas pareil en Formidable et Champs Extras pour l'instant). Donc quand on récupère la valeur, on teste si c'était une saisie de type tabulaire ou pas puisqu'on sait ici de quelle saisie il s'agit ! Et dans ce cas on force toujours en tableau. Au passage on renomme des variables pour être plus explicite : saisies_par_nom et valeur au lieu de champ

pull/39/head
RastaPopoulos 2 years ago
parent
commit
14fe3a4a3c
  1. 69
      inc/saisies_afficher_si_php.php
  2. 2
      paquet.xml

69
inc/saisies_afficher_si_php.php

@ -94,33 +94,38 @@ function saisies_set_request_null_recursivement($saisie) {
* sinon en _request() ou en $env["valeurs"]
* @param string $champ: le champ
* @param null|array $env
* @param array $saisies
* @param array $saisies_par_nom
* Les saisies déjà classées par nom de champ
* @return la valeur du champ ou de la config
**/
function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies) {
function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies_par_nom) {
$valeur = null;
$plugin = saisies_afficher_si_evaluer_plugin($champ);
$config = saisies_afficher_si_get_valeur_config($champ);
$fichiers = false;
if (isset($saisies[$champ])) {
$fichiers = $saisies[$champ]['saisie'] == 'fichiers';
$est_tabulaire = false;
if (isset($saisies_par_nom[$champ])) {
$fichiers = $saisies_par_nom[$champ]['saisie'] == 'fichiers';
$est_tabulaire = saisies_saisie_est_tabulaire($saisies_par_nom[$champ]);
}
if ($plugin !== '') {
$champ = $plugin;
$valeur = $plugin;
} elseif ($config) {
$champ = $config;
$valeur = $config;
} elseif (is_null($env)) {
// Si le nom du champ est un tableau indexé, il faut parser !
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
$champ= _request($separe[1]);
$valeur= _request($separe[1]);
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
// On va chercher au fond du tableau
foreach ($index[1] as $cle) {
if ($fichiers) {
$files = isset($_FILES[$champ[$cle]]) ? $_FILES[$champ[$cle]]['name'] : array();
$files = isset($_FILES[$valeur[$cle]]) ? $_FILES[$valeur[$cle]]['name'] : array();
$precedent = _request('cvtupload_fichiers_precedents');
$precedent = $precedent[$champ[$cle]];
$precedent = $precedent[$valeur[$cle]];
} else {
$champ = $champ[$cle];
$valeur = $valeur[$cle];
}
}
} else {
@ -129,20 +134,34 @@ function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies) {
$precedent = _request('cvtupload_fichiers_precedents');
$precedent = $precedent[$champ];
} else {
$champ = _request($champ);
$valeur = _request($champ);
}
}
} else {
$champ = $env['valeurs'][$champ];
$valeur = $env['valeurs'][$champ];
}
if ($fichiers) {
if (!is_array($precedent)) {
$precedent = array();
}
$champ = array_merge($files, $precedent);
$champ = array_filter($champ);
$valeur = array_merge($files, $precedent);
$valeur = array_filter($valeur);
}
return $champ;
// On teste si on doit forcer que ce soit un tableau, suivant le type de la saisie
if ($est_tabulaire) {
$data = isset($saisies_par_nom[$champ]['options']['data']) ?
$saisies_par_nom[$champ]['options']['data']
:
isset($saisies_par_nom[$champ]['options']['datas']) ?
$saisies_par_nom[$champ]['options']['datas']
:
null;
$valeur = saisies_valeur2tableau($valeur, $data);
}
return $valeur;
}
@ -155,27 +174,32 @@ function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies) {
* @param array|null $env
* Tableau d'environnement transmis dans inclure/voir_saisies.html,
* NULL si on doit rechercher dans _request (pour saisies_verifier()).
* @param array $saisies
* @param array $saisies_par_nom
* Les saisies déjà classées par nom de champ
* @param string|null $no_arobase une valeur à tester là où il devrait y avoir un @@
* @return string $condition
**/
function saisies_transformer_condition_afficher_si($condition, $env = null, $saisies = array(), $no_arobase=null) {
function saisies_transformer_condition_afficher_si($condition, $env = null, $saisies_par_nom = array(), $no_arobase=null) {
if ($tests = saisies_parser_condition_afficher_si($condition, $no_arobase)) {
if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
return '';
}
foreach ($tests as $test) {
$expression = $test[0];
if (!isset($test['booleen'])) {
if (!$no_arobase) {
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env, $saisies);
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env, $saisies_par_nom);
} else {
$champ = $no_arobase;
}
$total = isset($test['total']) ? $test['total'] : '';
$operateur = isset($test['operateur']) ? $test['operateur'] : null;
$negation = isset($test['negation']) ? $test['negation'] : '';
if (isset($test['valeur_numerique'])) {
$valeur = intval($test['valeur_numerique']);
} elseif (isset($test['valeur'])) {
@ -183,6 +207,7 @@ function saisies_transformer_condition_afficher_si($condition, $env = null, $sai
} else {
$valeur = null;
}
$test_modifie = saisies_tester_condition_afficher_si($champ, $total, $operateur, $valeur, $negation) ? 'true' : 'false';
$condition = str_replace($expression, $test_modifie, $condition);
}
@ -193,6 +218,7 @@ function saisies_transformer_condition_afficher_si($condition, $env = null, $sai
return '';
}
}
return $condition;
}
@ -203,12 +229,13 @@ function saisies_transformer_condition_afficher_si($condition, $env = null, $sai
* @param array|null $env
* Tableau d'environnement transmis dans inclure/voir_saisies.html,
* NULL si on doit rechercher dans _request (pour saisies_verifier()).
* @param array $saisies
* @param array $saisies_par_nom
* Les saisies déjà classées par nom de champ
* @param string|null $no_arobase une valeur à tester là où il devrait y avoir un @@
* @return bool le résultat du test
**/
function saisies_evaluer_afficher_si($condition, $env = null, $saisies=array(), $no_arobase=null) {
$condition = saisies_transformer_condition_afficher_si($condition, $env, $saisies, $no_arobase);
function saisies_evaluer_afficher_si($condition, $env = null, $saisies_par_nom=array(), $no_arobase=null) {
$condition = saisies_transformer_condition_afficher_si($condition, $env, $saisies_par_nom, $no_arobase);
if ($condition) {
eval('$ok = '.$condition.';');
} else {

2
paquet.xml

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

Loading…
Cancel
Save