/data/php/user.function.class.php évaluation argument avec virgule et point

Bonjour à tous,

Je cherche à implémenter une fonction utilisateur.
J’ai un problème avec l’argument qui est une coordonnée latitude,longitude qui sont par définition 2 coordonnées décimales.

l’explode sur la virgule ne fonctionne pas, du coup j’investigue :

ma fonction de test dans le user.function :

public static function splitString($Coord_H){
      return strlen($Coord_H)." # ".$Coord_H;
    }

j’ai une info #[Habitants][Ben][coordonnees]# qui vaux à peu près : 45.5698592,1.9535183

quand je test :
splitString(#[Habitants][Ben][coordonnees]#)
j’ai comme retour :

Résultat : "8 # ‹ « 45.5698592,1.9535183 » ›
ce qui n’est absolument pas exact

si je test :
splitString("45.5698592,1.9535183")
j’ai

Résultat : "11 # « 45.5698592 »

si j’écris en dur la variable string dans la fonction :

public static function splitString($Coord_H){
      $Coord_H="45.5698592,1.9535183";
      return strlen($Coord_H)." # ".$Coord_H;
    }

je retrouve bien :

Résultat : 20 # 45.5698592,1.9535183

J’ai donc un truc qui se passe au moment ou l’interpréteur balance les arguments à la fonction.

J’ai essayer de caster la string, d’y ajouter des caractères de remplacer avec des expression régulières, etc…

j’ai également tester un strpos sur la virgule, le point, un chiffre, et j’ai toujours eu un false en retour…

bref je n’y comprend rien, est ce qu’il y a un moyen de passer cette limitation?

A noter que dans un bloc code dans un scénario, explode et autre strpos fonctionnent parfaitement.

[Edit]
les gettype me retourne bien les string ou ça doit,

quand dans la fonction je fait :

public static function splitString($Coord_H){
      return explode(', ',$Coord_H)[0];
    }

j’ai en retour :

Résultat : 45.5698592,1.9535183

et évidemment rien dans l’index 1…

[edit2]____________________________

encore plus fou :
strlen(explode(',',$Coord_H)[0]); sort 6
return substr (explode(',',$Coord_H)[0], 0, 6); sort 45.5698592,1.9535183

return substr (explode(',',$Coord_H)[0], 0, 5); sort #3267
return substr (explode(',',$Coord_H)[0], 0, 3); sort #32

Salut,

J’ai arrêté là parce que il n’y a pas de raison que ça ne marche pas …

Dans le fichier user.function.class.php

	public static function slipt($_gps) {
		echo $_gps;
		$coord=explode(',',$_gps);
		echo 'Lat= '.$coord[0]. PHP_EOL;
		echo 'Lon= '.$coord[1]. PHP_EOL;
	}

Le fichier run.php pour le lancement hors jeedom

<?php
require 'user.function.class.php';
userFunction::slipt("45.5698592,1.9535183");

Et la trace

user@Jeedom:/jeedom/data/php# php run.php
45.5698592,1.9535183
Lat= 45.5698592
Lon= 1.9535183

Merci naboleo,
Oui, ok, c’est bien ce que je dis, tout fonctionne en dehors de jeedom, ou directement dans un bloc code dans un scénario.

Mais quand je passe soit par le testeur d’expression, soit dans une action log dans un scénario ou en valorisant une info par un event dans un scénario, ça foire comme décrit.

Ce n’est pas l’explode qui ne fonctionne pas (ou autre fction native de php), mais l’argument est passé d’une façon non triviale, et je n’arrive à rien en sortir.
La string qui en sort est vraiment louche

Dans un bloc code, si tu n’ajoute pas le include au début, ça marche pas…

ça marche aussi, directement cette fois, dans les appels depuis un virtuel par exemple ou dans les blocs SI (partie SI bien sûr)

Pour reste, il faut oublier les actions logs et le testeur d’expression, => pas d’évaluation au sens php…
C’est pour ca que la seule bonne méthode c’est de passer hors jeedom pour tester et toujours par un bloc code

De ce coté là, c’est vrai que l’analyseur syntaxique est pas terrible et le testeur d’expression est plus perturbateur qu’autre chose je trouve. Mais c’est pas limité à la virgule ou au point, c’est un souci global
Et puis jeedom a tendance à mettre/ajouter des quotes un peu partout, à se tromper entre les doubles et le simple… c’est vite impossible en fonction de la pile d’appel.

C’est justement le chemin que j’ai pris ici, tout était fonctionnel, mais devant les résultat null une fois implémenté, je suis reparti en arrière.

J’y ai cru :


avec sur la fonction un simple return explode(",", $Coord_H)[0]; comme testé plus haut me valorise l’info à :
image
j’ai essayé de mettre à jour l’info source de calcul, mais même résultat.

un return strlen($Coord_H); me retourne encore 6

si je met directement splitString("45.56985,1.9535182")
là ça fait sauter les quote et j’ai les 2 arguments, mais j’ai bien la taille de la string correspondant au premier argument.

En 4.1 le comportement n’est pas exactement le même :
Si je mets ça dans le php

	public static function slipt($_gps) {
		$coord=explode(',',$_gps);
		return $coord;
	}
	public static function sliptLat($_gps) {
		//echo $_gps;
		return userFunction::slipt($_gps)[0];
	}

Et ça dans le virtuel

J’ai bien ça dans le dashboard, on est bien d’accord que c’est l’attendu ?
image

Par contre si je met ça


Effectivement j’ai ça
image

Et avec

public static function sliptLat($_gps) {
		//echo $_gps;
		return func_num_args();
	}

J’ai bien 1, donc c’est cohérent là

Salut Naboleo,

Oui exactement, je reproduis cplètement. je suis sous v4.0.61.
et si tu met

public static function sliptLat($_gps) {
      return strlen($_gps);
	}

tu te retrouve avec une longueur de chaine à 6!

mais si je met :

public static function sliptLat($_gps) {
      return $_gps;
	}

avec :

je me retrouve avec :
Résultat de la commande : 45.56985

je n’ai que la 1ère partie, les quote sont virées et la chaine interprétée comme 2 arguments

mais avec :

je me retrouve avec
Résultat de la commande : 45.56985,1.9535182

mais la chaine n’est pas manipulable «  »« « normalement » »«  » dans la fonction.