Un filtre de rendu doit être une classe étendue par patTemplate_OutputFilter. Vous devez placer le fichier qui contient votre filtre dans le répertoire patTemplate/OutputFilter.
Dans la classe vous avez juste besoin d’implémenter une méthode appelée ‘apply()’. Cette méthode va être appelée par patTemplate quand patTemplate::displayParsedTemplate() est appelée par le script. Avant que le résultat du code HTML soit envoyer au navigateur, votre filtre va avoir l’opportunité de modifer ou de filtrer le résultat HTML.
L’utilisation de cette méthode doit accepter un paramètre string, lequel va recevoir le code HTML. Après l’avoir modification, vous avez juste à retourner la modification HTML.
L’exemple suivant montre comment implémenter un filtre de rendu, celà supprime toutes les cassurs de lignes et les espaces spéciaux, l’indentation, etc. venant du code HTML avant d’être envoyer dans le navigateur. La classe à été placée dans un fichier patTemplate/OutputFilter/StripWhitespace.php (Ce qui est ici est déjà réellement ce qui est inclus dans la distribution).
01 <?PHP 02 /** 03 * patTemplate StripWhitespace output filter 04 * 05 * suppression de tout les whitespace et les remplace avec un simple espace. 06 * 07 * @package patTemplate 08 * @subpackage Filters 09 * @author Stephan Schmidt <schst@php.net> 10 */ 11 class patTemplate_OutputFilter_StripWhitespace extends patTemplate_OutputFilter 12 { 13 /** 14 * Le nom du filtre 15 * 16 * @access protected 17 * @abstract 18 * @var string 19 */ 20 var $_name = 'StripWhitespace'; 21 22 /** 23 * supprime tous les whitespace venant du rendu. 24 * 25 * @access public 26 * @param string data 27 * @return string data sans whitespace 28 */ 29 function apply( $data ) 30 { 31 $data = str_replace( "n", ' ', $data ); 32 $data = preg_replace( '/ss+/', ' ', $data ); 33 34 return $data; 35 } 36 } 37 ?>
Application d’un filtre de rendu est une tache facile. Vous avez juste à appeler une méthode de votre objet patTemplate et passer le filtre de rendu désiré. Vous pouvez créer un filtre de chaîne par application de plusieurs filtres de rendu, elle sera appelée sucèssivement dans l’ordre que vous les aurez appliqués.
01 <?PHP 02 require_once 'pat/patErrorManager.php'; 03 require_once 'pat/patTemplate.php'; 04 05 $tmpl = &new patTemplate(); 06 $tmpl->setRoot( 'templates' ); 07 $tmpl->applyOutputFilter( 'StripWhitespace' ); 08 09 $tmpl->readTemplatesFromInput( 'page.tmpl', 'File' ); 10 11 /** 12 * Le filtre de rendu vas être appliqué ici 13 */ 14 $tmpl->displayParsedTemplate(); 15 ?>
Vous pouvez également créer un filtre de rendu qui peut être paramétrable par le script qui applique le filtre. Si la classe du filtre a besoin d’accéder aux paramètres initialisé par le script, vous pouvez utiliser la méthode patTemplate_OutputFilter::getParam(). Quand un filtre est appliqué, tous les paramètres doivent être passés comme tableau(array) dans le second paramètre du patTemplate::applyOutputFilter().
Pourquoi un filtre d’entrées?
Vous pouvez utiliser des filtres d’entrées pour vos différentes tâches. Vous pourriez découper tous les espaces venant de vos templates pour accélérer le processus d’analyse, supprimer les commentaires inutiles ou décompresser les templates si ils sont enregistrer dans un format ZIP.
Vous pouvez également utiliser ceci dans quelques cas spéciaux, où vous avez besoin de modifier les templates mais sans pouvoir les modifier dans leurs endroits de stockages d’origine.
L’implémentation d’un filtre d’entrée est exactement la même chose que de créer un nouveau filtre de rendu. Vous devez étendre une nouvelle classe venant de patTemplate_InputFilter et placer celle-ci dans un fichier qui se trouve dans le répertoire patTemplate/InputFilter. La dernière partie du nom de la classe doit être identique au nom du fichier.
Dans cette classe, vous devrez simplement implémenter une méthode:
string patTemplate_OutputFilter::apply( string templateCode )
patTemplate_Reader vas passer le code du template à la méthode avant d’être analysé par le lexer et vous pourrez modifier ces réglages comme bon vous semble.
L’exemple suivant découpe les commentaires HTML venant des templates avant qu’ils ne soient analysés. Ceci vous permet de les placer entre les balises <patTemplate:tmpl> et <patTemplate:sub>, bien qu’il ne soit pas permit de placer les données là.
01 <?PHP 02 /** 03 * patTemplate StripComments output filter 04 * 05 * supprimera tout les comments HTML. 06 * 07 * @package patTemplate 08 * @subpackage Filters 09 * @author Stephan Schmidt <schst@php.net> 10 */ 11 class patTemplate_InputFilter_StripComments extends patTemplate_InputFilter 12 { 13 /** 14 * Nom du filtre 15 * 16 * @access private 17 * @var string 18 */ 19 var $_name = 'StripComments'; 20 21 /** 22 * compresse les données 23 * 24 * @access public 25 * @param string data 26 * @return string data sans whitespace 27 */ 28 function apply( $data ) 29 { 30 $data = preg_replace( '<!--.*-->msU', '', $data ); 31 32 return $data; 33 } 34 } 35 ?>
Application d’un filtre d’entrer est une tache facile. Vous devez simplement appelé une méthode dans votre objet patTemplate et lui passer les filtres d’entrées désirés. Vous pouvez créer un filtre de chaîne par application de plusieurs filtres d’entrées comme bon vous semble.
Si vous utilisez plus d’un filtre, ils vont être appelés dans l’ordre où vous les aurais appliqué.
01 <?PHP 02 require_once 'pat/patErrorManager.php'; 03 require_once 'pat/patTemplate.php'; 04 05 $tmpl = &new patTemplate(); 06 $tmpl->setRoot( 'templates' ); 07 $tmpl->applyInputFilter( 'StripComments' ); 08 09 $tmpl->readTemplatesFromInput( 'page.tmpl', 'File' ); 10 11 /** 12 * le filtre d'entrer sera appliqué ici 13 */ 14 $tmpl->displayParsedTemplate(); 15 ?>
Vous pouvez également créer un filtre d’entrée qui peut être paramétrable par script qui applique le filtre. Si la classe du filtre a besoin d’accéder aux paramètres initialisé par le script, vous pouvez utiliser la méthode patTemplate_InputFilter::getParam().
Quand un filtre est appliqué, tous les paramètres doivent être passés comme un tableau(array) dans le second paramètre de patTemplate::applyInputFilter().