Browse Source

Nouvelle fonction pour les afficher_si (uniquement en PHP) : pouvoir ne pas passer

explicitement un champ.
Dans ce cas on testera avec la valeur du dernier paramètre (nouvellement
créé) de saisies_evaluer_afficher_si.
Exemple  avec formidable ts :
- le afficher si est '> 130';
- le dernier paramètre est "120"
> le resultat sera faux.
pull/21/head
Maïeul 2 years ago
parent
commit
39f5ed53b9
  1. 24
      inc/saisies_afficher_si_commun.php
  2. 18
      inc/saisies_afficher_si_php.php

24
inc/saisies_afficher_si_commun.php

@ -12,16 +12,27 @@
* Reçoit une condition
* la parse pour trouver champs/opérateurs/valeurs etc.
* @param string $condition
* @param bool=true $no_arobase, permet de ne pas parser le arobase
* @return array tableau d'analyse (resultat d'un preg_match_all) montrant sous condition par sous condition l'analyse en champ/opérateur/valeur etc.
**/
function saisies_parser_condition_afficher_si($condition) {
static $cache = array();
if (isset($cache[$condition])) {
return $cache[$condition];
function saisies_parser_condition_afficher_si($condition, $no_arobase=false) {
static $cache = array(
'no_arobase' => array(),
'arobase' => array()
);
if ($no_arobase) {
$cache_ici = &$cache['no_arobase'];
$no_arobase = '?';
} else {
$no_arobase = '';
$cache_ici = &$cache['arobase'];
}
if (isset($cache_ici[$condition])) {
return $cache_ici[$condition];
}
$regexp =
'(?<negation>!?)' // négation éventuelle
. '(?:@(?<champ>.+?)@)' // @champ_@
. "((?:(?<arobase>@)(?<champ>.+?)(\k<arobase>)))$no_arobase" // @champ_@, optionnel (formidable_ts)
. '(?<total>:TOTAL)?' // TOTAL éventuel (pour les champs de type case à cocher)
. '(' // partie operateur + valeur (optionnelle) : debut
. '(?:\s*?)' // espaces éventuels après
@ -31,8 +42,9 @@ function saisies_parser_condition_afficher_si($condition) {
. ')?' // partie operateur + valeur (optionnelle) : fin
. '|(?<booleen>false|true)';//accepter false/true brut
$regexp = "#$regexp#";
preg_match_all($regexp, $condition, $tests, PREG_SET_ORDER);
$cache[$condition] = $tests;
$cache_ici[$condition] = $tests;
return $tests;
}

18
inc/saisies_afficher_si_php.php

@ -133,7 +133,7 @@ function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies) {
}
}
} else {
$champ = $env["valeurs"][$champ];
$champ = $env['valeurs'][$champ];
}
if ($fichiers) {
if (!is_array($precedent)) {
@ -158,8 +158,8 @@ function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies) {
* @param array $saisies
* @return string $condition
**/
function saisies_transformer_condition_afficher_si($condition, $env = null, $saisies = array()) {
if ($tests = saisies_parser_condition_afficher_si($condition)) {
function saisies_transformer_condition_afficher_si($condition, $env = null, $saisies = array(), $no_arobase=false) {
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 '';
@ -167,8 +167,11 @@ function saisies_transformer_condition_afficher_si($condition, $env = null, $sai
foreach ($tests as $test) {
$expression = $test[0];
if (!isset($test['booleen'])) {
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env, $saisies);
if (!$no_arobase) {
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env, $saisies);
} else {
$champ = $no_arobase;
}
$total = isset($test['total']) ? $test['total'] : '';
$operateur = isset($test['operateur']) ? $test['operateur'] : null;
$negation = isset($test['negation']) ? $test['negation'] : '';
@ -179,7 +182,6 @@ 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);
}
@ -203,8 +205,8 @@ function saisies_transformer_condition_afficher_si($condition, $env = null, $sai
* @param array $saisies
* @return bool le résultat du test
**/
function saisies_evaluer_afficher_si($condition, $env = null, $saisies=array()) {
$condition = saisies_transformer_condition_afficher_si($condition, $env, $saisies);
function saisies_evaluer_afficher_si($condition, $env = null, $saisies=array(), $no_arobase=false) {
$condition = saisies_transformer_condition_afficher_si($condition, $env, $saisies, $no_arobase);
if ($condition) {
eval('$ok = '.$condition.';');
} else {

Loading…
Cancel
Save