Je tente de mettre en place une petite fonction PHP pour faire du traitement sur mes chaines de caractères et j’ai un truc vraiment chelou…
J’ai donc déclaré ma fonction dans le fichier user.function.class.php
J’arrive parfaitement à y faire appel à partir d’un scénario mais j’ai un comportement incompréhensible quand je lui passe un tag
Exemple :
public static function hum($_arg1 = '') {
$Capteur = (string)$_arg1;
return $Capteur;
}
Cette fonction me renvoie bien [Alarme][Chambre des parents][Etat] qui est bien la valeur du tag à l’appel du scénario.
Maintenant, si je fais çà :
public static function hum($_arg1 = '') {
$Capteur = (string)$_arg1;
return strlen($Capteur);
}
Cette fonction me renvoie la longueur de #TEST# c’est-à-dire le tag passé en argument !!!
Ca fait des années que je n’ai plus fait de PHP, mais là, ça me dépasse totalement. Qu’est-ce que je n’ai pas compris ? Ma variable $Capteur est bien censée récupérer une chaine non ???
Si je déclare $Capteur = « [Alarme][Chambre des parents][Etat] », et bien ça fonctionne…
Complètement perdu là…
Edit :
J’appelle ma fonction de cette manière hum(#TEST#)
Quoique je mette entre parenthèse, c’est la longueur de l’argument qui est prise en compte… Incredible…
Si je fais :
public static function hum($_arg1 = ‹ ›) {
$Capteur = (string)$_arg1;
return $Capteur;
}
Cela me retourne bien ce qu’il faut dans Jeedom. Donc je ne vois vraiment pas pourquoi ça ne marcherait pas avec strlen… C’est vraiment très étrange ou alors j’ai rien pigé.
As the manual says: " strlen () returns the number of bytes rather than the number of characters in a string.", so if you want to get the number of characters in a
Oui j’avais vu. Du coup j’ai essayé mb_strlen … pareil, j’ai tenté iconv_strlen… pareil j’ai toujours la longueur de ce foutu argument passé en paramètre, jamais la longueur de la chaine
Alors que, comme je le disais, si je fais un return($Capteur) directement, c’est bien une chaine en retour !!! C’est dingue…
Pffff marche pas mieux… Je ne fait que récupérer la longueur de c’te putain de variable passée en paramètre. Même la fonction explode me renvoie toute la chaine [Alarme][Chambre des parents][Etat] et ne produit pas le retour escompté. Purée j’y pige que d’al.
Je ne demande pas à faire autre chose que son premier script, mais même le sien ne fonctionne pas chez moi. Je sens que je suis de nouveau tombé sur le bug caché, je suis super doué pour çà.
Bon, j’arrête, j’ai assez gâché ma journée avec ce merdier
public static function hum($_arg1 = ‹ ›) {
$Capteur = scenarioExpression::setTags($_arg1);
return $Capteur;
}
J’ai toujours la longueur du tag passé en paramètre qui remonte sur mb_strlen($Capteur).
Comme dit, la seule façon que j’ai trouvée, c’est d’affecter le tag à une variable, dans le scénario, avant l’appel de la fonction. Il doit y avoir une subtilité avec le typage du tag ou autre chose…
C’est donc que je n’ai pas compris ce que vous vouliez.
Je vous ai donné la solution pour avoir la longueur de la valeur du tag.
Vous voulez la longueur de la chaine de caractères #[Alarme][Chambre des parents][Etat]# ?
Citation
C’est donc que je n’ai pas compris ce que vous vouliez.
Je vous ai donné la solution pour avoir la longueur de la valeur du tag.
Vous voulez la longueur de la chaine de caractères #[Alarme][Chambre des parents][Etat]# ?
C’est exactement çà
Pour être plus précis : j’aimerais implémenter une fonction php qui puisse être appelée dans un scénario par exemple, lui passer en paramètre un tag (comme #trigger#), et faire un traitement sur la valeur de ce tag. Concrètement, en passant le tag #trigger# contenant [Alarme][Chambre des parents][Etat], je souhaite renvoyer Chambre des parents…
Cette approche marche très bien quand on défini un tag dans le scénario. Mais ce que j’aimerais faire, c’est utiliser un tag existant, comme #trigger# par exemple, pour savoir quel capteur est à l’origine de l’évènement. Et c’est justement ce passage de paramètre tag → fonction PHP que je n’arrive pas à faire marcher…
Je pense que c’est une problématique de scope. Les tags existants (comme #trigger#) doivent être visible par « l’interpréteur » uniquement dans le scénario. Sorti de là, (donc, au hasard, dans une fonction php externe ), la valeur stockée dans le tag #trigger# n’existe pas/plus, car on n’est plus dans le scope du scenario. Donc il prends simplement la chaine #trigger# au lieu de prendre la valeur stockée derrière. Cela pourrait expliquer pourquoi cela marche en passant par une variable pre-affectée (car ta fonction n’est plus capable de savoir que #trigger# est une variable/tag, mais prend bien en compte ta variable affectée et passée en paramètre).
Je sais pas si je suis très clair dans ma tentative d’explication
Oui… mais non Car si j’appelle la commande suivante dans un scénario, j’ai bien le résultat escompté (#TEST# étant mon tag). Et c’est là que quelque chose m’échappe…
Merci à tous pour vos conseils respectifs. Finalement je n’ai jamais réussi à faire mieux que ci-dessous. Je récupère le tag dans une variable, traitée par ma fonction, que je peux utiliser dans mes dialogues. Pas très sexy, mais ça a le mérite de fonctionner plutôt bien…