Site : www.tinybutstrong.com
Auteur : skrol29
Date : 2009-11-14
*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*
TinyButStrong
version 3.5
*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*.^.*
 

Template Engine pour Pro et débutants
sous PHP 4 et 5
 

Plan de ce fichier d'aide :
Rubrique Description
   
• Présentation  
    Principes de base  
    Installation  
    Mini exemples  
• Coté PHP  
    • Pour commencer  
        méthode LoadTemplate() charge le contenu d'un modèle à partir d'un fichier
        méthode MergeBlock() fusionne une partie du modèle avec une source de données
        méthode Show() traitements automatiques et affichage du résultat
    • Avancé  
        méthode GetBlockSource() retourne le source de la définition d'un bloc
        méthode MergeField() fusionne un champ particulier avec une valeur
        méthode PlugIn() exécute une action d'un plug-in
        propriété Assigned prépare les informations pour une fusion ultérieure
        propriété NoErr empêche les messages d'erreur
        propriété Render pour modifier les options de fin de fusion
        propriété Source retourne le contenu courant du résultat de la fusion
        propriété TplVars retourne les variables du modèle
        Programmation Orientée Objet (POO) pour que TBS vous facilite la POO.
• Coté modèle  
    • les champs TBS  
        définition et syntaxe  
        paramètres  
        ordre de traitement des paramètres  
        les champs automatiques  
        les champs automatiques spéciaux  
    • les blocs TBS  
        définition et syntaxes  
        paramètres  
        sections de bloc  
        les blocs automatiques  
        affichage en série (en colonnes)  
        les sous-blocs  
        sous-blocs automatiques  
        sous-blocs avec requêtes dynamiques  
    • Autre  
        sous-modèles  
        vue d'ensemble de l'affichage conditionnel  
• Coder des plug-ins  
    Plug-ins de base de données  
    Autres plug-ins  
• Résumés  
    paramètres des champs TBS  
    paramètres des blocs TBS  
    noms de champs et blocs spéciaux  
Présentation :

TinyButStrong (TBS) est une classe PHP utile pour développer une application en séparant proprement vos scripts PHP de vos fichiers XML/HTML/Texte. Avec TBS, les fichiers sont générées dynamiquement en fusionnant un modèle avec des données. C'est ce qu'on appelle un moteur de modèle (Template Engine).

TBS tient son nom du fait qu'il ne présente que 8 fonctions mais qu'il permet de faire le maximum. Il est ••• très très fort ••• pour fusionner des modèles avec vos variables PHP ou vos requêtes MySQL, PostgreSQL, ou SQLite.

TBS a été conçu pour que vous puissiez développer avec facilité vos modèles depuis n'importe quel éditeur visuel (comme Dreamweaver ou FrontPage), mais si vous avez l'habitude d'utiliser un éditeur textuel il est tout aussi pratique. TBS permet aussi de créer du JavaScript dynamiquement.

Comme son nom l'indique, TBS est simple à utiliser, puissant et rapide. Il est complètement °~° freeware °~°.

Principes de base :

Du coté HTML (ou autre type de fichier) :
Vous concevez une page qui n'a pas besoin de contenir de script PHP, ni de programmation. Dans cette page vous placez des balises TBS aux endroits où doivent s'afficher les données dynamiques. Cette page est appelée un 'modèle'. Il existe deux types de balises : les 'champs' qui servent à afficher une donnée dynamiquement, et les 'blocs' qui servent à définir une zone, le plus souvent pour afficher les enregistrements d'une source de données.

Du coté PHP :
Vous utilisez une variable objet TBS pour piloter la fusion de votre modèle avec des données. à la fin, TBS affiche le résultat de la fusion.


Installation :

1. Copiez le fichier tbs_class.php dans un répertoire de votre site Web.
2. Au début de votre programme PHP, ajoutez les lignes :
  include_once('tbs_class.php');
  $TBS = new clsTinyButStrong ;
Remarque : si le fichier tbs_class.php se trouve dans un répertoire différent de celui de votre programme, vous devrez préciser le répertoire devant le nom du fichier.

Explications et détails techniques :

TinyButStrong est un librairie écrite en PHP, c'est un composant à référencer dans vos propres programmes PHP. En terme technique, TinyButStrong est une 'classe' d'objet PHP ; le nom de cette classe est clsTinyButStrong.
La variable $TBS que ajoutez en début de programme sert à piloter la fusion de votre modèle depuis votre application PHP. En terme technique, la variable $TBS est une 'instance' de la classe clsTinyButStrong.


Mini exemples :

Exemple 1 :
Modèle Html Programme Php Résultat
<html>
 <body>
  [onshow.message]
 </body>
</html>

<?

include_once('tbs_class.php');
$TBS = new clsTinyButStrong ;
$TBS->LoadTemplate('template.htm') ;

$message = 'Hello' ;
$TBS->Show() ;

?>
<html>
 <body>
  Hello
 </body>
</html>

Exemple 2 :
Modèle Html Programme Php Résultat
<table>
 <tr><td>[blk.val;block=tr]</td></tr>
</table>

<?

include_once('tbs_class.php');
$TBS = new clsTinyButStrong ;
$TBS->LoadTemplate('template.htm') ;

$liste = array('X','Y','Z') ;
$TBS->MergeBlock('blk',$liste) ;
$TBS->Show() ;

?>
<table>
 <tr><td>X</td></tr>
 <tr><td>Y</td></tr>
 <tr><td>Z</td></tr>
</table>
Coté PHP :
Le pilotage de la fusion d'un modèle se fait dans un programme PHP en utilisant une variable objet déclaré à partir de la classe clsTinyButStrong.
Exemple de déclaration : $TBS = new clsTinyButStrong ;
Cet objet vous permet de charger un modèle, piloter sa fusion avec des données, puis afficher le résultat.

Exemple de code PHP :

include_once('tbs_class.php');
$TBS = new clsTinyButStrong ;
$TBS->LoadTemplate('template.htm') ;
$TBS->MergeBlock('ctry','mysql','SELECT * FROM t_coutry') ;
$TBS->Show() ;

Voici la liste des propriétés et méthodes d'un objet TinyButStrong :

Méthode LoadTemplate() :
Charge un modèle en vue de son traitement pour la fusion.
Le contenu complet du fichier est enregistré dans la propriété Source de l'objet TinyButStrong, puis les champs et blocs [onload] sont fusionnés.
Si le fichier n'est pas trouvé il sera aussi recherché dans le répertoire du dernier modèle chargé (depuis TBS version 3.2.0).

Syntaxe : $TBS->LoadTemplate(string Fichier{, string Charset})

Argument Description
Fichier Chemin local ou absolu du fichier modèle à charger.
Cette valeur peut être null ou '' (chaine vide) pour des actions spéciales. Voir les détails ci-dessous.
Charset Facultatif. Indique l'encodage des caractères (charset) à utiliser pour la conversion des caractères spéciaux des données lorsqu'elles seront fusionnées. La valeur par défaut est '' (chaîne vide) qui équivaut à 'ISO-8859-1' (Latin 1).

Si votre modèle utilise un charset spécial, indiquez la valeur Html de ce charset.
Dans une page Html, le charset se trouve en tête du fichier, dans l'attribut 'content' d'une balise <Meta>. Les charset supportés par TBS sont ceux supportés par la fonction htmlentities() de Php. Par exemple : 'BIG5' (chinois) ou 'EUCJP' (japonais).

Voir ci-dessous pour plus de possibilités.

Portée de la recherche du fichier :
Si le fichier n'est pas trouvé, il sera aussi recherché dans le répertoire du dernier modèle ou sous-modèle chargé.
Depuis TBS version 3.3.0, le fichier est aussi recherché dans le include_path.

Pas de conversion de caractère :
Si vous utilisez la valeur False pour l'argument Charset, alors les données ne seront pas converties lors de la fusion avec le modèle.
Notez que le paramètre htmlconv peut être utilisé pour définir la conversion de caractères spéciaux pour un champ TBS.

Fonction utilisateur :
Si votre charset n'est pas supporté par PHP, vous pouvez désigner une fonction utilisateur qui réalise la conversion de caractères spéciaux. Pour cela, utilisez l'argument Charset avec la syntaxe '=mafonction'.
Depuis TBS version 3.0, il est aussi possible d'indiquer une méthode de classe (voir POO).
Depuis TBS version 3.3.0, cette fonction utilisateur devrait avoir un second argument pour la conversion des sauts-de-lignes.
Depuis TBS version 3.5.0, l'argument Charset peut aussi être a tableau contenant un objet et une méthode. Exemple : array(&$obj, 'mamethode').
Voici un exemple qui donne la syntaxe attendue :
function f_StrToXml($Txt string,$ConvBr boolean) {
// Convertie une chaîne en texte XML.
  $x = htmlspecialchars(utf8_encode($Txt));
  if ($ConvBr) {
    $x = nl2br($x); // Convertie tout type de saut-de-ligne
    $x = str_replace('<br />', '<text:line-break/>',$x);
  return $x;
}


Ajouter le fichier à la suite du modèle en cours :

Vous pouvez utiliser le mot-clé '+' à la place du charset pour que le fichier spécifié soit ajouté à la fin du modèle en cours au lieu de l'écraser. Le charset utilisé est alors le même que pour le premier modèle.

Actions spéciales :
Depuis TBS version 3.4.0.
Si Fichierest null, alors toutes les actions par défaut (Plugins, balises [onload], et Charset) sont appliquées sans charger aucun fichier.
Si Fichier est '' (chaine vide), alors seul le charset est modifié, sans faire rien aucune autre action.
Exemple :
$TBS->Source = $modele; // charge le modèle depuis une chaine
$TBS->LoadTemplate(null,'BIG5'); // lance les plugins s'il y en a, et fusionne les balises [onload] s'il y en a
...
$TBS->LoadTemplate('',false); // remplace le charset pas aucun-charset
Méthode MergeBlock() :
Fusionne un ou plusieurs blocs TBS avec les données d'une source d'enregistrements.
Par défaut, cette méthode retourne le nombre d'enregistrements fusionnés (plus exactement, elle retourne le numéro du dernier enregistrement), mais elle peut aussi retourner le jeu complet des enregistrements fusionnés (voir argument NomBloc).

TinyButStrong supporte plusieurs types de sources de données en natif :
Données Php : un tableau ; une chaîne texte, un nombre.
Base de données : MySQL ; PostgreSQL ; SQLite.
Mais vous pouvez aussi en ajouter de nouveaux : 'plug-ins de base de données'.

Syntaxe : int $TBS->MergeBlock(string NomBloc, mixed Source{, string Requête})
Argument Description
NomBloc Indique le nom du bloc TBS à fusionner.
Vous pouvez fusionner plusieurs blocs avec les mêmes données en indiquant leurs noms séparés par des virgules. Si vous ajoutez '*' comme nom de bloc, alors la méthode retournera le jeu complet des enregistrements fusionnés sous forme de tableau PHP, à la place du nombre d'enregistrements.
Historique : le mot clé '*' est supporté depuis TBS version 3.0.
Source

Variable ou mot-clé qui désigne la source de données pour la fusion.
Le tableau ci-dessous indique les valeurs possibles selon le type de source de données.

Requête Facultatif. Indique la requête SQL qui retourne les données à fusionner.
Le tableau ci-dessous indique les valeurs possibles selon le type de source de données.

Liaison entre le bloc et les enregistrements :

La méthode MergeBlock() recherche le bloc TBS avec le nom spécifié dans votre modèle. Puis, le bloc TBS est répété autant de fois qu'il y a d'enregistrement dans la source de données.
Pour afficher les données d'un enregistrement, vous devez utiliser un champ TBS lié. Un champ TBS est lié lorsque son nom est composé du nom du bloc, suivi d'un point et du nom d'une colonne ou d'une clé du jeu d'enregistrements. Un champ lié doit se trouver à l'intérieur du bloc.

Exemple :
Nom du bloc : bloc1
Colonnes retournées par la requête : champ1,champ2,champ3
Champs TBS liés : [bloc1.champ1], [bloc1.champ2], [bloc1.champ3]

Si aucune définition de bloc n'est trouvée dans le modèle, La méthode MergeBlock() fusionnera le premier enregistrement avec tous les champs liés trouvés dans le modèle.

Vous pouvez définir des blocs plus évolués. Pour plus d'information, consultez la rubrique Blocs TBS.

Fusionner plusieurs blocs avec les mêmes données :

Vous pouvez fusionner plusieurs blocs avec les mêmes données en indiquant leurs noms séparés par des virgules dans l'argument NomBloc. Dans ce cas, la requête n'est ouverte qu'une seule fois et les enregistrements sont mis dans un cache afin de remplir les blocs.
Exemple : $TBS->MergeBlock('bloc1,bloc2,bloc3','mysql','SELECT * FROM MaTable');

Vous ne pouvez pas fusionner plusieurs blocs ayant le même nom parce qu'ils sont considérés par TBS comme un seul et même bloc composé de plusieurs sections. Néanmoins, vous pouvez utiliser une astuce pour obtenir un résultat similaire. Si vous utilisez le paramètre p1 sans valeur dans une définition de bloc, cela force TBS à considérer la section comme une rupture de nouveau bloc, comme il le fait pour les sous-blocs.
Exemple :
Id Nom
[b.id;block=tr;p1] [b.nom]
Id Nom
[b.id;block=tr;p1] [b.nom]

$TBS->MergeBlock('b','mysql','SELECT * FROM MaTable');
Historique: cette astuce existe depuis TBS version 3.4.

Retourner l'ensemble des enregistrements fusionnés :

Dans certains cas, il vous sera peut être pratique de récupérer l'ensemble des enregistrements fusionnés après la fusion. Pour cela, il suffit d'ajouter le mot-clé '*' dans la liste des noms de bloc. Utilisez cette fonctionnalité avec parcimonie car elle conserve les données fusionnées en mémoire ce qui consomme plus ressource.
Exemple : $data = $TBS->MergeBlock('bloc1,*','mysql','SELECT * FROM MaTable');

Décompte des enregistrements :


Pour afficher le numéro d'enregistrement dans le modèle, utilisez un champ TBS lié à la colonne virtuelle '#'. Si vous placez ce champ en dehors du bloc, il affichera le nombre total d'enregistrements.
Exemple : [bloc1.#]

La colonne virtuelle '$' permet d'afficher la clé de l'enregistrement en cours lorsque la source de données est un tableau Php (array).
Exemple: [bloc1.$]

Utilisation des arguments Source et Requête selon le type de source de données :

Type de source de données Source Requête
Assigné (*) Le mot-clé 'assigned', ou omis -
Texte (*) Le mot-clé 'text' Un texte
Nombre (*) Le mot-clé 'num' Un nombre
ou un tableau spécial (voir plus bas)
Vide (*) Le mot-clé 'clear' -
Conditionnel (*) Le mot-clé 'cond' -
Tableau PHP (*) Un tableau Php -
Le mot-clé 'array' Un tableau Php
Le mot-clé 'array' Une chaîne texte qui représente un tableau contenu ou encapsulé dans une variable PHP globale (voir ci-après)
PHP ArrayObject Un object PHP.
Supportés en natif depuis TBS version 3.5.0.
-
PHP Iterator
PHP IteratorAggregate
MySQL Une ressource de connexion MySql ou le mot-clé 'mysql' Une requête SQL
Une ressource de résultat MySql -
PostgreSQL Une ressource de connexion PostgreSql Une requête SQL
Une ressource de résultat PostgreSql -
SQLite Une ressource de connexion SQLite Une requête SQLite
Une ressource de résultat SQLite -
Personnalisé
Un mot-clé, un objet ou une ressource non listé dans ce tableau.
Voir le paragraphe 'plug-ins de base de données'.
Une requête SQL ou autre chose.
(*) Voir explications dans la rubrique ci-après.

Source de données Php :

Assigné
L'argument Source doit être le mot-clé 'assigned' ou doit être omis.
Le bloc est fusionné avec les arguments définis dans la propriété Assigned.
Exemple : $TBS->MergeBlock('b1');
Historique : le mot clé 'assigned' est supporté depuis TBS version 3.5.

Texte
L'argument Source doit être égal à 'text'.
Tout le bloc est remplacé par le texte contenu dans la paramètre Requête. Les champs liés ne sont pas gérés sauf '#' qui retourne 1, ou 0 si Requête est une chaîne vide.
Exemple : $TBS->MergeBlock('b1','text','Bonjour, comment allez-vous ?');

Nombre
L'argument Source doit être égal à 'num'.
L'argument Requête peut être soit un nombre, soit un tableau.

arg Requête Jeu d'enregistrements retourné
Nombre : Ce nombre doit être supérieur ou égale à zéro. Le jeu d'enregistrement retourné est composé d'une colonne 'val' dont la valeur va de 1 à ce nombre.
Tableau : Ce tableau doit contenir une clé 'min' et une clé 'max' et éventuellement une clé 'step'.
Le jeu d'enregistrement retourné est composé d'une colonne 'val' qui va de la valeur de 'min' à la valeur de 'max'.
Exemples :
$TBS->MergeBlock('b1','num',12);
$TBS->MergeBlock('b2','num',array('min'=>20,'max'=>30));
$TBS->MergeBlock('b3','num',array('min'=>10,'max'=>20,'step'=>2));

Vide
L'argument Source doit être le mot-clé 'clear'.
Tous les blocs et leurs sections sont supprimés. C'est la même chose que fusionner avec un tableau vide.
Exemple : $TBS->MergeBlock('b1','clear');

Conditionnel
L'argument Source doit être le mot-clé 'cond'.
Le bloc est fusionné comme si c'était un bloc conditionnel onload et onshow. Le bloc n'est pas fusionné avec des données et donc il ne doit pas avoir de champ TBS lié. Chaque section de bloc doit avoir un paramètre when ou un paramètre default. Voir bloc conditionnel pour plus de détails.
Exemple : $TBS->MergeBlock('bz','cond');

Tableau
L'argument Source doit être un tableau Php (type Array), ou le mot-clé 'array'. Si le mot-clé 'array' est utilisé, alors l'argument Requête doit être un tableau Php ou une chaîne texte qui représente tableau contenu ou encapsulé par une variable Php globale.

Syntaxe de la chaîne : 'globvar[item1][item2]...'
'globvar' est le nom d'un variable globale $globvar qui doit être un tableau.
'item1' et 'item2' sont des clés d'un item ou d'un sous item de $globvar.
Exemple:
$TBS->MergeBlock('bloc1','array','jours[lun]');
Cela va fusionner 'block1' avec $jours['lun'] qui est supposé être un tableau.
Il est possible de représenter un nom de variable sans item.
Exemple:
$TBS->MergeBlock('bloc1','array','jours');

Il y a deux avantages à utiliser une chaîne pour représenter le tableau :
-> Les items seront lus directement dans le tableau (assigné par référence) au lieu de lire une copie des items. Cela peut améliorer les performances.
-> Vous pouvez utiliser des requêtes dynamiques.

Afficher la clé de l'enregistrement en cours :
Vous pouvez utiliser la colonne virtuelle '$' qui affiche la clé de l'enregistrement en cours. Cela peut être particulièrement utile pour les sous-blocs avec requêtes dynamiques.
Exemple: [bloc1.$]

Structure des tableaux supportés :

Les items du tableau spécifié peuvent être de deux types : des valeurs simples avec des clés associées (cas 1), ou des valeurs tableaux dont les items sont eux-mêmes des valeurs simples avec des clés associées (cas 2).

Cas 1 :
Exemple : ['clé1']=>valeur1
['clé2']=>valeur2
...
Le jeu d'enregistrement retourné est composé d'une colonne 'key' contenant le nom de la clé, et d'une colonne 'val' contenant la valeur de la clé.

Cas 2 :
Exemple : [0] => (['colonne1']=>valeur1-0 ; ['colonne2']=>valeur2-0 ; ...)
[1] => (['colonne1']=>valeur1-1 ; ['colonne2']=>valeur2-1 ; ...)
[2] => (['colonne1']=>valeur1-2 ; ['colonne2']=>valeur2-2 ; ...)
...
Le jeu d'enregistrement retourné est composé des colonnes 'colonne1', 'colonne2', ... avec leurs valeurs associées.
Méthode Show() :
Termine la fusion.

Syntaxe : $TBS->Show({int Render})

La méthode Show() exécute les actions suivantes :
- fusion des champs [var] (par compatibilité avec les versions antérieures à 3.2.0),
- fusion des champs et blocs [onshow],
- affiche le résultat (cette action peut être annulée par la propriété ou l'argument Render),
- termine le script (cette action peut être annulée par la propriété ou l'argument Render).

La propriété et l'argument Render permettent de régler le comportement de la méthode Show().
Consultez la propriété Render pour plus d'information.
Méthode GetBlockSource() :
Retourne le source d'un bloc TBS dans le modèle.
Si aucun bloc n'est trouvé, la méthode retourne la valeur False.

Syntaxe : string $TBS->GetBlockSource(string NomBloc {, boolean EnTableau}{, boolean BalisesDef}{, mix RemplacePar})

Argument Description
NomBloc Nom du bloc à rechercher.
EnTableau Facultatif. La valeur par défaut est False. Si ce paramètre est à True, la méthode retourne le surce du bloc sous forme de tableau PHP au lieu d'une chaîne texte. Si le résultat est un tableau, alors chaque section est sauvée comme un item. Le premier item a l'index 1.
BalisesDef Facultatif. La valeur par défaut est True. Par défaut, la méthode GetBlockSource() retourne le source du bloc avec ses balises de définition. Si vous souhaitez que ces balises soient retirées, forcez l'argument BalisesDef à False. Si le bloc est défini avec une syntaxe simplifiée alors les balises de définition de bloc ne seront de toute façon pas supprimées car elles sont aussi des balises de champ.
Historique : cet argument est supporté depuis TBS version 3.0.
RemplacePar Facultatif. la valeur par défaut est False. Si cet argument est une chaîne alors le source du bloc est remplacée par celle-ci dans le modèle. Vous pouvez utiliser RemplacePar = '' (chaîne vide) pour supprimer le source du bloc dans el modèle.
Historique : cet argument est supporté depuis TBS version 3.05.

Cette méthode permet de récupérer le source d'un bloc afin de gérer manuellement sa fusion. Si par la suite vous souhaitez remplacer le bloc par du texte, vous pouvez utiliser ma méthode MergeBlock() avec le paramètre 'text'.
Historique : Depuis TBS 3.05 si EnTableau est False alors la méthode retourne le bloc avec toutes ses sections ; avant TBS 3.05 elle retourne uniquement la première section. Depuis TBS 3.05 si EnTableau est True et que le bloc n'est pas trouvé alors la méthode retourne False ; avant TBS 3.05 elle retourne un tableau vide.
Méthode MergeField() :
Fusionne un ou plusieurs champs TBS avec une valeur fixe ou en appelant une fonction utilisateur.
Depuis TBS version 3.0, il est aussi possible d'indiquer une méthode de classe (voir POO).
Tous les champs du modèle ayant le nom de base indiqué seront fusionnés.
Il est aussi possible de fusionner les champs spéciaux [onload], [onshow] et [var] (voir plus bas).

Syntaxe : $TBS->MergeField(string NomBase, mixed X {, boolean ModeFonction}{, array PrmParDefaut})

Argument Description
NomBase Le nom de base des champs TBS. Par exemple 'compte'.
X La valeur à afficher (ou une chaîne représentant le nom d'une fonction utilisateur si l'argument ModeFonction est à true).
ModeFonction

Indique que la valeur à afficher est calculée par une fonction utilisateur. La valeur par défaut est false. Si cet argument est à true, alors X doit être une chaîne texte donnant le nom de la fonction utilisateur. Cette fonction doit exister et avoir la syntaxe décrite ci-après.

PrmParDefaut

Liste des paramètres à appliquer par défaut aux champs fusionnés. Les paramètres doivent être donnés sous forme d'un tableau PHP associatif. Si un paramètre est défini à la fois dans l'argument PrmParDefaut et dans le champ, c'est le paramètre du champ qui sera pris en compte.
Cet argument est supportés depuis TBS version 3.5.0.


Fusion avec une valeur :

X peut être un numérique, une chaîne, un tableau ou un objet. Pour un tableau ou un objet, les noms de champs TBS doivent avoir des suffixes comme pour les champs automatiques ([onload] et [onshow]).

Exemple :
$TBS->MergeField('compte',array('id'=>55,'nom'=>'Bob'));
Dans cet exemple, les champs [compte.id] et [compte.nom] seront fusionnés.

Fusion avec une fonction utilisateur :

TBS appelle une fonction utilisateur pour chaque champ trouvé dans le modèle.
Cette fonction doit avoir la syntaxe suivante:
function fct_utilisateur($Subname [, $PrmLst]) {...}
Lors de l'appel à la fonction, son argument $Subname a pour valeur le suffixe du nom du champ (par exemple pour un champ nommé 'ml.titre', $Subname aura pour valeur 'titre'). Et l'argument optionnel $PrmLst contient un tableau associatif avec les paramètres du champ. La fonction doit retourner la valeur à fusionner.

Exemple :
$TBS->MergeField('ml','m_multilangue',true);
...
function m_multilangue($Subname) {
  global $langue_id;
  $rs = mysql_query("SELECT texte_$langue_id AS txt FROM t_langue WHERE cle='$Subname");
  $rec = mysql_fetch_array($rs);
  return $rec['txt'] ;
}
Dans cet exemple, un champ tel que [ml.titre] sera fusionné avec la valeur retournée par m_multilangue('titre').

Fusion de champs et blocs automatiques :


Vous pouvez vous servir de la méthode MergeField() pour forcer la fusion des champs et blocs automatiques ([onload] et [onshow]). Mais dans ce cas, seul le premier argument doit être indiqué.
Exemple : $TBS->MergeField('var');
Historique : la fusion des champs spéciaux est supportée depuis TBS version 3.0. Elle remplace l'ancienne méthode MergeSpecial() qui n'est plus supportée.

Méthode PlugIn() :
Permet d'appeler une commande d'un plug-in TBS ou d'installer un plug-in TBS.

Syntaxe : mixed $TBS->PlugIn(mixed arg1, mixed arg2, ...)

Rappel : pour que votre plug-in TBS fonctionne, sont script PHP doit préalablement être inséré dans votre application.
Exemple : include_once('tbs_plugin_xxx.php');
De plus, chaque plug-in TBS doit avoir une clé comme expliqué au chapitre Plug-ins.

Appeler une commande d'un plug-in :
Utilisez la clé du plug-in comme argument principal. Les arguments suivants sont propres au plug-in appelé.
Exemple :
$TBS->PlugIn(TBS_XXX,$arg1,arg2);
Dans cet exemple, le plug-in identifié par la clé TBS_XXX est invoqué.
Remarque : lorsque vous vous appelez une commande d'un plug-in pour la première fois, ce plug-in est installé automatiquement sur l'instance TBS ($TBS).

Installer un plug-in :
Bien que certains plug-in soient installés automatiquement, dans d'autres cas il peut être utile de faire une installation manuelle. Pour cela on utilise la constante TBS_INSTALL avec la clé du plug-in .
Exemple :

$TBS->PlugIn(TBS_INSTALL,TBS_XXX);
Dans cet exemple, le plug-in identifié par la clé TBS_XXX est installé.
Remarques :
* Un plug-in est installé relativement à une instance de TBS (une variable $TBS par exemple ). Si vous utilisez une deuxième instance de TBS (par exemple $TBS2) alors il vous faudra aussi installer le plug-in sur cette instance.
* Un plug-ins est installé automatiquement lors que vous appelez une de ses commandes à l'aide de la méthode PlugIn() (voir plus haut).


Historique : la méthode PlugIn() est supportée depuis TBS version 3.0.
Propriété Assigned :
Permet de définir les informations pour une fusion ultérieure qui peut être automatique ou manuelle.

Syntaxe : array $TBS->Assigned

La propriété Assigned est un tableau PHP définie par l'utilisateur. On y enregistre les arguments des méthodes MergeBlock() ou MergeField(). Les arguments doivent être enregistrés dans un tableau PHP avec des clés numériques et ordonnées en suivant la syntaxe de ces méthodes. Il est possible d'utiliser des clés chaines optionnelles pour définir certains comportements :
Clé optionnelle Description
'type'=>'mergeblock' Indique qu'il s'agit d'arguments pour la méthode MergeBlock(). Cette clé est facultative puisque c'est le comportement par défaut.
'type'=>'mergefield' Indique qu'il s'agit d'arguments pour la méthode MergeField().
'auto'=>'onload' Indique que la fusion doit être lancée automatiquement après les balises [onload].
'auto'=>'onshow' Indique que la fusion doit être lancée automatiquement après les balises [onshow].
'merged'=>0 Cette clé est ajoutée automatiquement par TBS lors de la fusion. Elle compte le nombre de fois où cette entrée a été fusionnée.

Exemple de fusion manuelle :
$TBS->Assigned['b'] = array('b1,b2', &$cnx_id, 'SELECT id, nom FROM table1');
...
$TBS->MergeBlock('b'); // fusionne les blocks b1 et b2 avec la requête SQL

Exemple de fusion automatique :
$TBS->Assigned['b'] = array('b1,b2', &$cnx_id, 'SELECT id, nom FROM table1', 'auto'=>'onload');

Exemple de fusion de champs :
$TBS->Assigned['f1'] = array('f1', $data, 'type'=>'mergefield');
...
$TBS->MergeField('f1'); // fusionne le ou les champs f1 avec le tableau $data

Remarques :
- Pour fusionner un bloc ou un champ déjà assigné, il suffit d'appeler la méthode correspondante avec seulement le nom de la clé assignée. Vous pouvez ajouter l'argument Source = 'assigned', mais cela est facultatif car il s'agit de la valeur par défaut. En d'autres termes, $TBS->MergeBlock('b') équivaut à $TBS->MergeBlock('b', 'assigned').
- Une assignation avec 'auto'=>'onload' ne serra bien sûr fusionnée que si elle est définie avant d'appeler méthode LoadTemplate().
- Vous pouvez passer des arguments par référence dans vos assignations. C'est particulièrement utile pour PHP 4 qui passe les objets en copie par défaut.


Historique : la propriété Assigned est supportée depuis TBS version 3.5.
Propriété NoErr :
Permet d'empêcher l'affichage de tous les messages d'erreur TinyButStrong pour les opérations qui suivent. Par défaut la valeur est à false. Les erreurs qui n'ont pas été affichées peuvent toutefois être restituées avec le champ spécial [onshow..error_msg]. De plus vous pouvez contrôler la présence d'erreur grâce à la propriété ErrCount qui compte les erreurs TBS indépendanement de NoErr.

Syntaxe : boolean $TBS->NoErr

Exemple : $TBS->NoErr = true; // plus aucun message d'erreur ne s'affiche.

La propriété NoErr est pratique dans deux cas :
- Pour les sites professionnels mis en production pour lesquels aucun message d'erreur ne doit être affiché. Attention car vous n'avez plus aucune indication sur le bon déroulement de votre fusion. Il est souvent plus judicieux d'utiliser le paramètre noerr qui permet d'annuler des messages sur une balise TBS bien précise.
- Pour les fusions qui n'acceptent pas les messages d'erreur basic de TinuButStrong. Par exemple un document OpenOffice ne pourra pas s'ouvrir correctement si une erreur TBS survient. Utilisez $TBS->NoErr=true et le champ [onshow..error_msg] pour afficher les erreurs TBS dans un emplacement lisible de votre document OpenOffice.

Historique :
- La propriété NoErr est supportée depuis TBS version 3.0.
- Le champ spécial [onshow..error_msg] est supporté depuis TBS version 3.5.0.
Propriété Render :
Détermine comment doit se terminer la fusion.
Sa valeur doit être une combinaison des constantes du tableau ci-dessous.
Par défaut, sa valeur est (TBS_OUTPUT + TBS_EXIT).

Syntaxe : int $TBS->Render

La propriété Render influe sur le comportement de la méthode Show().

Constante Description
TBS_NOTHING Indique qu'aucune action ci-dessous n'est effectuée à la fin de la fusion.
TBS_OUTPUT Indique que le résultat de la fusion doit être affiché. (utilisation de la commande PHP Echo)
TBS_EXIT Indique qu'on doit quitter le script juste après la fin de la fusion.
Propriété Source :
Cette propriété contient le source du modèle en cours de fusion. Elle est en lecture/écriture.
Lorsque TinyButStrong opère une fusion (en utilisant la méthode MergeBlock() par exemple), la propriété Source est modifiée immédiatement.

Syntaxe : string $TBS->Source

Remarques :
- La méthode LoadTemplate() charge un fichier dans la propriété Source et fusionne automatiquement les balises [onload]. Il se peut donc que Source soit un peu différent du modèle initial après LoadTemplate().
- La méthode Show() fusionne automatiquement les balises [onshow] avant d'afficher le résultat.

Pour charger un modèle contenue dans une variable Php, vous pouvez coder :
$TBS->Source = $mon_modele;
$TBS->LoadTemplate(null); // lance les plugins s'il y en a, et fusionne les balises [onload] s'il y en a

Pour récupérer le résultat à la fin d'une fusion, vous pouvez coder :
$TBS->Show(TBS_NOTHING); // termine la fusion sans quitter ni afficher le résultat
$resultat = $TBS->Source;
Propriété TplVars :
Contient le tableau des variables de modèle correspondant au modèle en cours.

Syntaxe : array $TBS->TplVars

Vous pouvez définir des variables de modèle en utilisant un ou des champs automatiques onload avec le paramètre tplvars. Tous les paramètres qui suivent le paramètre tplvars sont ajoutés à la propriété TplVars quand la méthode LoadTemplate() est appelée.
Exemple :
  [onload;tplvars;template_version='1.12.27';template_date='2004-10-26']
Cette balise TBS va créer deux items équivalents au code PHP suivant :
 $TBS->TplVars['template_version'] = '1.12.27';
 $TBS->TplVars['template_date'] = '2004-10-26';
Remarques :
- Le paramètre tplvars ne fonctionne qu'avec les champs automatiques onload.
- Vous pouvez utiliser le paramètre tplvars plusieurs fois dans le même modèle.
Programmation Orientée Objet (POO):
TinyButStrong intègre une technique pour faire appel à des méthodes ou des propriétés d'objets que vous avez codés du côté PHP.

Appels à des méthodes de classe sans objet crées :
Les fonctionnalités TBS suivantes supportent l'appel à des méthodes de classe sans objet crées.
Fonctionnalité Exemple
Paramètre ondata [blk1.colonne1;block=tr;ondata=MaClasse.methA]
Paramètre onformat [blk1.colonne2;onformat=MaClasse.methB]
Méthode LoadTemplate() $TBS->LoadTemplate('monmodele.htm','=MaClasse.methC');
Méthode MergeField() $TBS->MergeField('nomchamp','MaClasse.methD',true);
Remarque : Les méthodes appelées par cette technique doivent respecter la syntaxe de fonction attendue par la fonctionnalité (voir description de la fonctionnalité correspondante).

Appels à des objets crées :

TBS possède une propriété ObjectRef qui est à false par défaut, et dont vous pouvez vous servir pour référencer vos objets déjà crées. Vous pouvez référencer un objet directement sur la propriété ObjectRef, ou bien vous pouvez en référencer plusieurs à l'aide de tableaux PHP.
Exemple :
$TBS->ObjectRef =& $MonObjet1;
   Vous pouvez utiliser un tableau si vous avez plusieurs objets à référencer :
$TBS->ObjectRef['item1'] =& $MonObjet1;
$TBS->ObjectRef['item2'] =& $MonObjet2;
   Vous pouvez utilisez autant de niveau que vous le souhaitez :
$TBS->ObjectRef['item3']['a'][0] =& $MonObjet3;
Remarques :
* Pensez à utiliser l'assignation par référence à l'aide de "=&" au lieu de "=", sinon une copie de l'objet sera créée.
* Une fois un objet référencé sous ObjectRef, ses sous-objets seront aussi accessibles par la syntaxe TBS.

• Utilisation d'ObjectRef dans les champs automatiques :
Utilisez le symbole '~' pour appeler ce qui est référencé sous ObjectRef.
Par exemple (valables aussi bien pour [onload], [onshow] et [var]):
Le champ   Ferra appel à
[onshow.~propA]   $TBS->ObjectRef->propA
[onshow.~propA.propB]   $TBS->ObjectRef->propA->propB
[onshow.~item2.propA]   $TBS->ObjectRef['item2']->propA
[onshow.~item2.methX]   $TBS->ObjectRef['item2']->methX()
[onshow.~item2.methY(a,b)]   $TBS->ObjectRef['item2']->methY('a','b')
Remarques :
TBS opère un contrôle de cohérence, il déterminera de lui même si votre définition de champ automatique fait appel à ObjectRef via un item d'un tableau, une propriété d'objet ou une méthode d'objet. Dans tous les cas, faites bien attention à ce que votre champ automatique doit au final retourner une valeur et non pas un objet.

• Utilisation d'ObjectRef dans d'autres fonctionnalités TBS :
Les fonctionnalités TBS suivantes supportent l'appel à des méthodes d'objets référencés sous ObjectRef.
Fonctionnalité Exemple
Paramètre ondata [blk1.colonne1;block=tr;ondata=~item1.methA]
Paramètre onformat [blk1.colonne2;onformat=~item1.methB]
Méthode LoadTemplate() $TBS->LoadTemplate('monmodele.htm','=~item1.methC');
Méthode MergeField() $TBS->MergeField('nomchamp','~item1.methD',true);
Méthode MergeBlock() $TBS->MergeBlock('blk1','~madb','SELECT * FROM t_table');
Remarque : Les méthodes appelées par cette technique doivent respecter la syntaxe de fonction attendue par la fonctionnalité (voir description de la fonctionnalité correspondante).


Coté modèle :
Vous concevez votre modèle en plaçant des balises TBS aux endroits où doivent figurer les données.

Il existe deux types de balises TBS : les champs et les blocs.

Un champ TBS est une balise TBS qui doit être remplacé par une donnée simple. Il est possible de spécifier un format d'affichage ainsi que d'autres paramètres. La syntaxe des champs TBS est décrite ci-après.

Un bloc TBS est une région qui devra être répétée. Il est défini par une ou deux balises TBS.
Le plus souvent il s'agit d'une ligne d'un tableau HTML. La syntaxe des blocs TBS est décrite ci-après.


Les champs TBS :
Un champ TBS est une balise TBS qui doit être remplacé par une donnée simple.
Un champ TBS doit avoir un nom pour l'identifier (qui n'est pas obligatoirement unique) et il peut avoir des paramètres pour modifier la valeur affichée.

Syntaxe : MODÈLE ... [NomChamp{;param1}{;param2}{;param3}{...}] ... MODÈLE

Élément Description
NomChamp Le nom du champ.
Attention : les noms de champs commençant par onload, onshow et var. sont réservés pour les champs automatiques.
param1 Facultatif. Un ou plusieurs paramètres de la liste ci-dessous, séparés par des ';'.
Certains paramètres peuvent être affectés d'une valeur en utilisant le caractère '='.
Exemple : frm=0.00
Si la valeur du paramètre contient des espaces, des points-virgules ou des guillemets, alors vous pouvez utiliser les guillemets simples comme délimiteurs.
Exemple : frm='0 000.00'
Utilisez deux guillemets simples pour définir un caractère guillemet dans une chaîne délimitée.
Exemple : ifempty='coucou c''est moi'

Un paramètre peut contenir un champ TBS imbriqué mais uniquement dans certaines circonstances :
- le champ imbriqué soit fusionné avant le champ parent,
- le champ imbriqué est un champ [var] placé dans un paramètre file, script, if, then, else ou when.
Dans les autres cas, le champ TBS imbriqué ne sera pas fusionné et sera interprété tel quel comme du texte.
Exemples :
[x;htmlconv=[var.y]] : [var.y] ne sera pas fusionné et le paramètre "htmlconv" aura une valeur non valide.
[x;if [var.y]=1] : [var.y] sera correctement fusionné et la condition "if" sera correctement évaluée.

Paramètres des champs :

Paramètre Description
htmlconv=val Permet de modifier la conversion des caractères spéciaux pour ce champ TBS uniquement. Notez que la conversion de caractères spéciaux utilisée par défaut pour tous les champs TBS est celle définie par la méthode LoadTemplate(). Elle correspond souvent à un charset Xml/Html, mais pas nécessairement.
La valeur val peut être l'un des mots-clés suivants :
yes : (valeur par défaut) Applique la conversion des caractères spéciaux par défaut, y compris les sauts de ligne.
no : Annule la conversion des caractères spéciaux. Utile pour modifier le source Xml/Html.
nobr : Laisse la conversion des caractères spéciaux mais sans les sauts de ligne (utile pour la balise <pre> par exemple).
wsp : Préserve les espaces blancs (utile pour les espaces de début de ligne).
esc : Annule la conversion des caractères spéciaux et double les caractères guillemets simples (').
js : Convertie la donnée en une chaîne qui peut être insérée entre des délimiteurs texte JavaScript
look : Déprécié. Applique la conversion des caractères spéciaux par défaut uniquement si aucune balise Xml/Html n'est trouvée dans cette donnée.
Vous pouvez spécifier plusieurs mots-clés en utilisant le séparateur '+'. Exemple : htmlconv=yes+js
. (point) Si la donnée est vide, on affiche un espace Html insécable. Utile pour les cellules d'un tableau.
ifempty=val Si la donnée est vide, on la remplace par la valeur indiquée.
att=chemin Déplace le champ en cours dans un attribut d'une balise XML/HTML avant d'être fusionné. Ce paramètre est très utile quand il est trop difficile pour le concepteur du modèle de placer un champ TBS dans un attribut.
La valeur chemin doit indiquer l'emplacement de l'attribut relativement au champ en cours.
Si l'attribut n'existe pas dans la balise spécifiée, alors il est crée.
Si l'attribut existe déjà dans la balise spécifiée et qu'il a déjà une valeur, alors le champ remplace toute la valeur en cours.
Vous pouvez choisir de placer le champ en tant que valeur ajoutée grâce au paramètre attadd.
Vous pouvez supprimer l'attribut en cas de valeur vide grâce au paramètre magnet=#.

Syntaxe pour la valeur chemin : [+][balise1+balise2+balise3+...#]attribut
Par défaut, l'attribut est recherché avant le champ en cours. Mais si '+' est le premier caractère du chemin alors il est cherché après. Si aucune liste de balise n'est spécifiée alors l'attribut est regardé dans la première balise rencontrée dans la direction de la recherche. Si une liste de balise est utilisée, balise1 est recherché en premier, puis balise2, ... indépendamment du sens de la recherche (avant/après). Vous pouvez placer un nom de balise entre un ou plusieurs niveaux de parenthèses afin de spécifier que la balise recherchée doit encapsuler le champ en cours.

Exemples :
[onshow.x;att=class] se déplace dans l' attribut 'class' de la première balise placée avant.
[onshow.x;att=div#class] se déplace dans l' attribut 'class' du premier <div> placé avant.
[onshow.x;att=+div#class] se déplace dans l' attribut 'class' du premier <div> placé après.
[onshow.x;att=((div))#class] se déplace dans l' attribut 'class' du second <div> encapsulant placé avant.
[onshow.x;att=table+div#class] se déplace dans l' attribut 'class' du premier <div> après le premier <table> placé avant.

Remarques :
- La méthode MergeBlock() ne peut pas déplacer un champ TBS par dessus un autre champ TBS placé après lui. Cela produit une erreur TBS.
- Quand un attribut n'aucune valeur avant que le champ ne soit déplacé, alors TBS choisoi quel délimiteur de chaine il doit utiliser en fonction des autres attributs (XML/HTML accepte (") et (')). Vous pouvez forcer le délimiteur que vous voulez à l'aide de la propriété $TBS->AttDelim.

Historique: Le paramètre att est supporté depuis TBS version 3.5.0
attadd S'utilise avec la paramètre att. Indique que le champ s'ajoute à la valeur de l'attribut au lieu remplacer la valeur de l'attribut.
Historique: Le paramètre attadd est supporté depuis TBS version 3.5.0
magnet=tag
ou
magnet=expr
Assigne une balise XML/HTML magnétique à un champ TBS. Une balise magnétique est gardée telle quelle quand le champ à une valeur, et elle est supprimée quand le champ est null ou chaîne vide. Le paramètre magnet a la même syntaxe que le paramètre block, c'est à dire que expr doit être une balise XML/HTML ou une expression de bloc étendu.
Exemple :
(<a href="[onshow.lien;magnet=a]">cliquez ici</a>)
Résultat pour $lien='www.tbs.com': (<a href="www.tbs.com">cliquez ici</a>)
Résultat pour $lien='': ()
Par défaut, la balise XML/HTML magnétique doit être un couple de balises ouvrante-fermante (comme <a></a>) dont la première balise est placée avant le champ TBS. Mais cela peut être changé en utilisant le paramètre mtype (voir ci-après).
Depuis TBS version 3.3.0, les paramètres ope=nif:x et ope=minv peuvent améliorer l'utilisation du paramètre magnet.
Remarque : les paramètres if then else sont traités avant le paramètre magnet.
mtype=val S'utilise avec la paramètre magnet. Définit le comportement de la balise magnétique.

Valeur Comportement magnétique lorsque le champ est nul ou chaîne vide
m*m C'est la valeur par défaut. Supprime le couple de balises qui entoure le champ TBS. Tout ce qui se trouve entre ces balises est aussi supprimé. Il est possible de placer le champ TBS à l'intérieur de l'une des balises.
Exemple :
(<a href="[onshow.lien;magnet=a]">cliquez ici</a>)
Résultat pour $lien='www.tbs.com': (<a href="www.tbs.com">cliquez ici</a>)
Resultat pour $lien='': ()
m+m Supprime le couple de balises qui entoure le champ TBS, mais conserve ce qui est entre les balises.
Exemple :
(<a href="mailto:[blk.email;magnet=a;mtype=m+m]">[blk.nom]</a>)
Résultat pour $email='moi@tbs.com': (<a href="mailto:moi@tbs.com">MonNom</a>)
Résultat pour $email='': (MyName)
m* Supprime la balise simple qui se trouve avant le champ TBS, ainsi que tout de qui se trouve entre la balise et le champ.
Exemple 1: <img href="[onshow.link;magnet=img;mtype=m*]">
Exemple 2: <br> [onshow.address;magnet=br]
*m Supprime la balise simple qui se trouve après le champ TBS, ainsi que tout de qui se trouve entre la balise et le champ.
Exemple : [onshow.address;magnet=br;mtype=*m]<br>
comm Étendre les limites du champ TBS jusqu'aux limites de la balise commentaire Html qui l'entoure, ou bien jusqu'aux limites d'un autre couple de balise XML/HTML.
Exemple :
xxx <!-- [mochamp;comm] des commentaires ici --> yyy
ou
xxx <div> [monchamp;comm=div] des commentaires ici </div> yyy
sont strictement identiques à :
xxx [monchamp] yyy
Ce paramètre particulièrement pratique pour l'élaboration du modèle avec un éditeur HTML visuel (tel que Dreamweaver ou FrontPage).
Historique : Le support pour les autres balise XML/HTML a été ajouté à TBS 3.0.
noerr Empêche l'affichage de certains messages d'erreurs TBS. Quand un message peut être annulé, cela est mentionné dans le message.
file=nomfichier Remplace le champ par le contenu du fichier. Nomfichier peut être une chaîne fixe ou une expression.
Vous pouvez utiliser le mot-clé [val] dans l'expression pour insérer la valeur du champ en cours.
Vous pouvez utiliser des champs [var] dans l'expression.
Exemples :
[onload;file=entete.html]
[onload;file=[var.fichier]]
Si le fichier n'est pas trouvé il sera aussi recherché dans le répertoire du dernier modèle chargé (depuis TBS version 3.2.0).
Si nomfichier est une chaîne vide, alors aucun message d'erreur n'est affiché, c'est comme si le paramètre file est ignoré. Cela peut être utilisé pour gérer l'insertion conditionnelle de fichier.
Exemple :
[onload;file=[var.insertion;if [val]=1;then 'entete.html';else '']]
Vous trouverez plus de détails sur ce paramètre la rubrique Sous-modèles.
Voir aussi : getbody script
getbody=listebalise S'utilise avec le paramètre file ou script. Indique qu'on ne charge pas le fichier entièrement mais seulement certaines parties XML/HTML définie par la liste de balises. Les balises de la liste doivent être séparées par des plus (+), et placées entre parenthèses si vous voulez que les balises elles-mêmes soient récupérées avec leur contenu. Si le fichier contient plusieurs patries XML/HTML, alors toutes ces parties seront automatiquement concaténées. Si le paramètre getbody est utilisé sans valeur, alors la balise <body> est prise par défaut.
Exemple :
[onload;file=entete.htm;getbody=(script)+(style)+body]

Historique : le paramètre getbody est supporté depuis TBS version 3.0. Dans les versions précédentes, il était opéré automatiquement lors de l'utilisation du paramètre file. Maintenant il devient explicite.
La liste de balise est supportée depuis TBS version 3.5.0. Avant cette version, la valeur de getbody ne peut être qu'une balise unique sans parenthèses.
script=nomfichier Exécute le script PHP juste avant le remplacement du champ.
Nomfichier peut être une chaîne fixe ou une expression.
Vous pouvez utiliser le mot-clé [val] dans l'expression pour insérer la valeur du champ en cours.
Vous pouvez utiliser des champs [var] dans l'expression.
Si le fichier n'est pas trouvé il sera aussi recherché dans le répertoire du dernier modèle chargé (depuis TBS version 3.2.0).
* Tenez compte du fait que dans votre script les variables PHP seront forcément locales au lieu de globales. Cela est dû à ce que le script est appelé depuis une méthode de TBS. Pour atteindre ou définir une variable globale dans votre script, vous devez utiliser l'instruction Php global ou le tableau $GLOBAL.
* TBS met à disposition des variables locales prédéfinies que vous pouvez utiliser dans votre script :
- $CurrVal se réfère à la valeur du champ en cours. Elle peut être modifiée.
- $CurrPrm se réfère au tableau de paramètre du champ en cours.
- $this se réfère à l'instance en cours de TBS. (Voir le paramètre subtpl pour un bon usage)
* Le paramètre script est sensible au paramètre if. Si le champ possède un paramètre if, alors le script n'est exécuté que si la condition est vérifiée.
Voir le chapitre Sous-modèles pour plus d'information sur l'utilisation de ce paramètre en mode sous-modèle.
subtpl S'utilise avec le paramètre script ou onformat.
Active le mode sous-modèle pendant l'exécution du script ou de la fonction.
Voir le chapitre Sous-modèles pour plus d'information.
if exp1=exp2 Affiche la donnée si la condition est vérifiée, sinon n'affiche rien à moins que les paramètres then ou else soient utilisés.
Les opérateurs supportés sont :
= ou == égale
!= différent
+- supérieur strictement
+=- supérieur ou égal
-+ inférieur strictement
-=+ inférieur ou égal
~= vérifie l'expression rationnelle (depuis TBS version 3.0)
exp1 et exp2 doivent être des expressions numériques ou textes.
Vous pouvez utiliser le mot-clé [val] dans l'expression pour insérer la valeur du champ en cours.
Vous pouvez utiliser des champs [var] dans l'expression.
Les expressions peuvent contenir d'autres champs TBS, mais vous devez vous assurer qu'ils soient fusionnés avant le champ contenant.
Depuis TBS version 3.0, il est aussi possible de définir plusieurs couple de if/then dans le même champ.
Voir paramètres then et else pour des exemples.
then val1 Si le paramètre if a été défini et que sa condition est vérifiée, alors la donnée sera replacée par val1.
Depuis TBS version 3.0, il est aussi possible de définir plusieurs couples de if/then dans le même champ.
Exemple :
[onshow.image;if [val]='';then 'image0.gif']
[onshow.x;if [val]=1;then 'un';if [val]=2;then 'deux';else 'plus']
Vous pouvez utiliser le mot-clé [val] dans l'expression pour insérer la valeur du champ en cours.
Vous pouvez utiliser des champs [var] dans l'expression.
else val2 Si le paramètre if a été défini et que sa condition n'est pas vérifiée, alors la donnée sera replacée par val2.
Exemple :
[onshow.error_id;if [val]=0;then 'pas d''erreur';else 'erreur constatée']
Vous pouvez utiliser le mot-clé [val] dans l'expression pour insérer la valeur du champ en cours.
Vous pouvez utiliser des champs [var] dans l'expression.
onformat=nom_fct Indique le nom d'un fonction PHP utilisateur qui sera exécutée avant la fusion du champ.
Depuis TBS version 3.0, il est aussi possible d'indiquer une méthode de classe (voir POO).
La fonction nom_fct doit avoir la syntaxe suivante :
  function nom_fct($NomChamp,&$CurrVal,{&$CurrPrm,{&$TBS}}) { ... }
  Argument Description
  $NomChamp Retourne le nom du champ qui appel la fonction (lecture seule).
  $CurrVal Retourne la valeur en cours (lecture/écriture ; ne pas oublier le & dans la déclaration de la variable).
  $CurrPrm Facultatif. Fait référence au tableau des paramètres du champ courant (ne pas oublier le & dans la déclaration de la variable).
  $TBS Facultatif. Fait référence à l'instance courante de TBS. (ne pas oublier le & dans la déclaration de la variable).
Utilisez cet argument avec prudence. Il est fournit pour le mode Sous-modèle.
Voir le paragraphe 'Sous-modèles' pour plus de détails sur l'utilisation de ces arguments en mode sous-modèle.
protect=val Permet de protéger ou non la donnée à fusionner en remplaçant les caractères '[' pour leur équivalent Html '&#91;'. La valeur val peut être l'un des mots-clés suivants :
  yes : (valeur par défaut) la donnée est protégée.
  no : la donnée n'est pas protégée.
Par défaut, toutes données fusionnées avec un modèle sont protégées sauf s'il s'agit de l'inclusion d'un autre fichier. Il est fortement recommandé de protéger les valeurs affichées lorsque qu'il s'agit de données saisies librement comme sur un forum par exemple.
Il est néanmoins possible de désactiver la protection par défaut en mettant la propriété $TBS->Protect à false.
ope=action Effectue une ou plusieurs opérations sur la valeur à fusionner. Vous pouvez définir plusieurs opération à exécuter en ordre en les séparant par des virgules (,).
Exemple :
[onshow.x;ope=add:-1,mod:10]
Les opérations supportées sont :
max:n Limite la chaîne texte à un maximum de (n) caractères. Si la chaîne est coupée, alors sa fin est remplacée par des pointillés '...'.
Exemple : [onshow.libelle;ope=max:10]
Ajoutez le paramètre maxhtml pour indiquer que la valeur à fusionner peut contenir des caractères Html. Ajoutez le paramètre maxend pour changer le symbole de coupe.
Exemple : [onshow.libelle;ope=max:10;maxhtml;maxend='+']
mod:n Applique le modulo n à la valeur à fusionner. Exemple : [onshow.numlig;ope=mod:7]
add:n Ajoute le numérique n à la valeur à fusionner. Exemple : [onshow.numero;ope=add:-1]
mul:n Mutliplie la valeur à fusionner par n.
div:n Divise la valeur à fusionner par n.
list Si la valeur à fusionner est un tableau Php, alors ses items sont affichés séparés par une virgule (,).
Exemple : [onshow.tableau;ope=list]
Ajoutez le paramètre valsep pour changer le séparateur d'item.
Exemple : [onshow.tableau;ope=list;valsep='+']
nif:x Si la valeur est égale à 'x' alors elle est remplacée par '' (chaîne vide). Cette opération est conçue pour faire fonctionner le paramètre magnet avec d'autres valeurs que ''. (supporté depuis TBS version 3.3.0)
minv Remplace la valeur par '' (chaîne vide) mais le paramètre magnet ne prendra en compte que l'ancienne valeur. Cette opération est conçue pour rendre complètement invisible un champ TBS qui actionne un magnet. (supporté depuis TBS version 3.3.0)
Historique :
- Le paramètre ope est supporté depuis TBS version 3.0. Il remplace le paramètre max qui n'existe plus depuis cette version.
- Les opérations multiples et "mul" et "div" sont supportées depuis TBS version 3.2.0
frm=format Spécifie un format d'affichage pour une donnée de type date/heure ou numérique. Il est possible d'utiliser un format conditionnel qui change selon le signe de la valeur. Le format est considéré de type numérique s'il contient le caractère 0, sinon il est considéré de type date/heure. La valeur à fusionner n'influe pas sur le type de format.

Format date/heure :

Il s'agit d'un format semblable au format VisualBasic. Les mots-clés suivants sont reconnus :
d, dd, ddd, dddd : numéro du jour, numéro du jour sur deux chiffres, nom du jour court, nom du jour complet. Ajoutez le mot-clé (locale) pour afficher des noms locaux.
xx affiche st, nd, rd ou th selon le numéro du jour.
w numéro de jour de la semaine (de 0 à 6)
m, mm, mmm, mmmm : numéro du mois, numéros du mois sur deux chiffres, nom du mois court, nom du mois complet. Ajoutez le mot-clé (locale) pour afficher des noms locaux.
yy, yyyy : année sur deux chiffes, années complète.
hh, rr, nn, ss : heure-24, heure-12, minutes, secondes forcées à deux chiffres.
h, r heure-24, heure-12
ampm, AMPM : indice "am" ou "pm", indice "AM" ou "PM".
(locale) Affiche des noms de jour et de mois locaux. Le langage local peut être défini à l'aide de la fonction PHP setlocale(). Elle ne fonctionne que si les paramètres locaux ont été définis sur le serveur. Pour des raisons propres à PHP, en mode local xx ne fonctionne pas et d fait comme dd.

Les autres caractères sont conservés. Il est possible de mettre de protéger des chaînes texte en les plaçant entre guillemets doubles (").

Exemples :
[chp;frm=dd/mm/yyyy] affichera 21/12/2002
[chp;frm='yyyy-mm-dd hh:nn:ss'] affichera 2002-12-21 15:45:03

Historique :
- Les mots-clés ampm et AMPM sont supportés depuis TBS version 3.0.
- Le mot-clé hm supportés depuis TBS version 3.0 est déprécié et remplacé par rr depuis TBS 3.2.0.
- Les mots-clés rr, r et h sont supportés depuis TBS version 3.2.0.
- Me mot-clé (locale) est supporté depuis TBS version 3.4.0.


Format numérique :

Pour définir la partie décimale, utilisez un expression du type '0x0...' où 'x' est le séparateur de décimal, et '0...' est une répétition de zéro correspondant au nombre de décimales.
S'il n'y a aucune décimale, utilisez le format '0.' (avec un point).

Pour définir un séparateur de milliers, utilisez une expression du type '0z000x...' où 'z' est le séparateur de milliers. S'il n'y a aucune décimale, utilisez le format '0z000.' (avec un point).

Si le format contient le caractère '%', alors la valeur affichée sera multipliée par 100. Le caractère '%' reste affiché.

Le format numérique peut contenir d'autres chaînes texte. Mais seule l'expression de zéro placée la plus à droite sera considérée comme un format, les autres caractères seront conservés.

Exemples :
Valeur Champ Affichage
2456,1426 [chp;frm='0,000'] 2456,143
  [chp;frm='$ 0 000,00'] $ 2 456,14
  [chp;frm='$ 0 000.'] 2 456
0,2537 [chp;frm='0,00 %'] 25,37%
  [chp;frm='coef 0,00'] coef 0,25

Formats conditionnels :

Il est possible de définir jusqu'a 4 formats conditionnels selon que la valeur est respectivement positive, négative, zéro ou nulle (ou chaîne vide). Les formats conditionnels doivent être séparés par un caractère '|'. Chaque format conditionnel est facultatif.

Exemples :
Valeur Champ Affichage
2456,1426 [chp;frm='+0,00|-(0,00)|*|vide'] +2456,14
-156,333 [chp;frm='+0,00|-(0,00)|*|vide'] -(156,33)
0 [chp;frm='+0,00|-(0,00)|*|vide'] *
null [chp;frm='+0,00|-(0,00)|*|vide'] vide
-8,75 [chp;frm='+0,00|-(0,00)'] -(8,75)
locale Obsolète depuis TBS version 3.4.0.
Il fait la même chose que le mot-clé (locale) utilisé dans le paramètre frm.
tplfrms Permet de définir des formats dans le modèle que vous pouvez réutiliser pour le paramètre frm. Ce paramètre ne fonctionne qu'avec des champs automatiques onload.
Exemple :
[onload;tplfrms;euro=0 000,00 €;mydt=yyyy-mm-dd]
[onshow.montant;frm=euro] ... [onshow.date;frm=mydt]
tplvars Permet de définir des variables dans le modèle que vous pouvez récupérer dans le programme Php en utilisant la propriété TplVars. Ce paramètre ne fonctionne que avec des champs automatiques onload.


Ordre de traitement des paramètres :

Quand vous souhaitez utiliser plusieurs paramètres dans le même champ TBS, il peut être intéressant de comprendre dans quel ordre ils sont traités.
Chaque paramètre change la valeur à fusionner, mais la source d'où la valeur est prise n'est pas changée.

Ordre :
1) -> Récupération de la valeur du champ à fusionner.
2) -> Traitement des paramètres sur la valeur :
    2.1) -> onformat
    2.2) -> ope / plug-ins OnOperation
    2.3) -> frm / XML/HTML ou autre conversion de caractères
    2.4) -> if
    2.5) -> file
    2.6) -> script
    2.7) -> att
    2.8) -> . / ifempty / magnet
3) -> Insertion de la valeur dans le modèle.
Les champs automatiques :
Les champs automatiques permettent de fusionner automatiquement des variables globales PHP sur certains évènements.
Exemple : [onload.x] sera fusionné automatiquement avec la variable globale $x quand la méthode LoadTemplate() est appelée.

Les champs automatiques peuvent fusionner des variables PHP uniquement si elles sont globales. Il n'existe pas de solution pour fusionner une variable qui est locale à une fonction, à moins lui faire une référence avec une variable globale, ou de la fusionner avec MergeField().
Les champs automatiques peuvent aussi fusionner des informations spéciales de TBS (voir Champs automatiques spéciaux), ou des données de la propriété ObjectRef (voir Programmation Orientée Objet).

Il existe trois types de champs automatiques :
- Les champs [onload], qui sont fusionnés automatiquement quand la méthode LoadTemplate() est appelée.
- Les champs [onshow], qui sont fusionnés automatiquement quand la méthode Show() est appelée.
- Les champs [var], qui sont fusionnés automatiquement durant la fusion du champ dans lequl ils sont encapsulés mais uniquement s'ils sont placés dans les paramètres file, script, if, then, else et when.

Historique :
- Les champs automatiques [onload] et [onshow] sont supportés depuis TBS version 3.2.0. Par compatibilité avec les versions avant 3.2.0, les champs [var] restants sont toujours fusionnés comme des champs [onshow] mais il est conseillé d'utiliser de véritables champs [onshow] à la place.
- Les champs var ne sont traités dans les paramètres then et else que depuis TBS version 2.02.

Les champs automatiques peuvent avoir ou ne pas avoir de sous-nom, comme le x dans [onload.x], [onshow.x] ou [var.x]. Un champ automatique qui n'a pas de sous-nom sera fusionné avec la valeur chaine vide (''). Exemple : [onload;file=entete.html] ce champ instert un sous-modèle quand la méthode LoadTemplate() est appelée.

Un champ automatique qui a un sous-nom sera fusionné avec la variable globale PHP correspondante.
Si la variable globale n'existe pas à ce moment là alors une erreur TBS se produit à moins que l'on ajoute le paramètre noerr.

Exemples :
[onload.x] ce champ sera fusionné avec la variable globale $x quand la méthode LoadTemplate() sera appelée.
[onshow.x] ce champ sera fusionné avec la variable globale $x quand la méthode Show() sera appelée.
[b1.col1;if [val]=[var.x];then 'bien'; else 'mauvais'] : le champ [var.x] est fusionné en même temps que [b1.col1].

Vous pouvez aussi fusionner des items de tableau, des propriétés d'objet ou des résultats de méthode à l'aide du séparateur point ("."). Les variables de type Ressource sont ignorées.
Par exemples (valables aussi bien pour [onload], [onshow] et [var]) :
[onshow.tbl.item1]   va afficher   $tbl['item1']
[onshow.tbl.item2.a.0]   va afficher   $tbl['item2']['a'][0]
[onshow.obj.prop1]   va afficher   $obj->prop1
[onshow.obj.methA]   va afficher   $obj->methA()
[onshow.obj.methB(x,y)]   va afficher   $obj->methB('x','y')
[onshow.tbl.item3.prop2.item4   va afficher   $tbl['item3']->prop2['item4']
Historique : les méthodes avec arguments dans les champs automatiques sont supportées depuis TBS version 3.0.

Remarque : vous pouvez forcer la fusion des champs automatiques (ou d'autres types de champ) à tout moment grâce à la méthode MergeField().

Champs automatiques imbriqués
Un champs TBS imbriqué n'est jamais fusionné à moins que :
- il soit fusionné avant le champ parent,
- il s'agit d'un champ [var] placé dans un paramètre file, script, if, then, else ou when.

Exemples :
[onload;if [onload.x]=1;then 'oui';else 'non']
Cet exemple affichera toujours 'non', car le champ imbriqué [onload.x] ne sera jamais évalué. Il vaut mieux utiliser à la place [onload;if [var.x]=1;then 'oui';else 'non'], ou encore mieux [onload.x;if [val]=1;then 'oui';else 'non']

[b1.nom;block=tr;headergrp=[var.x]]
Dans cet exemple, [var.x] ne sera pas encore fusionné quand vous appelez $TBS->MergeBlock('b1',...)
L'entête de groupe sera donc défini de façon incorrecte.
Il faut :
- soit utiliser un champ onload : [b1.name;block=tr;headergrp=[onload.x]]
- soit appeler $TBS->MergeField('var') avant $TBS->MergeBlock('b1',...)
- soit utiliser un nom de champ personnalisé : [b1.name;block=tr;headergrp=[zzz]] fusionné manuellement avec $TBS->MergeField('zzz',$x)

Sécurité : comment limiter l'utilisation des champs automatiques dans les modèles ?

Vous pouvez limiter l'utilisation des champs automatiques en définissant un préfixe de variable autorisé lors de la création de l'objet TinyButStrong.
Exemple :
  $TBS = new clsTinyButStrong('','x1_');
Dans cet exemple, seules les variables Php globales préfixées par 'x1_' sont autorisées dans le modèle. Les autres champs automatiques produiront un message d'erreur explicite au moment de leur fusion.
  [onload.x1_title] sera fusionné si la variable globale $x1_title existe.
  [onload.x2_title] produira un message d'erreur explicite.

NB: le premier paramètre '' de clsTinyButStrong() dans cet exemple est utilisé pour définir les délimiteurs de balises TBS. Mais cela n'est pas décrit dans ce manuel.
Les champs automatiques spéciaux :
Un champ automatique spécial est un champ automatique onload, onshow ou var qui affiche des données fournies par le système TinyButStrong.
Le sous-nom d'un champ automatique spécial doit être un de la liste ci-dessous.
Les paramètres de champs TBS standards sont valables pour les champs [var] Spéciaux.

Exemple : Date du jour : [onshow..now;frm='dd/mm/yyyy']

(valables aussi bien pour onload, onshow et var) :
Nom Description
onload..now Date et heure du serveur.
onload..version La version de TinyButStrong.
onload..script_name Le nom du fichier PHP en cours d'exécution.
onload..template_name Le nom du dernier fichier modèle chargé.
Il s'agit du nom tel que indiqué lors de l'appel à la méthode LoadTemplate().
onload..template_date La date de création du dernier fichier modèle chargé.
onload..template_path Le répertoire du dernier fichier modèle chargé.
Il s'agit du répertoire tel que indiqué lors de l'appel à la méthode LoadTemplate().
onload..tplvars.* La valeur d'un item défini dans la propriété TplVars.
('*' doit être la clé d'un item existant dans le tableau)
onload..cst.* La valeur d'une constante PHP.
(* doit être le nom d'une constante existante)
onload..tbs_info Information sur TBS et les plug-ins installés.
onshow..error_msg Affiche les messages d'erreur qui ont été annulés durant le temps où la proprété NoErr est définie à true. Ce champ automatique spécial est utile surtout avec onshow.

Historique :
- les champs var spéciaux "cst" et "tbs_info" sont supportés depuis TBS version 3.2.0.
- "error_msg" est supporté depuis TBS version 3.5.0.
Les blocs TBS :
Un bloc TBS permet de définir une zone et d'afficher les données d'une source d'enregistrements.
On peut définir un bloc TBS à l'aide d'une ou deux balises TBS (voir plus bas).

Fusion avec des données :
La fusion d'un bloc avec des données est réalisée grâce à la méthode MergeBlock(). Quand un bloc TBS est fusionné avec des données, il est répété autant de fois qu'il y a d'enregistrements ; et les champs TBS associés sont remplacés par les valeurs des colonnes de l'enregistrement en cours.
Un champ TBS associé à un bloc est identifié par son nom qui doit être composé du nom du bloc suivi du nom de la colonne à afficher et séparés par un point.
Exemples :
- [Bloc1.ColA] Ce champ affichera la valeur de la conne ColA lors de la fusion du bloc Bloc1.
- [Bloc1.ColB;frm='dd-mm-yyyy'] Champ avec un paramètre

Depuis TBS version 3.5.0 les noms de colonne avec espaces sont acceptés.

Attention : lorsque deux blocs séparés portent le même nom, alors ils seront considérés comme deux sections d'un même bloc. Tout ce qui se trouve entre deux sections d'un bloc sera ignoré et supprimé lors de la fusion. Voir sections de bloc pour plus de détail sur les sections.


Syntaxes des blocs :

Il existe trois syntaxes possibles pour définir un bloc TBS :

Syntaxe explicite :
On utilise deux balises TBS. L'une pour le début du bloc, l'autre pour la fin du bloc.
Exemple :
MODÈLE...[NomBloc;block=begin;params]...MODÈLE...[NomBloc;block=end]...MODÈLE
Ces balises TBS de définition du bloc seront supprimées lors de la fusion.

Syntaxe relative :
Le bloc est défini par un couple de balises XML/HTML ouvrante-fermante, qui est donné par une balise TBS unique.
Exemple :
MODÈLE...<nom_balise...>...[NomBloc;block=nom_balise;params]...</nom_balise...>...MODÈLE
Cette balise TBS de définition du bloc doit se trouver n'import où entre le couple de balises XML/HTML.
Cette balise TBS sera supprimée lors de la fusion.
Remarque : Vous pouvez aussi définir une zone de bloc en combinant des balises XML/HTML. Voir le paramètre block pour plus de détails.

Syntaxe simplifiée :
On utilise un champ TBS associé pour définir le bloc de façon relative (voir syntaxe relative ci-dessus).
Exemple :
MODÈLE...<nom_balise...>...[NomBloc.NomColonne;block=nom_balise;params]...</nom_balise...>...MODÈLE
Le champ TBS qui contient la définition du bloc (c'est à dire le paramètre block=...) doit se trouver entre le couple de balises XML/HTML. Vous n'être pas obligé de le mettre le paramètre block sur le premier champ, ça peut être n'importe lequel à l'intérieur de la zone définie par le bloc.
Remarques :
• vous ne devez pas répéter le paramètre block=... sur chaque champ du bloc, un seul suffit. Si vous en mettez plusieurs, ce sera accepté par TBS mais il y aura peut être des confusions sur des paramètres de bloc complémentaires.
• Vous pouvez aussi définir une zone de bloc en combinant des balises XML/HTML. Voir le paramètre block pour plus de détails.

Quelle syntaxe utiliser ?

La syntaxe 'explicite' est rarement utilisée avec des éditeurs visuels parce que les balises TBS doivent souvent être placées entre deux balises XML/HTML. Par contre, elle convient assez bien pour des éditeurs textuels.

La syntaxe 'relative' permet de désigner un bloc avec seulement une balise TBS. De plus, on pas besoin de cacher la balise TBS car elle sera supprimée lors de l'affichage. Cette syntaxe est assez pratique.

La syntaxe 'simplifiée' est réellement simple. Elle permet de définir un bloc TBS et un champ TBS avec une seule balise TBS. Cette syntaxe est la plus courante et la plus pratique.

Astuce :
Vous pouvez utiliser la syntaxe 'relative' ou 'simplifiée' avec des balises personnelles ayant la norme XML/HTML.
Exemple :
<balise_perso>Bonjour [blk1.colonne1;block=balise_perso], comment allez vous ?</balise_perso>

Élément Description
NomBloc Le nom du bloc.
params Facultatif. Un ou plusieurs paramètres de la liste ci-après. Séparés par des ';'.
block=begin La balise TBS définie le début du bloc.
block=end La balise TBS définie la fin du bloc.
block=balise
ou
block=expr
Définie un bloc compris entre la balise XML/HTML ouvrante <balise...> et la balise XML/HTML fermante </balise> qui encadrent la balise TBS. Les balises XML/HTML désignées font partie intégrante du bloc.
Exemple :
<table id="tab1"> <tr><td>[b1.champ1;block=tr]</td></tr></table>
Le bloc est défini par la zone encadrée en pointillés.

Indicateurs spéciaux :
block=_ Défini un bloc sur la ligne texte qui porte la balise TBS. Une ligne texte se termine toujours par un caractère saut-de-ligne. Les sauts de ligne Windows, Linux et Mac sont supportés. Cette fonctionnalité est très pratique pour une modèle de type texte par exemple.
block=balise/ En ajoutant le caractère / à la fin du nom de balise, TBS ne va pas chercher de balise fermante. Le bloc sera défini sur la simple balise XML/HTML ouvrante qui contient la balise TBS. Cela peut être pratique pour multiplier une image par exemple.
Remarque : les indicateurs spéciaux peuvent être utilisés pour les extensions de bloc (voir ci-dessous).


Historique : Les indicateurs spéciaux "_" et "/" sont supportés depuis TBS 3.1.0.

Les blocs étendus :
Vous pouvez étendre la zone du bloc (ou de la section) au delà de la simple balise XML/HTML ou du simple indicateur spécial en utilisant les expressions suivantes :

Remarque : les marques spéciales (voir ci-dessus) peuvent être utilisées dans les blocs étendus.

Pour étendre la zone du bloc sur plusieurs balises successives :
<table><tr>[b1.champ1;block=tr+tr+tr]</tr><tr>...</tr><tr>...</tr></table>
Remarque : vous pouvez spécifier des balises de type différents

Pour étendre la zone du bloc sur plusieurs balises successives placées avant :
... <span>...</span><div>[b1.champ1;block=span+(div)]</div> ...
Autre exemple :
... <span>...</span> <div>[b1.champ1;block=span+(div)+table]</div> <table>...</table> ...
La balise mise entre parenthèse représente celle qui contient le champ de définition de bloc.

Pour étendre la zone du bloc sur une balise d'un niveau d'encapsulation supérieure :
<div> <div> [b1.champ1;block=((div))] </div> </div>
Le nombre de parenthèse représente le niveau d'encapsulation des balises.

Historique : Les blocs étendus ont étés ajoutés à TBS version 3.0. Avant cela, il fallait utiliser les paramètres 'extend' et 'encaps' qui ne sont plus supportés actuellement.

Paramètres des blocs :

Paramètre Description
nodata Désigne une section qui ne s'affiche que s'il n'y a aucune donnée à fusionner.

Exemple :
[b1.champ1;block=tr] [b1.champ2]
[b1;block=tr;nodata]Il n'y a aucune donnée.

Pour plus d'information sur les sections, voir le paragraphe 'sections de bloc'.
bmagnet=tag
ou
bmagnet=expr
Désigne une zone XML/HTML qui doit être supprimée si le bloc n'est fusionné avec aucun enregistrement (une requête vide, par exemple, ou un tableau PHP sans item). Le paramètre bmagnet a la même syntaxe que le paramètre block, c'est à dire que expr doit être une balise XML/HTML ou une expression de bloc étendu.
Exemple :
[b1.champ1;block=tr;bmagnet=table] [b1.champ2]
Dans cet exemple, la table sera supprimée si il n'y a aucun enregistrement à fusionner.

Remarque : La valeur null n'est pas acceptée par la méthode MergeBlock() comme une source de données, et elle provoque une erreur TBS au lieu de supprimer la zone bmagnet. Si votre source peut être nulle, vous devez faire une vérification préalable.
Exemple :
if (is_null($data)) $data = array();
$TBS->MergeBlock('b1',$data);

Historique : le paramètre bmagnet est supporté depuis TBS version 3.0.
headergrp=colnom Désigne une section d'entête qui sera affichée chaque fois que la colonne colnom change de valeur. colnom doit être un nom de colonne valide retourné par la source de données.
Depuis TBS version 3.3.0, colnom peut aussi être une colonne virtuelle # ou $, et il supporte aussi la syntaxe des sous-items des champs TBS.
Vous pouvez définir plusieurs sections headergrp sur des colonnes différentes. L'ordre de placement des sections headergrp dans un bloc peut changer le résultat.

Pour plus d'information sur les sections, voir le paragraphe 'sections de bloc'.
footergrp=colnom Désigne une section de pied qui sera affichée chaque fois que la colonne colnom change de valeur. See headergrp.
splittergrp=colnom Désigne une section de séparation qui sera affichée chaque fois que la colonne colnom change de valeur. See headergrp.
parentgrp=colnom Désigne une section parent qui sera affichée chaque fois que la colonne colnom change de valeur. Contrairement aux autres sections, une section parentgrp peut contenir des sections normales. C'est un moyen de définir un entête et pied de groupe avec une seule section.
serial Indique que le bloc est un bloc principal qui contient une série de blocs secondaires.
Pour plus d'information, voir le paragraphe 'Affichage en série (en colonne)'.
p1=val1 Signal l'utilisation d'une requête dynamique. Toutes les occurrences de la chaîne '%p1%' trouvées dans la requête passée à la méthode MergeBlock() sont remplacées par la valeur val1. Pour plus d'information, voir le paragraphe Sous-blocs et requêtes dynamiques.
S'il est utilisé sans valeur, cela vous permet de fusionner plusieurs blocs du même nom. Pour plus de détail, voir "Fusionner plusieurs blocs avec les mêmes données".
sub1=colonne1 Définie la colonne contenant les données pour un sous-bloc automatique.
Pour plus d'information, voir le paragraphe Sous-blocs automatiques.
ondata=nom_fct Indique le nom d'une fonction Php utilisateur qui sera exécutée pendant la fusion du bloc.
Depuis TBS version 3.0, il est aussi possible d'indiquer une méthode de classe (voir POO).
Cette fonction est appelée chaque fois qu'un enregistrement est récupéré dans la source de données. Vous pouvez utilisez les arguments d'une telle fonction Php pour modifier les enregistrements avants qu'ils ne soient fusionnés. La fonction doit avoir la syntaxe suivante:
  function nom_fct($NomBloc,&$Enreg,$NumEnreg) { ... }
Argument Description
$NomBloc Returns the name of the block calling the function (read only).
$Enreg Returns an associative PHP array containing the current record (read/write ; don't forget the & in the function header).
If you set this variable to False, it ends the merging like it was the end of the record set.
$NumEnreg Returns the number of the current record (read only, first record is number 1).
Exemples :
function f_ajout_colonne($NomBloc,&$Enreg,$NumEnreg) {
  $Enreg['taille'] = strlen($Enreg['texte']);
}
when expr1=expr2 Rend la section conditionnelle et définie la condition. Une section conditionnelle n'est affichée que si sa condition est vérifiée.
Les opérateurs supportés sont :
= ou== égale  
!= différent  
+- supérieur strictement  
+=- supérieur ou égal  
-+ inférieur strictement  
-=+ inférieur ou égal  
~= expr1 vérifie l'expression rationnelle expr2
(pour utilisateurs expérimentés)
Historique : ajouté à TBS 3.0
exp1 et exp2 doivent être des expressions numériques ou textes. Les expressions peuvent contenir des champs [var].
Exemple :
<div>[onload;block=div;when [var.x]+-0] ... </div>
Le bloc <div> ne sera affiché que si $x>0.

Remarque : ne pas confondre le paramètre when (qui ne marche qu'avec les blocs et sections TBS) et le paramètre if (qui ne marche qu'avec les champs TBS). Le paramètre when n'est pris en compte que si le paramètre block est présent dans la même balise TBS.
Consultez la rubrique blocs conditionnels pour plus d'information.
default S'utilise uniquement avec les blocs conditionnels. Indique un bloc conditionnel qui ne doit s'afficher que si aucune des autres sections du même bloc (nommé) n'a été affichée.
several S'utilise uniquement avec les blocs conditionnels. Indique que plusieurs sections du bloc (nommé) peuvent être affichées si plusieurs conditions sont vérifiées. Par défaut, les sections sont exclusives.
Sections de bloc :
Différents blocs portant le même nom seront considérés comme des sections du même bloc.
Les sections peuvent servir pour :
- alterner la présentation (sections normales),
- afficher quelque chose si il n'y a aucun enregistrement (section NoData),
- afficher un entête à chaque changement de la valeur d'une colonne (sections de regroupement).

Sections normales :

Quand vous définissez plusieurs sections normales, elles seront utilisées de façons alternatives à chaque enregistrement.

Exemple :

[b1.libelle;block=tr]
[b1.libelle;block=tr]

Dans cet exemple, le bloc nommé 'b1' contient deux sections normales. Les enregistrements seront affichés alternativement avec un fond vert puis un fond bleu.

Section NoData :

Affiche la section si la source de données de contient aucun enregistrement.
La section NoData est définie en ajoutant le paramètre nodata.

Exemple :

[b1.libelle;block=tr]
Il n'y a rien. [b1;block=tr;nodata]

Sections de regroupement :

Les sections de regroupement s'affichent chaque fois que la valeur d'une colonne du jeu d'enregistrement change. Vous pouvez définir des sections d'entêtes, de pieds-de-groupe, de séparation et des sections parent à l'aide des paramètres headergrp, footergrp, splittergrp et parentgrp. Voir les paramètres de bloc pour plus de détail.

Exemple :

Année :[b1.annee;block=tr;headergrp=annee]
[b1.libelle] [b1.montant;block=tr]

Sections conditionnelles :

Les sections conditionnelles ne s'affichent que lorsque leur condition est vérifiée. La condition d'affichage est définie avec le paramètre when. Dès qu'une section a ce paramètre, elle devient conditionnelle. Voir le chapitre sur l'affichage conditionnel pour plus de détail.

Exemple :

[b1.nom;block=tr]
[b1.adresse;block=tr;when [b1.adr_ok]==1]

Blocs automatiques :
Les blocs automatiques permettent de fusionner automatiquements des blocs conditionnels sur certains évènements.

Il existe deux types de blocs automatiques :
- Les blocs [onload] qui sont fusionnés automatiquement quand la méthode LoadTemplate() est appelée.
- Les blocs [onshow] qui sont fusionnés automatiquement quand la méthode Show() est appelée.

Les blocs automatiques ne sont pas fusionnés avec des données ; c'est pourquoi ils ne peuvent pas avoir de sections normales (non conditionnelles) ni de champs liés. Les blocs automatiques ne peuvent avoir que des sections conditionnelles. Les conditions sont évaluées une seule fois, et elles peuvent être des expressions contenant des champs [var].


Exemple :

[onload;block=tr;when [var.lumiere]=1] Lumière allumée.

[onshow;block=tr;when [var.user]=1] Utilisateur : [onshow.username]

Si vous avez besoin d'avoir un groupe sections exclusives, avec ou sans section par défaut, vous pouvez suffixer les noms de bloc [onload] et [onshow] avec "_" suivi d'un nom secondaire.


Exemple :

[onload_lumiere;block=tr;when [var.lumiere]=1] Lumière allumée.
[onload_lumiere;block=tr;when [var.lumiere]=0] Lumière éteinte.
[onload_lumiere;block=tr;default] Lumière ?

Voir les sections conditionnelles pour plus d'information.
Affichage en série (en colonnes) :
L'affichage en série permet d'afficher plusieurs enregistrements dans un même bloc. Pour cela, on utilise un bloc principal et des blocs secondaires.

Exemple :

Enr 1
Enr 2
Enr 3
Enr 4
Enr 5
Enr 6
Enr 7
Enr 8
Enr 9
...
...
...

Dans cet exemple, les blocs principaux sont les lignes bleues du tableau, les blocs secondaires sont les cases roses.

Syntaxe :
Le bloc principal et ses blocs secondaires sont fusionnés à l'aide d'un seul appel à la méthode MergeBock(). Le bloc principal doit être défini en utilisant le paramètre serial. Les blocs secondaires doivent être inclus dans le bloc principal. Leur nom de bloc doit être celui du bloc principal suivi de "_" puis du numéro d'ordre d'affichage.

Exemple :

[bx;block=tr;serial][bx_1.txt;block=td]
[bx_2.txt;block=td]
[bx_3.txt;block=td]
[bx_4.txt;block=td]

Le code PHP correspondant est :
 $TBS->MergeBlock('bx',$cnx_id,'SELECT txt FROM t_info ORDER BY txt')

Bloc secondaire vide :
Vous pouvez désigner un bloc secondaire spécial qui sera utilisé en remplacement des blocs secondaires inexploités (sans enregistrement). Ce bloc secondaire "vide" doit avoir l'indice 0. Il peut être placé dans un bloc principal avec les blocs secondaires normaux, ou alors seul dans autre bloc serial. Le bloc secondaire "vide" est facultatif.

Exemple :

[bx;block=tr;serial][bx_1.txt;block=td]
[bx_2.txt;block=td]
[bx_3.txt;block=td]
[bx_4.txt;block=td]
[bx;block=tr;serial][bx_0;block=td] Vide
     

Remarque :
L'affichage en série marche aussi avec les sections de bloc et les requêtes dynamiques.
Les sous-blocs :
Un sous-bloc est un bloc TBS encapsulé dans un autre bloc TBS et qui doit être affiché comme un bloc différent pour chaque enregistrement de son bloc parent.
Exemple :

Bloc parent - enregistrement n° 1
Sous-bloc, enregistrement n° 1.1
Sous-bloc, enregistrement n° 1.2
Bloc parent - enregistrement n°2
Sous-bloc, enregistrement n° 2.1
Sous-bloc, enregistrement n° 2.2
Sous-bloc, enregistrement n° 2.3
Bloc parent - enregistrement n°3
Sous-bloc, enregistrement n° 3.1

On peut réaliser des sous-blocs de deux manières différentes avec TBS :

- Sous-blocs automatiques : (depuis TBS 3.5.0) c'est lorsque les données du bloc parent ont une colonne qui contient les données prête à fusionner pour le sous-bloc. Les sous-blocs automatiques sont activées à l'aide du paramètre sub1 dans le bloc parent, et ils sont fusionnées automatiquement pendant la fusion du bloc parent. Il n'y a pas besoin d'un MergeBlock() supplémentaire.
Voir Sous-blocs automatiques pour plus de détails.

- Sous-blocs avec requête dynamique : c'est quand les données du sous-bloc sont récupérées à l'aide d'une requête qui peut changer pour chaque enregistrement du bloc parent. Les sous-blocs avec requête dynamiques ont besoin d'un MergeBlock() supplémentaire pour réaliser l fusion avec leur requête dynamique. Le paramètre p1 est aussi nécessaire dans la définition, du sous-bloc afin de préciser les valeurs à injecter dans la requête dynamique.
Voir Sous-blocs avec requêtes dynamiques pour plus de détail.
Sous-blocs automatiques :
Les sous-blocs automatiques sont supportés depuis TBS version 3.5.0.

Vous pouvez utiliser les sous-blocs automatiques lorsque les données du bloc parent ont une colonne qui contient les données prête à fusionner pour le sous-bloc. Ajoutez le paramètre sub1=colonne dans le bloc parent pour définir la colonne qui contient les données pour le sous-bloc. Si vous avez plusieurs sous-blocs à fusionner dans le même bloc parent, alors utilisez les paramètres sub2, sub3, ... Le nom du sous-bloc doit être le même que le bloc parent suivi du suffixe _sub1, (ou _sub2, _sub3, ...)

Les données du bloc parent doivent avoir une colonne contenant les données du sous-bloc. Les types de données supportés sont :
- un tableau PHP
- un objet supporté par TBS (en natif, ou avec un plug-in)
- une chaine texte de valeurs séparées par des virgules (,).

Exemple :

Nom : [pers.nom;block=tr;sub1=langue]
[pers_sub1.val;block=tr]

Code PHP correspondant :
 $TBS->MergeBlock('pers',$cnx_id,'SELECT nom,langue FROM t_personne')

Résultats de la fusion :

Nom : Pierre
US
FR
Nom : Paul
US
Nom : Jacques
FR
ES
IT
Sous-blocs avec des requêtes dynamiques :
Principe des requêtes dynamiques :

Il est possible d'utiliser la méthode MergeBlock() avec une requête dynamique.
Dans votre modèle, vous devez définir un bloc en ajoutant les paramètres p1, p2, p3,... avec leurs valeurs.
La requête passée à la méthode MergeBlock() doit contenir des marqueurs %p1%, %p2%, %p3%, ... pour accueillir les valeurs des paramètres p1, p2, p3,... .

Chaque section du bloc à fusionner contenant un paramètre p1 sera traité comme un bloc à part pour lequel on ré-exécute la requête dynamique. Les sections du bloc sui n'ont pas de paramètre p1 sont rattachées à la section avec paramètre p1 qui précède.

Exemple :

Pays : France
[blk.ville;block=tr;p1='france'] [blk.pays]

Pays : USA
[blk.ville;block=tr;p1='us'] [blk.pays]

Code PHP correspondant :
 $TBS->MergeBlock('blk',$cnx_id,"SELECT ville,pays FROM t_geo WHERE (pays='%p1%')")

Résultat de la fusion :

Pays : France
Paris france
Toulouse france

Pays : USA
Washington us
Boston us

Utilisation avec des sous-blocs :

Les requêtes dynamiques vous permettent de réaliser simplement un système de bloc-principal / sous-blocs. Voici comment vous pouvez faire :
- Créez un bloc principal, puis un sous-bloc contenu dans le bloc principal.
- Liez-les en ajoutant au sous-bloc un paramètre p1 qui prend pour valeur un champ du bloc principal.
- Du côté PHP, fusionnez d'abord le bloc principal, puis le sous-bloc.

Exemple :

Pays : [pri.pays;block=tr]
[sub.ville;block=tr;p1=[pri.pays_id]]

Code PHP correspondant :
 $TBS->MergeBlock('pri',$cnx_id,'SELECT pays,pays_id FROM t_pays')
 $TBS->MergeBlock('sub',$cnx_id,'SELECT ville FROM t_ville WHERE (pays_id=%p1%)')

Résultat de la fusion :

Pays : France
Paris
Toulouse
Pays : Allemagne
Berlin
Munique
Pays : Espagne
Madrid
Barcelone

Remarques :
- Le paramètre htmlconv=esc permet de passer à la requête des valeurs chaînes protégées.
- Les requêtes dynamiques marchent aussi avec les sections de bloc et l'affichage en série.
Sous-modèles :
Il y a deux façons pour insérer des sous-modèles dans votre modèle principal.

Insertion brute avec le paramètre file :

C'est la meilleure façon pour insérer une partie se trouvant dans un autre fichier, comme cela est habituellement fait pour les entêtes et pieds-de-page.

La valeur donnée au paramètre file doit être le nom d'un fichier existant sur le serveur. Vous pouvez utiliser une expression avec des champs [var] et le mot-clé [val] qui représente la valeur du champ.

Exemples :
[onload;file=entete.htm]
[onload;file=[var.fichier_entete]]
[onshow.sub1;file=[val]]

Le contenu du fichier est insérer à la place du champ, sans conversion de caractère et sans protection TBS .
Les balises [onload] contenues dans le fichier sont traitées au moment de l'insertion. Les balises [onshow] seront fusionnées sur la méthode Show() parce qu'elles sont devenues parties intégrantes du modèle principal.

Le sous-modèle peut contenir des champs TBS, y compris des champs [var] et des blocs à fusionner. Si vous avez l'intention de fusionner des données avec un bloc défini dans un sous-modèle, alors il est conseillé d'utiliser le paramètre file dans un champ [onload] pour s'assurer que le sous-modèle soit inséré avant que vous appeliez MergeBlock().

Vous pouvez concevoir un sous-modèle comme une page XML/HTML/Texte indépendante, et demander à TBS de n'inclure que la partie <body> (ou une autre partie) dans le modèle principal. Ceci se réalise en utilisant le paramètre getbody en plus du paramètre file dans le champ TBS du modèle principal. Cette technique vous permet de travailler en WYSIWYG sur vos sous-modèles.


Insertion assistée par du code Php avec le paramètre subtpl :

Le paramètre subtpl est utile pour gérer l'insertion d'un sous-modèle à l'aide de code Php. La paramètre subtpl n'est actif que lorsqu'il est utilisé avec un paramètre script ou onformat. Il bascule l'instance courante de TBS dans le mode Sous-modèle pendant l'exécution du script ou de la fonction, et peut agir sur un nouveau modèle sans altérer le modèle principal.

Le mode Sous-modèle présente les caractéristiques suivantes :

* Les sorties Php sont affichées à l'emplacement du champ au lieu d'être envoyés immédiatement au client. Par exemple, l'utilisation de la commande Php echo() insérera un texte dans le modèle principal au lieu de le sortir directement. L'utilisation de la méthode Show() insérera aussi le résultat de la sous-fusion dans le modèle principal.
   
* Une référence à l'instance de TBS est fournie par la variable $this ou $TBS, selon que vous utilisez le paramètre script ou onformat. Cette variable peut être utilisée pour de nouvelles sous-fusions sans altérer le modèle principal. La méthode Show() n'arrêtera pas l'exécution de script durant le mode Sous-modèle, comme cela est fait par défait dans le mode normal.

Quand le script ou la fonction se termine, l'instance TBS retourne en mode normal et agit sur le modèle principal.

Exemple avec le paramètre script :

HTML : [onload.fichier;script=specialbox.php;subtpl]
Script PHP : <?php
  echo('* Ici insertion d'un sous-modèle *');
  $this->LoadTemplate($CurrVal);
  $this->MergeBlock('blk1',$GLOBALS['conn_id'],'SELECT * FROM table1');
  $this->Show();
?>
Remarques : $CurrVal est une variable locale fournie par TBS quand on utilise le paramètre script ; cette variable fait référence à la valeur du champ en cours de fusion. Dans l'exemple ci-dessus, $CurrVal contient la valeur de la variable globale $file. Vous pouvez la remplacer, par exemple, par le nom du fichier du sous-modèle à charger (par exemple : 'monsousmodele.htm'). Voir le paramètre script pour plus d'information.

Exemple avec le paramètre onformat :

HTML : [onload.user_mode;onformat=f_user_info;subtpl]
Fonction PHP : function f_user_info($FieldName,&$CurrVal,&$CurrPrm,&$TBS) {
  if ($CurrVal==1) { // User is logged in
    $TBS->LoadTemplate('user_info.htm');
    $TBS->MergeBlock('blk1',$GLOBALS['conn_id'],'SELECT * FROM table1');
    $TBS->Show();
  } else { // User not logged in
    echo('You are not logged in.');
  }
}
Remarques : $CurrVal est une variable déclarée en tant qu'argument de la fonction. C'est TBS qui se charge d'appeler cette fonction de sorte que $CurrVal fasse référence à la valeur du champ en cours de fusion. Dans exemple ci-dessus, $CurrVal est égal à la valeur global $user_mode. De même la variable $CurrPrm fait référence au tableau des paramètres du champ en cours de fusion, et $TBS fait référence l'instance de TinyButStrong en cours d'utilisation. Voir le paramètre onformat pour plus d'information.
Affichage conditionnel :
TinyButStrong offre plusieurs outils pour gérer l'affichage conditionnel pour les champs et les blocs.

Champs conditionnels

Tous les champs TBS acceptent les paramètres d'affichage conditionnel rappelés ci-dessous.
Paramètre Description
. (point) Affiche un espace insécable Html si la valeur du champ est vide.
ifempty=valeur2 Affiche valeur2 si la valeur du champ est vide.
magnet=tag Supprime une balise ou un couple de balise si la valeur du champ est vide.
if condition
then valeur1
else valeur2
Affiche valeur1 ou valeur2 selon que la condition est vérifiée ou non.
frm=format1|format2|format3|format4 Change le format numérique ou date/heure selon que la valeur du champ est positive, négative, zéro ou vide.

Exemple :
[onshow.error_id;if [val]=0;then 'pas d''erreur';else 'erreur constatée']

Sections conditionnelles

Vous pouvez utiliser des sections conditionnelles dans n'importe quel bloc TBS (bloc de données ou bloc automatique). Une section conditionnelle est une section qui a un paramètre when définissant une condition, ou bien un paramètre default. Lors de la fusion du bloc, chaque condition when est évaluée jusqu'a ce qu'une soit vérifiée. Dès qu'une condition when est vérifiée, sa section conditionnelle est conservée et toutes les autres sont supprimées. Si aucune condition when n'est vérifiée, alors la section default est conservée si elle existe.

Cas des blocs de données :

S'il s'agit d'un bloc de données, c'est à dire fusionné avec MergeBlock(), alors les sections conditionnelles sont réévaluée pour chaque enregistrement. Il est même possible de définir un bloc de données qui ne contient que des sections conditionnelles, sans section standard.

Définition des conditions :
Les conditions définies dans le paramètre when peuvent être des expressions contenant des champs [var] et des champs liés (s'il s'agit d'un bloc de données). Voir paramètre when pour plus de détail sur les opérateurs supportés par TBS.

Exclusivité des sections :
Par défaut, les sections conditionnelles sont exclusives pour un même bloc. C'est à dire qu'une seule section conditionnelle peut être affichée par bloc. Mais si vous souhaitez qu'un bloc ait des sections conditionnelles non-exclusives, vous pouvez utiliser le paramètre several sur la première section conditionnelle. Avec ce paramètre, toutes les conditions sont évaluées et chaque condition vraie fera afficher se section.

Exemple avec un bloc de données :

Nom : [b1.Nom;block=tr] section standard
Adresse :
[b1.ad_ligne1;block=tr;when [b1.adresse]=1]
[b1.ad_ligne2]
[b1.ad_cp] - [b1.add_town]
section conditionnelle
Sans adresse.[b1;block=tr;default] section conditionnelle par défaut (facultatif)

Exemple avec un bloc automatique :

[onload_err;block=tr;when [var.email]='';several] Votre email est vide.
[onload_err;block=tr;when [var.nom]=0] Votre nom est vide.
[onload_err;block=tr;default] Tout est ok.

Coder des plug-ins :
Il est possible d'ajouter des fonctionnalités à TinyButStrong à l'aide de plug-ins. Les plug-ins de bases de données permettent simplement à la méthode MergeBlock() de reconnaître de nouveaux types de bases de données. Les autres plug-ins permettent d'ajouter des fonctionnalités à TBS ou bien de modifier ses principales méthodes pour le rendre plus spécialisé.

Dans le deux cas, un plug-in se présente sous la forme d'un jeu de fonctions PHP ou d'une seule classe PHP qui doivent répondre à une syntaxe précise attendue par TBS. Des plug-in sont proposés au téléchargement sur le site web de TinyButStrong.

Plug-ins de base de données :
Historique : les plug-ins de base de données sont supportés depuis TBS version 1.8.

Un plug-in de base de données permet à la méthode MergeBlock() de reconnaitre a nouveau type de base de données.
Quand vous faites un appel tel que $TBS->MergeBlock($NomBloc, $Source, $Requête), le processus MergeBlock commence par examiner $Source pour voir si son type est supporté.
Si $Source est un type de ressource connu en natif par TBS, alors le processus MergeBlock n'a besoin d'aucun plug-in, il va retrouver les données par lui-même.
Si $Source est un objet avec une méthode nommée tbsdb_open() alors le processus MergeBlock suppose que cet objet est un plug-in de base de données et il va l'utiliser pour récupérer les données. (Voir plus en détail ci-dessous)
Si $Source est une chaîne commençant par '~' alors le processus MergeBlock suppose que la propriété $TBS->ObjectRef est un plug-in de base de données et il l'utilise pour récupérer les données. (Voir plus en détail ci-dessous)
Si $Source est autre chose alors le processus MergeBlock essaye de trouver le plug-in fait avec des fonctions utilisateur et qui correspond au type de $Source. (Voir plus en détail ci-dessous)

Plug-in basé sur des fonctions utilisateur :

Quand le processus MergeBlock rencontre un type de valeur de $Source qui n'est pas supporté en natif, il détermine le TBS Id qui correspond a ce type. Puis il recherche les fonctions utilisateur qui correspondent à ce TBS Id.

Comment déterminer le TBS Id :
Le TBS Id est une chaine identifiant déterminée par l'argument $Source.
Si $Source est une chaine => le TBS Id est cette chaine.
Si $Source est une ressource PHP => le TBS Id est le nom du type de ressource.
Si $Source est un objet => le TBS Id est le nom de la classe.
Pour certaine commodité, si le TBS Id contient un espace (' '), il est coupé. Si le TBS Id contient des '-', ils sont remplacés par des '_'.
Par exemple, une variable PHP pour une connexion Sybase a le type Resource et son nom de ressource est 'sybase-db link'. Le TBS Id correspondant est 'sybase_db'.

Comment construire le plug-in pour un TBS Id:
Le plug-in est constitué de 3 fonctions utilisateur qui doivent avoir des noms spécifiques.
Les fonctions qui suivent sont faites pour un TBS Id qui est 'tbsid'. Pour un autre TBS Id, il vous suffit de renommer les fonctions.
Vous trouverez plusieurs exemples de plug-in de base de données sur le site web de TinyButStrong.

Synopsis:

function tbsdb_tbsid_open(&$Source, &$Requête)
Cette fonction est appelée une fois par le processus MergeBlock, avant les autres fonctions utilisateur.
Elle est supposée utiliser $Source et $Requête pour ouvrir un recordset, et retourner une référence sur ce recordset.
function tbsdb_tbsid_fetch(&$Rs [,$RecNum])
Cette fonction est appelée plusieurs fois par le processus MergeBlock, autant de fois qu'il a y de données à extraire de la requête.
Cette fonction doit retourner le prochain enregistrement sous forme d'un tableau associatif (nom de colonne => valeur), ou retourner false s'il n'y a plus d'enregistrement.
$Rs est la valeur fournie par tbsdb_tbsid_open(). C'est communément une référence de recordset.
$RecNum peut être utile pour certains types de base de données tel que Oracle, pour lesquels le numéro de l'enregistrement est requis pour l'extraire.
function tbsdb_tbsid_close(&$Rs)
Cette fonction est appelée une fois par le processus MergeBlock, après les autres fonctions utilisateur.
Cette fonction doit fermer le recordset de façon appropriée.
$Rs est la valeur fournie par tbsdb_tbsid_open(). C'est communément une référence de recordset.


Plug-in basé sur un objet :

Quand le processus MergeBlock rencontre une valeur de $Source qui est un objet, et si cet objet a une méthode nommée tbsdb_open(), alors il suppose que l'objet est un plug-in de base de données.
L'objet doit avoir au moins 3 méthodes tbsdb_open(), tbsdb_fetch() et tbsdb_close(). Il peut y avoir d'autres méthodes et d'autres propriétés, mais ces 3 méthodes doivent avoir la même syntaxe et les mêmes fonctionnalités que els fonctions utilisateur décrites ci-avant.

Synopsis :

class clsTbsPlugin {
  function tbsdb_open(&$Source, &$Requête)
  function tbsdb_fetch(&$Rs [,$RecNum])
  function tbsdb_close(&$Rs)
}


Plug-in basé sur la propriété ObjectRef :

Quand le processus MergeBlock rencontre une valeur de $Source qui est une chaine commençant par '~' alors il suppose que la propriété $TBS->ObjectRef est un plug-in de base de données basé sur un objet (voir POO). L'objet doit avoir les mêmes caractéristiques que le plug-in décrit ce-avant, mais le nom de ses méthodes peuvent être différents.

Exemple :
$TBS->MergeBlock($NomBloc,'~dbkey',$Requête);

class clsTbsPlugin {
  function dbkey_open(&$Source, &$Requête)
  function dbkey_fetch(&$Rs [,$RecNum])
  function dbkey_close(&$Rs)
}

Autres plug-ins :
Versioning: plug-ins are supported since TBS version 3.0.

Coding a plug-in using a PHP class:

• Plug-in's key:

Each plug-in has a plug-in key which is the name of its Php class. This key must be given to the method PlugIn() when you use it. Thus, it is recommended to define a PHP constant for the plug-in's key (see example below).

Plug-in events:

A TBS plug-in must be a PHP class which contains one or several specific methods that will be recognized and plugged by TBS. Those specific methods are called plug-in events because they are executed automatically by TBS when the corresponding event occurs. A TBS plug-in can also have other methods and properties for internal purpose. A TBS plug-in must have at least the OnInstall event.

For example:
// TBS plug-in XXX
define('TBS_XXX','clsTbsPlugIng_XXX'); // That is the plug-in's key
class clsTbsPlugIng_XXX() {
  function OnInstall(...) {...} // That is the OnInstall event
  ...
}


See the PHP file "tbs_plugin_syntaxes" to have all plug-in events, their usage and expected arguments. There is also a list of supported events at the bottom of this section.

The OnInstall event is special. It has to return an array with all activated events for the current plug-in (see the PHP file "tbs_plugin_syntaxes"). The OnInstall event is called when the plug-in is installed at the TBS instance.
This event can be called in three situations:
- When using method PlugIn() with the plug-in's key for the first time.
- When using method PlugIn() with the plug-in's key and the argument TBS_INSTALL.
- When a new TBS instance is created, if the plug-in's key has be added to the global array $_TBS_AutoInstallPlugIns[] (see file "tbs_plugin_syntaxes.php" for more details).

Property ->TBS:

As soon as the plug-in is installed on the TBS instance, a property ->TBS is automatically added to the plug-in, its value is a reference to the parent TBS instance. Remember this because this property can be very useful inside the plug-in's code.

Coding a plug-in using PHP functions:

The plug-ins' key is a string that you choose and which will be used for naming the function. It is recommended to define a PHP constant for the plug-in's key (see example below).

The plug-in events are coded using functions, and they names must be the string 'tbspi_', followed by the plug-in's key, followed by '_' and the event's name.
Example:
define('TBS_XXX','xxx');
function tbspi_xxx_OnInstall(...) {...}
...

All the rest works like for plug-in coded with a class. You must have at least the event OnInstall created, and it works the same way.

Remark: PHP functions are often faster than methods, but they don't let you having a ->TBS property to reach the parent TBS instance.

List of plug-in events:
  Plug-in Events Description
OnInstall Executed automatically when the plug-in is called for the first time, or when PlugIn() method is called with the specific argument for installing.
OnCommand Executed when PlugIn() method is called. This is a way to execute any user command specific to the plug-in.
BeforeLoadTemplate
Executed when LoadTemplate() method is called. Can cancel TBS basic process.
AfterLoadTemplate Executed at the end of LoadTemplate().
BeforeShow Executed when Show() method is called. Can cancel TBS basic process.
AfterShow Executed at the end of Show().
OnData Executed each time a record of data is retrieved for a MergeBlock() process. (similar to parameter 'ondata' but for every block)
OnFormat Executed each time a fields is being merged. (similar to parameter 'onformat' but for every fields)
OnOperation Executed each time parameter 'ope' is defined with an unsupported keyword.
BeforeMergeBlock Executed when bounds of a block are founded. Can cancel TBS basic process.
OnMergeSection Executed when a section is merged, and before it is added to other sections.
OnMergeGroup Executed before a header, a footer or a splitter section is merged. (supported since TBS 3.3.0)
AfterMergeBlock Executed just before a merged block is inserted into the template.
OnSpecialVar Executed when a non native Special Var Field (like [onshow..now]) is met.
OnMergeField Executed on each field met when using the MergeField() method.


Résumés :
Paramètres de champ TBS :
Paramètre Résumé
htmlconv

Mode de conversion de caractère pour la valeur du champ.

. (point) Si la valeur du champ est vide, affiche un espace insécable.
ifempty Si la valeur du champ est vide, affiche une autre valeur.
att Déplace le champ dans un attribut de balise XML/HTML.
attadd S'utilise avec att. Indique que la valeur fusionnée doit être ajoutée à la valeur de l'attribut.
magnet Si la valeur du champ est vide, supprime des balises proches.
mtype S'utilise avec magnet.
if Si la condition est vérifiée, change la valeur affichée.
then S'utilise avec if.
else S'utilise avec if.
onformat Exécute une fonction Php de l'utilisateur qui modifie la fusion du champ.
frm Applique un format date-heure ou numérique.
tplfrms S'utilise avec des champs onload uniquement. Définie des formats de modèle.
tplvars S'utilise avec des champs onload uniquement. Définie des variables de modèle.
protect Mode de protection sur les caractères '['.
comm Étend les limites du champ à la balise commentaire qui l'entoure.
noerr Empêche l'affichage de certaines erreurs TBS.
file Insert le contenu du fichier.
script Exécute le script Php.
getbody S'utilise avec script ou onformat. Insert seulement une partie du sous-modèle.
subtpl S'utilise avec script ou onformat. Passe l'instance TBS en mode Sous-modèle.
Paramètres de bloc TBS :
Paramètre Résumé
block Défini les limites du bloc.
nodata Désigne la section qui s'affiche lorsqu'il n'y a aucun enregistrement dans la source de données.
headergrp Désigne une section d'entête qui sera affichée lorsque la valeur d'une colonne change.
footergrp Désigne une section de pied qui sera affichée lorsque la valeur d'une colonne change.
splittergrp Désigne une section de séparation qui sera affichée lorsque la valeur d'une colonne change.
parentgrp Désigne une section parent qui sera affichée lorsque la valeur d'une colonne change.
serial Désigne une section qui contient une série de plusieurs enregistrements.
p1 Envoie un paramètre à la requête dynamique de la source de données.
sub1 Définie la colonne contenant les données pour un sous-bloc automatique.
ondata Exécute une fonction Php de l'utilisateur pour modifier l' l'enregistrement lorsqu'il vient juste d'être récupérer de la source de données.
when S'utilise avec onload ou onshow. Affiche la section quand la condition est vérifiée.
default S'utilise avec onload ou onshow. Affiche la section quand aucune condition n'est vérifiée.
several S'utilise avec when. Indique que plusieurs sections du groupe peuvent être affichées.
Noms de blocs et champs spéciaux :
Nom Résumé
val Le mot-clé [val] peut être utilisé dans des paramètres de champs pour représenter la valeur de ce champ.
# Colonne virtuelle pour un bloc. Affiche le numéro de l'enregistrement en cours.
$ Colonne virtuelle pour un bloc. Affiche la clé de l'enregistrement en cours si la source de données est un tableau Php.
onload Champ ou bloc automatique, fusionné lorsque le modèle est chargé.
onshow Champ ou bloc automatique, fusionné lorsque le modèle est affiché.
var Champ automatique encapsulé.
.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.: