Ceci est une des fonctionnalités les plus puissantes de QuickModels.
En effet, pour combler certaines limitations du moteur de QuickModels, l'ensemble des balises dynamiques peuvent recevoir l'appel à une fonction utilisateur à la place d'une variable, ce qui autorise la résolution des cas particuliers et une plus grande souplesse dans la gestion des données.
Imaginons qu'on récupère un ensemble d'informations, issues d'une base de données par exemple, sous forme d'un tableau de données (array), et qu'on souhaite faire un certain nombre de manipulations et mises en forme avant de les afficher, il serait assez laborieux, voire parfois impossible, de le faire directement sur le modèle Html, c'est là que l'appel à des fonctions utilisateurs peut rendre service.
La syntaxe d'appel aux fonctions utilisateur s'applique de manière identique à l'ensemble des balises dynamiques de QM, soit :
Fonctions | Balise Principale | Balise Centrale | Balise Finale |
---|---|---|---|
Affichage des variables | <!--{ma_fonction}--> | - | - |
Inclusion des fichiers | <!--[ma_fonction]--> | - | - |
Blocs conditionnels | <!--(ma_fonction)--> | <!--(else)--> | <!--(end)--> |
Blocs de boucles | <!--<ma_fonction>--> | <!--<valeur>--> | <!--<fin>--> |
Évidemment, suivant la balise utilisée, la fonction doit retourner des valeurs compatibles :
Fonctions | Type de données compatibles |
---|---|
Affichage des variables | valeurs de type texte, Html ou tableau de données (array) |
Inclusion des fichiers | chemin d'accès relatif ou absolu |
Blocs conditionnels | valeur booléenne vraie ou fausse (true = 1 ; false = 0 zéro) |
Blocs de boucles | tableau de données (array) ou valeur numérique (itérations) |
On peut également passer un ou plusieurs arguments à la fonction utilisateur appelée, la syntaxe est identique à celle des tableaux, c'est à dire, il faut ajouter le nom des variables (préalablement mémorisées dans l'instance utilisée), ou des valeurs numériques ou textuelles simples (sans espaces ni caractères spéciaux) séparés par un point, par ex. :
Données | Arguments | Balises |
---|---|---|
Variables | un | <!--{ma_fonction.variable}--> |
plusieurs | <!--{ma_fonction.variable1.variable2}--> | |
Nombres | un | <!--{ma_fonction.25}--> |
plusieurs | <!--{ma_fonction.25.32.8}--> | |
Textes simples | un | <!--{ma_fonction.texte}--> |
plusieurs | <!--{ma_fonction.texte1.texte2}--> | |
Valeurs combinées | plusieurs | <!--{ma_fonction.texte.12}--> |
plusieurs | <!--{ma_fonction.variable.58.texte}--> |
ATTENTION !
Bien s'assurer que le nom de la fonction est unique et qu'il ne correspond pas au nom d'une variable mémorisée dans l'instance de QM utilisée, en effet, le programme donne toujours priorité aux variables.
un |
deux |
trois |
quatre |
cinq |
un |
deux |
trois |
quatre |
cinq |
Clé "lang" | Clé "abrv" | Nombres |
---|---|---|
français | fr |
|
anglais | en |
|
espagnol | es |
|
italien | it |
|
allemand | de |
|
Bonne après-midi à tous :-)
< | décembre 2017 | > | ||||
---|---|---|---|---|---|---|
lu | ma | me | je | ve | sa | di |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
— Php —————————————————————— // Retourne une class Css lorsque la valeur fournie est paire function f_paire($nNro) { $aClass = array('pair', ''); return $aClass[$nNro % 2]; } // Retourne une class Css selon la valeur fournie (paire ou impaire) function f_impaire($nNro) { $aClass = array('pair', 'impair'); return $aClass[$nNro % 2]; } // Retourne un tableau formaté function f_tableau($aArray, $sCle1, $sCle2) { $aTable = array(); foreach ($aArray as $cle => $val) { $sCle3 = $val[$sCle2]; $hList = implode('</li><li>', $val[$sCle3]); $hTable = '<td>'.$val[$sCle1].'</td>'; $hTable .= '<td>'.$sCle3.'</td>'; $hTable .= '<td><ol style="text-align: left;">'; $hTable .= '<li>'.$hList.'</li></ol></td>'; $aTable[] = $hTable; } return $aTable; } // Retourne vrai si l'heure courante est dans la fourchette fournie function f_heure($nMin, $nMax) { $nHeure = (int)date('H'); if ($nMin > $nMax) { return (($nHeure >= (int)$nMin) || ($nHeure < (int)$nMax)); } else { return (($nHeure >= (int)$nMin) && ($nHeure < (int)$nMax)); } } // Retourne un calendrire sous forme de tableau function f_cal() { setlocale (LC_TIME, array('fr_FR.UTF-8', 'fr_FR', 'fr' )); list($aCal, $sSid) = array(array(), '?sid='.$_GET['sid']); // [..] Voir code Php complet return $aCal; } // Memorisation d'un tableau (array) simple $qm->set('aSimple', array('un', 'deux', 'trois', 'quatre', 'cinq')); // Mémorisation des tableaux (array) imbriqués $qm->set('aMulti', array( array('lang'=>'français','abrv'=>'fr','fr'=>array('un','deux','trois')), array('lang'=>'anglais','abrv'=>'en','en'=>array('one','two','three')), array('lang'=>'espagnol','abrv'=>'es','es'=>array('uno','dos','tres')), array('lang'=>'italien','abrv'=>'it','it'=>array('un','due','tre')), array('lang'=>'allemand','abrv'=>'de','de'=>array('a','zwei','drei')) )); // Mémorisation du tableau (array) du calendrier $qm->set('aCal', f_cal()); — Html ————————————————————— <h4>Formatage des rangées paires dans un tableau</h4> <table align="center" border="0" cellspacing="0" cellpadding="0" style="width: 200px; margin: 0px auto;"> <!--<aSimple>--> <tr><td class="<!--{f_paire.<!--<c>-->}-->"><!--<v>--></td></tr> <!--<end>--> </table> <h4>Formatage des rangées paires et impaires dans un tableau</h4> <table align="center" border="0" cellspacing="0" cellpadding="0" style="width: 200px; margin: 0px auto;"> <!--<aSimple>--> <tr><td class="<!--{f_impaire.<!--<c>-->}-->"><!--<v>--></td></tr> <!--<end>--> </table> <h4>Formatage d'un tableau de données (array) dans une boucle</h4> <table align="center" border="0" cellspacing="0" cellpadding="0" style="width: 500px; margin: 0px auto;"> <tr><th>Clé "lang"</th><th>Clé "abrv"</th><th>Nombres</th></tr> <!--<f_tableau.aMulti.lang.abrv>--> <tr class="<!--{f_paire.<!--<c>-->}-->"><!--<valeur>--></tr> <!--<fin>--> </table> <h4>Affichage conditionnel suivant le moment de la journée</h4> <!--(f_heure.6.12)-->Bonne matinée à tous :-)<!--(s)--><!--(n)--> <!--(f_heure.12.18)-->Bonne après-midi à tous :-)<!--(s)--><!--(n)--> <!--(f_heure.18.22)-->Bonne soirée à tous :-)<!--(s)--><!--(n)--> <!--(f_heure.22.6)-->Bonne nuit à tous :-)<!--(s)--><!--(n)--> <h4>Affichage d'un calendrier dynamique</h4> <table border="0" cellspacing="4" cellpadding="0" align="center" class="minical_table"> <tr class="minical_titre"><th><a href="<!--{aCal.avant}-->"><</a></th> <th colspan="5"><a href="<!--{aCal.actuel}-->"><!--{aCal.titre}--></a></th> <th><a href="<!--{aCal.apres}-->">></a></th></tr> <tr class="minical_jours"><th>lu</th><th>ma</th><th>me</th> <th>je</th><th>ve</th><th>sa</th><th>di</th></tr> <!--<aCal.mois>--> <tr class="minical_dates"> <td><!--<v.0>--></td><td><!--<v.1>--></td><td><!--<v.2>--></td> <td><!--<v.3>--></td><td><!--<v.4>--></td> <td class="minical_sam"><!--<v.5>--></td><td class="minical_dim"><!--<v.6>--></td> </tr> <!--<end>--> </table>
/*—————————————————————————*\ Fonctions utilisateur NOTE : il faut bien s'assurer que le nom de la fonction est unique et qu'il ne correspond pas au nom d'une variable mémorisée dans l'instance utilisée. IMPORTANT : évitez les caractères spéciaux ou accentués, ainsi que les espaces et les signes de ponctuation dans les nom des variables ; autorisés [a-zA-Z0-9_]. \*—————————————————————————*/ // Retourne une class Css lorsque la valeur fournie est paire function f_paire($nNro) { $aClass = array('pair', ''); return $aClass[$nNro % 2]; } // Retourne une class Css selon la valeur fournie (paire ou impaire) function f_impaire($nNro) { $aClass = array('pair', 'impair'); return $aClass[$nNro % 2]; } // Retourne un tableau formaté function f_tableau($aArray, $sCle1, $sCle2) { $aTable = array(); foreach ($aArray as $cle => $val) { $sCle3 = $val[$sCle2]; $hList = implode('</li><li>', $val[$sCle3]); $hTable = '<td>'.$val[$sCle1].'</td>'; $hTable .= '<td>'.$sCle3.'</td>'; $hTable .= '<td><ol style="text-align: left;">'; $hTable .= '<li>'.$hList.'</li></ol></td>'; $aTable[] = $hTable; } return $aTable; } // Retourne vrai si l'heure courante est dans la fourchette fournie function f_heure($nMin, $nMax) { $nHeure = (int)date('H'); if ($nMin > $nMax) { return (($nHeure >= (int)$nMin) || ($nHeure < (int)$nMax)); } else { return (($nHeure >= (int)$nMin) && ($nHeure < (int)$nMax)); } } // Retourne un calendrire sous forme de tableau function f_cal() { setlocale (LC_TIME, array('fr_FR.UTF-8', 'fr_FR', 'fr' )); list($aCal, $sSid) = array(array(), '?sid='.$_GET['sid']); list($sDateToday, $sDateJob) = array(date('Y-m-d'), date('Y-m-d')); if (isset($_GET['date']) && !empty($_GET['date'])) { $sDateJob = $_GET['date']; } list($nAnnee, $nMois, $nJour) = explode('-', $sDateJob); if (!($nJourDebut = date('w', mktime(0, 0, 0, $nMois, 1, $nAnnee)))) { $nJourDebut = 7; } $aCal['titre'] = strftime("%B %Y", strtotime($sDateJob)); $aCal['avant'] = $sSid.'&date='.date('Y-m', mktime(0, 0, 0, (0 + $nMois - 1), 1, $nAnnee)).'-01#minical'; $aCal['actuel'] = $sSid.'&date='.$sDateToday.'#minical'; $aCal['apres'] = $sSid.'&date='.date('Y-m', mktime(0, 0, 0, (0 + $nMois + 1), 1, $nAnnee)).'-01#minical'; if (--$nJourDebut % 7) { $aCal['mois'][] = array_fill(0, $nJourDebut, ' '); } else { $aCal['mois'][] = array(); } while (checkdate($nMois, ++$j, $nAnnee)) { $nNro = count($aCal['mois']) - 1; $aJour = array($j, '<strong>'.$j.'</strong>'); $aCal['mois'][$nNro][] = $aJour[$sDateToday == date('Y-m-d', mktime(0, 0, 0, $nMois, $j, $nAnnee))]; if (!(++$nJourDebut % 7) && checkdate($nMois, ($j +1), $nAnnee)) { $aCal['mois'][] = array(); } } if ($nJourDebut % 7) { $aRest = array_fill(0, 7 - ($nJourDebut % 7), ' '); $aCal['mois'][$nNro] = array_merge($aCal['mois'][$nNro], $aRest); } return $aCal; } /*—————————————————————————*\ Memorisation des variables et valeurs On utilise la méthode "set()" avec deux arguments : 1. le premier est le nom, ou identifiant, de la variable 2. le second est la valeur à mémoriser puis à afficher NOTE : il faut entourer les noms et les valeurs avec des appostrophes '' ou des guillemets "", si vous avez besoin d'un de ces caractères à l'intérieur de la valeur, vous devrez le protéger avec un anti-slash \, par ex. \". IMPORTANT : évitez les caractères spéciaux ou accentués, ainsi que les espaces et les signes de ponctuation dans les nom des variables ; autorisés [a-zA-Z0-9_]. \*—————————————————————————*/ // Memorisation d'un tableau (array) simple $qm->set('aSimple', array('un', 'deux', 'trois', 'quatre', 'cinq')); // Mémorisation des tableaux (array) imbriqués $qm->set('aMulti', array( array('lang'=>'français','abrv'=>'fr','fr'=>array('un','deux','trois')), array('lang'=>'anglais','abrv'=>'en','en'=>array('one','two','three')), array('lang'=>'espagnol','abrv'=>'es','es'=>array('uno','dos','tres')), array('lang'=>'italien','abrv'=>'it','it'=>array('un','due','tre')), array('lang'=>'allemand','abrv'=>'de','de'=>array('a','zwei','drei')) )); // Mémorisation du tableau (array) du calendrier $qm->set('aCal', f_cal()); //
<!-- |> --> <h3>Les fonctions utilisateur : exemples</h3> <h4>Formatage des rangées paires dans un tableau</h4> <p> <table align="center" border="0" cellspacing="0" cellpadding="0" style="width: 200px; margin: 0px auto;"> <!--<aSimple>--> <tr class="<!--{f_paire.<!--<c>-->}-->"><td><!--<v>--></td></tr> <!--<end>--> </table> </p> <h4>Formatage des rangées paires et impaires dans un tableau</h4> <p> <table align="center" border="0" cellspacing="0" cellpadding="0" style="width: 200px; margin: 0px auto;"> <!--<aSimple>--> <tr class="<!--{f_impaire.<!--<c>-->}-->"><td><!--<v>--></td></tr> <!--<end>--> </table> </p> <h4>Formatage d'un tableau de données (array) dans une boucle</h4> <p> <table align="center" border="0" cellspacing="0" cellpadding="0" style="width: 500px; margin: 0px auto;"> <tr><th>Clé "lang"</th><th>Clé "abrv"</th><th>Nombres</th></tr> <!--<f_tableau.aMulti.lang.abrv>--> <tr class="<!--{f_paire.<!--<c>-->}-->"><!--<valeur>--></tr> <!--<fin>--> </table> </p> <h4>Affichage conditionnel suivant le moment de la journée</h4> <p> <!--(f_heure.6.12)-->Bonne matinée à tous :-)<!--(s)--><!--(n)--> <!--(f_heure.12.18)-->Bonne après-midi à tous :-)<!--(s)--><!--(n)--> <!--(f_heure.18.22)-->Bonne soirée à tous :-)<!--(s)--><!--(n)--> <!--(f_heure.22.6)-->Bonne nuit à tous :-)<!--(s)--><!--(n)--> </p> <h4>Affichage d'un calendrier dynamique</h4> <div id="minical" class="minical_bloc"> <table border="0" cellspacing="4" cellpadding="0" align="center" class="minical_table"> <tr class="minical_titre"><th><a href="<!--{aCal.avant}-->"><</a></th> <th colspan="5"><a href="<!--{aCal.actuel}-->"><!--{aCal.titre}--></a></th> <th><a href="<!--{aCal.apres}-->">></a></th></tr> <tr class="minical_jours"><th>lu</th><th>ma</th><th>me</th> <th>je</th><th>ve</th><th>sa</th><th>di</th></tr> <!--<aCal.mois>--> <tr class="minical_dates"> <td><!--<v.0>--></td><td><!--<v.1>--></td><td><!--<v.2>--></td> <td><!--<v.3>--></td><td><!--<v.4>--></td> <td class="minical_sam"><!--<v.5>--></td><td class="minical_dim"><!--<v.6>--></td> </tr> <!--<end>--> </table> </div> <!-- <| -->
QuickModels - 0.00395 - sico