You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2011-02-02 13:29:39

sarabanjina
Member
From: Belgium
Registered: 2008-12-13
Posts: 15

Test sur des caractères spéciaux dans les modèles de notifications

Bonjour,

Dans le cadre de l'écriture d'un modèle de notifications complexe, j'essaie de détecter le type d'événement qui a généré la notification. Je teste donc avec toute une série de IF les types d'événement possibles. Cela fonctionne bien, excepté pour les événements possédant des caractères spéciaux  :

##IFticket.action=Nouvelle tâche##
Une nouvelle tâche pour ce ticket a été ajoutée
##FOREACH LAST tasks##
Le ##task.date##, ##task.author## a écrit: 
##task.description##
##lang.task.time## : ##task.time##
##ENDFOREACHtasks## 
##ENDIFticket.action##

En analysant le code, je me suis rendu compte que l'expression "\w" ne tient pas compte des caractères accentués.
J'ai également constaté un problème d'encodage html lors de la comparaison.
Je suis parvenu à générer un patch qui fonctionne, mais je ne suis pas sûr que ce soit la solution idéale :

--- inc/notificationtemplate.class.php.orig     2011-01-24 01:52:54.000000000 +0100
+++ inc/notificationtemplate.class.php  2011-02-02 11:43:05.000000000 +0100
@@ -323,14 +323,13 @@
 
 
    static function processIf($string, $data) {
-
-      if (preg_match_all("/##IF([a-z\.]*)[=]?([\w ]*)##/i",$string,$out)) {
+      if (preg_match_all("/##IF([a-z\.]*)[=]?([\p{L}\w ]*)##/i",$string,$out)) {
          foreach ($out[1] as $key => $tag_infos) {
             $if_field = $tag_infos;
             //Get the field tag value (if one)
-            $regex_if = "/##IF".$if_field."[=]?[\w ]*##(.*)##ENDIF".$if_field."##/Uis";
+            $regex_if = "/##IF".$if_field."[=]?[\p{L}\w ]*##(.*)##ENDIF".$if_field."##/Uis";
             //Get the else tag value (if one)
-            $regex_else = "/##ELSE".$if_field."[=]?[\w ]*##(.*)##ENDELSE".$if_field."##/Uis";
+            $regex_else = "/##ELSE".$if_field."[=]?[\p{L}\w ]*##(.*)##ENDELSE".$if_field."##/Uis";
             if (empty($out[2][$key])){ // No = : check if ot empty or not null
                if (isset($data['##'.$if_field.'##'])
                   && $data['##'.$if_field.'##'] != ''
@@ -342,7 +341,7 @@
                }
             } else { // check exact match
                if (isset($data['##'.$if_field.'##'])
-                  && $data['##'.$if_field.'##'] == $out[2][$key]) {
+                  && $data['##'.$if_field.'##'] == htmlentities(utf8_decode($out[2][$key]))) {
                   $condition_ok=true;
                } else {
                   $condition_ok=false;

Ne vaudrait-il pas mieux définir des strings indépendantes des langues permettant de tester les différents événements :

##IFticket.action=#lang.ticket.newtask##ENDIFticket.action

Nicolas


GLPI 0.78.2 on Debian Etch 64 bits running on Xen 4.0

Offline

#2 2011-02-03 10:03:58

MoYo
GLPI - Lead
From: Poitiers
Registered: 2004-09-13
Posts: 14,513
Website

Re: Test sur des caractères spéciaux dans les modèles de notifications

La modification des \w en \p{L} me semble intéressante par contre je ne comprend le but de l'autre correction.
Vous remplacer \w en \w\p{L} mais \p{L} ne suffirait pas ?


MoYo - Julien Dombre - Association INDEPNET
Contribute to GLPI :    Support     Contribute     References     Freshmeat

Offline

#3 2011-02-03 13:41:31

MoYo
GLPI - Lead
From: Poitiers
Registered: 2004-09-13
Posts: 14,513
Website

Re: Test sur des caractères spéciaux dans les modèles de notifications

Une discussion est en cours sur la mailing list de dev. Si vous pouvez la suivre et nous faire des retours ca serait parfait.
Les solutions émises ne sont pas exactement les même.


MoYo - Julien Dombre - Association INDEPNET
Contribute to GLPI :    Support     Contribute     References     Freshmeat

Offline

#4 2011-02-03 15:54:48

sarabanjina
Member
From: Belgium
Registered: 2008-12-13
Posts: 15

Re: Test sur des caractères spéciaux dans les modèles de notifications

Bonjour,

Honnêtement, je ne sais pas exactement ce que fait \p{L\} (je ne suis pas un spécialiste des expressions régulières en perl/php). Si vous me dites que \p{L} suffit, je vous crois sur parole...
Concernant la deuxième modification, il est certainement possible d'utiliser une fonction glpi pour convertir la string en utf8 et retirer le formatage html (htmlentities_deep?).
Je vais essayer de suivre la discussion sur la mailing list de dev, mais la solution actuelle me convient pour l'instant sur un GLPI 0.78.2 en prod (cette solution temporaire a le mérite de n'avoir aucun impact sur le reste du fonctionnement des templates).

Je voulais simplement partager une solution simple à un problème auquel certaines personnes seront probablement confrontées. Je comprends tout à fait que le système de template de notifications soit amené à évoluer avec le temps.

Nicolas


GLPI 0.78.2 on Debian Etch 64 bits running on Xen 4.0

Offline

#5 2011-02-03 16:33:25

MoYo
GLPI - Lead
From: Poitiers
Registered: 2004-09-13
Posts: 14,513
Website

Re: Test sur des caractères spéciaux dans les modèles de notifications

L'idéal pour nous serait que vous testiez la proposition effectuée sur la mailing list :
https://mail.gna.org/public/glpi-dev/20 … 00006.html

Si vous la valider nous pourrons l'intégrer directement.

merci d'avance


MoYo - Julien Dombre - Association INDEPNET
Contribute to GLPI :    Support     Contribute     References     Freshmeat

Offline

#6 2011-02-04 11:05:50

sarabanjina
Member
From: Belgium
Registered: 2008-12-13
Posts: 15

Re: Test sur des caractères spéciaux dans les modèles de notifications

Bonjour,

Je crois avoir compris une partie du problème : j'avais désactivé la fonction de cleanup de tynymce et j'avais des caractères encodés en UTF-8 dans le HTML...
Mais ça ne change qu'une partie du problème, car les balises pour le format des emails en texte sont encodées en UTF-8 elles.
Donc, si on prend le cas de "Nouvelle tâche" en français, il faut pouvoir comparer de l'HTML et de l'UTF8 avec le même pattern. J'arrive pratiquement au résultat avec ce patch, mais j'obtiens 2 encodages HTML différents pour le a accent grave (â) :

--- inc/notificationtemplate.class.php.orig     2011-01-24 01:52:54.000000000 +0100
+++ inc/notificationtemplate.class.php  2011-02-04 03:56:32.000000000 +0100
@@ -324,13 +324,13 @@
 
    static function processIf($string, $data) {
 
-      if (preg_match_all("/##IF([a-z\.]*)[=]?([\w ]*)##/i",$string,$out)) {
+      if (preg_match_all("/##IF([a-z\.]*)[=]?(.*?)##/i",$string,$out)) {
          foreach ($out[1] as $key => $tag_infos) {
             $if_field = $tag_infos;
             //Get the field tag value (if one)
-            $regex_if = "/##IF".$if_field."[=]?[\w ]*##(.*)##ENDIF".$if_field."##/Uis";
+            $regex_if = "/##IF".$if_field."[=]?.*##(.*)##ENDIF".$if_field."##/Uis";
             //Get the else tag value (if one)
-            $regex_else = "/##ELSE".$if_field."[=]?[\w ]*##(.*)##ENDELSE".$if_field."##/Uis";
+            $regex_else = "/##ELSE".$if_field."[=]?.*##(.*)##ENDELSE".$if_field."##/Uis";
             if (empty($out[2][$key])){ // No = : check if ot empty or not null
                if (isset($data['##'.$if_field.'##'])
                   && $data['##'.$if_field.'##'] != ''

Par contre, je ne comprends pas pourquoi Denis utilise la fonction "html_entity_decode_deep" qui va convertir son html en utf-8, alors qu'il devrait le comparer au html du template (j'ai vérifié que tous mes caractères sont bien encodés en html dans le template stocké dans la base de données) :

##IFticket.action=Nouvelle tâche##
<div style="font-weight: bold; padding: 10px;">Une nouvelle tâche pour ce ticket a été ajoutée</div>
##ENDIFticket.action##

Mais au final, il semble que le "â" ne soit pas stocké en html de la même manière dans GLPI et dans tinyMCE :

data : Nouvelle tâche
Out : Nouvelle tâche

Je ne suis plus sûr de rien avec ces encodages (qui sont parfois interprétés à l'affichage). Est-ce correct d'avoir de l'html brut dans $template_data['content_html']?

Une autre solution (plus logique?) (et qui semble fonctionner) serait de tout comparer en utf-8 :

--- inc/notificationtemplate.class.php.orig     2011-01-24 01:52:54.000000000 +0100
+++ inc/notificationtemplate.class.php  2011-02-04 10:02:13.000000000 +0100
@@ -208,7 +208,7 @@
             Plugin::loadLang(strtolower($plug['plugin']));
          }
 
-         if ($template_datas = $this->getByLanguage($language)) {
+        if ($template_datas = html_entity_decode_deep($this->getByLanguage($language))) { 
             //Template processing
             // Decode html chars to have clean text
             $data = html_entity_decode_deep($data);
@@ -323,14 +323,13 @@
 
 
    static function processIf($string, $data) {
-
-      if (preg_match_all("/##IF([a-z\.]*)[=]?([\w ]*)##/i",$string,$out)) {
+      if (preg_match_all("/##IF([a-z\.]*)[=]?(.*?)##/i",$string,$out)) {
          foreach ($out[1] as $key => $tag_infos) {
             $if_field = $tag_infos;
             //Get the field tag value (if one)
-            $regex_if = "/##IF".$if_field."[=]?[\w ]*##(.*)##ENDIF".$if_field."##/Uis";
+            $regex_if = "/##IF".$if_field."[=]?.*##(.*)##ENDIF".$if_field."##/Uis";
             //Get the else tag value (if one)
-            $regex_else = "/##ELSE".$if_field."[=]?[\w ]*##(.*)##ENDELSE".$if_field."##/Uis";
+            $regex_else = "/##ELSE".$if_field."[=]?.*##(.*)##ENDELSE".$if_field."##/Uis";
             if (empty($out[2][$key])){ // No = : check if ot empty or not null
                if (isset($data['##'.$if_field.'##'])
                   && $data['##'.$if_field.'##'] != ''
@@ -342,7 +341,7 @@
                }
             } else { // check exact match
                if (isset($data['##'.$if_field.'##'])
-                  && $data['##'.$if_field.'##'] == $out[2][$key]) {
+                  && html_entity_decode_deep($data['##'.$if_field.'##']) == $out[2][$key]) {
                   $condition_ok=true;
                } else {
                   $condition_ok=false;

Nicolas


GLPI 0.78.2 on Debian Etch 64 bits running on Xen 4.0

Offline

#7 2011-02-22 11:58:45

MoYo
GLPI - Lead
From: Poitiers
Registered: 2004-09-13
Posts: 14,513
Website

Re: Test sur des caractères spéciaux dans les modèles de notifications

Modifications de Nicolas et Denis appliquées. je clos ce post


MoYo - Julien Dombre - Association INDEPNET
Contribute to GLPI :    Support     Contribute     References     Freshmeat

Offline

Board footer

Powered by FluxBB