Appel fonction PHP et paramètre : je sèche

Bonjour à tous,

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à… :thinking:

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…

Salut,

Pas sur de comprendre bien ton problème mais 2 choses :

  • il faut pas oublier qu’avant l’appel, il y a l’interprétation jeedom… ça chnage parfois pas mal de choses
  • hum(#TEST#) c 'est pas la bonne syntaxe hum(tag(#TEST#)) me semble meilleur si tu veux évaluer la longueur du contenu de ton tag …

Nope… Pas mieux à vrai dire.

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é.

Regarde bien :thinking:

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 :dizzy_face:

Alors que, comme je le disais, si je fais un return($Capteur) directement, c’est bien une chaine en retour !!! C’est dingue…

C’est une histoire de quote. Comme trop souvent en php. Regarde ma doc sur les code scénario, à la fin ( pas le lien en tête et suis sur le tel)

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. :sob:

$LocationArray = explode ("]", $_arg1);

Il y a bien un gars qui avait réussi à le faire :

https://forum.jeedom.com/viewtopic.php?t=41804

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 :rage:

Je pense avoir trouvé une piste.

Dans un scénario, on ne peut pas passer un tag directement en paramètre d’une fonction PHP. Il faut d’abord l’affecter à une variable…

Je posterai mon script quand il sera fonctionnel pour la postérité

Bonjour @Rajstopy ,

On peut mais il faut que la fonction soit prévue pour.

Si vous envoyez un tag #1234# à une fonction, pour retrouver la valeur il faut utiliser setTags

public static function hum($_arg1 = '') {
  $Capteur = scenarioExpression::setTags($_arg1);
  return $Capteur;
}

Voir là:

J’espère avoir compris ce que vous demandez. La demande me semble différente entre le premier et le dernier post.

Bonjour et merci pour votre réponse.

Cependant ce bout de code ne fonctionne pas.

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 çà :grinning:

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…

Vous devriez alors trouver votre bonheur sur cette page:

C’est ce que vous a proposé @kiboost dans son post au-dessus

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 :grin:), 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 :confused:

Oui… mais non :thinking: 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…

substr(#TEST#,strlen(substr(#TEST#,1,strpos(#TEST#, ‹ ] ›)-1))+3,strpos(#TEST#, ‹ [Etat] ›)-10)

J’aimerais simplement pouvoir créer ma propre fonction que je pourrais appeler n’importe où, en lui passant comme paramètre mon tag…

Avez-vous l’id du tag?
Suivant là où ça passe le #TEST# est remplacé par sa valeur. (Le Testeur d’expression par exemple)

Avec l’id du tag, ça donnerait:

public static function hum($_id = 1) {
    $cmd = cmd::byId($_id);
    if(is_object($cmd)) {
      $name = substr($cmd->getHumanName(),1,-1); // supression [ ] début et fin
      $p1 = strpos($name,'[');
      $p2 = strrpos($name,']');
      if($p1 !== false && $p2 !== false)
        $name = substr($name,$p1+1,$p2-$p1-1);
      return($name);
    }
    return ("No object with id: $_id");
  }

Bonjour,

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…