You are not logged in.
Pages: 1
Topic closed
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
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
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
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
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
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
Modifications de Nicolas et Denis appliquées. je clos ce post
MoYo - Julien Dombre - Association INDEPNET
Contribute to GLPI : Support Contribute References Freshmeat
Offline
Pages: 1
Topic closed