Fonctions personnalisées (userFunction) : paramètres optionnels php

Bonjour,

J’ai vu que l’on peut faire des fonctions personnalisées en php en les ajoutants dans le fichier html/data/php/user.function.class.php.
Au départ, je me suis dis pourquoi ne pas créér d’autres fichiers en fonction pour les regrouper par fonctionnalité. Je n’ai pas trouvé comment faire et je me demande si c’est possible.

Auriez-vous une idée pour regrouper les fonctions dans des fichiers différents ?

Ce que j’avais testé c’est de dupliquer le fichier user.function.class.php en message.function.class.php et en renommant la class userFunction en messageFunction.
Mais visiblement dans le code je ne pouvais pas appeler mes functions messageFunction::nom_function() car la class n’est pas reconnu.

Autre remarque, l’entête du fichier user.function.class.php et user.function.class.sample.php est différent mais je ne sais pas ce que ça change de prendre celui de l’exemple par rapport à l’initial.

//user.function.class.php
require_once dirname(__FILE__) . '/../../core/php/core.inc.php';

/* vs */

//user.function.class.sample.php
require_once __DIR__ . '/../../core/php/core.inc.php';

Salut,

j’ai préféré aussi répartir les fonctions dans différents fichiers, en fait le fichier user.function.class.php me sert à « servir » les fonctions qui se trouvent dans les autres fichiers.

En gros j’ai un truc comme ça:

autre.function.class.php:

<?php
require_once __DIR__ . '/../../core/php/core.inc.php';

class autreFunction
{
    public static function maFonction() {
       ...
   }
}

user.function.class.php:

<?php
require_once __DIR__ . '/../../core/php/core.inc.php';
require_once dirname(__FILE__) . '/autre.function.class.php';

class userFunction
{
    public static function maFonction() {
       autreFunction::maFonction(); 
   }
}

(En espérant ne pas avoir fait de faute de frappe)

2 « J'aime »

Salut,

Merci pour l’astuce je vais faire pareil, j’ai compris le principe.

Bonne soirée

Bonsoir,

Je cherche a faire des users functions avec des paramètres optionnels.
Losque j’ai un paramètre optionnel cela fonctionne mais des que j’en met 2 optionnels ça dysfonctionne.

function Test($a, $b, $c=null, $d=1){
    return 'a: '.$a.', b: '.$b.', c is null: '.is_null($c).', c: '.$c.', d: '.$d;
}


Execution1 => Test(1, 2, 3, 4)
Execution2 => Test(1, 2)
Execution3 => Test(1, 2, 4)
Execution4 => Test(1, 2,null, 4)
Resultat dans les logs
image

Avec le 1er appel et tous les paramètres je retrouve bien mes valeurs
Avec le 2ème appel sans paramètres optionnel, j’ai bien toutes les valeurs attendu et la variable c qui vaut bien null
Avec le 3ème appel la variable c ne vaut rien mais n’est pas vraiment null
Avec le 4ème appel la variable c vaut « null » mais n’est pas null

Dans le cas 3, j’ai essayé dans le code de tester is_null($c), $c == null ou $c === null mais ça ne marche pas.
J’ai l’impression qu’il y a une autre interpretation lié au bloc action mais je sais pas trop comment faire.

Comment puis-je faire pour passer la valeur null dans une fonction php depuis un bloc action jeedom ?

Merci d’avance

Essai voir avec ?string $c = null ?

Merci pour ton retour.
J’ai exactement le même comportement.
image

Bon 2 autres idées :

$c = NULL

et/ou essayer de le placer plutôt à la fin ?

$a, $b, $c=1, $d=NULL

J’avais déjà testé le NULL en majuscule, ça ne change rien.

Effectivement le null à la fin c’est la solution pour le petit cas de test d’exemple (et je vais adapter ma fonction en conséquence).
Mais si j’ai deux null optionnel, c’est de nouveau la même problématique…
$a, $b, $c=null, $d=null

C’est vraiment l’interpretation du bloc action car si je met un bloc code le null est bien reconnu

require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';
$scenario->setLog(userFunction::Test(1,2,null,4));

image

Encore merci pour ton aide
Bonne soirée

1 « J'aime »

En reflechissant, j’ai le problème dans l’autre sens

$a, $b, $d=1, $c=null

Je ne sais pas comment appeler la fonction en passant les paramètres a, b et d sans mettre le c pour avoir la valeur par défaut
image
image
Le paramètre d (vide) n’est pas remplacé par 1 et si je l’appel via du code en mettant aucun paramètre, j’ai un message d’erreur
image
image
Et si je renseigne null, la valeur de d vaut null.

Après pour mon cas, le paramètre que je renseigne le moins, je le met à la fin et si je renseigne le dernier, je renseigne tous les autres…

Sinon faudrait que je réalise des fonctions avec des noms différent qui appelent la principale en passant tous les paramètres et en appliquant les valeurs par défaut pendant l’appel.

Encore merci

Bonne soirée

Hum…
Et si tu indiques des chaînes vides en option puis tu testes si c’est une chaîne vide pour définir les valeurs, Null ou 1 ?

$a, $b, $c='', $d=''

Attention il me semble que l’on ne peut pas appeler (1,2,,4) il faut faire (1,2,'',4)

Effectivement c’est une bonne solution.
Merci

Bonjour,
d’un point de vue strictement php, ta fonction est bonne, le résultat 3 est incompréhensible, je ne vois pas pourquoi tu a d=4 alors qu’il n’y a que 3 paramètres… J’ai testé dans un bac à sable en ligne, ça marche :slight_smile: donc ton problème est lié à jeedom, à mon avis il remplace la valeur null par la chaine ‹ null › dans le 4 (mais je n’explique toujours pas le 3!)
L’astuce des chaines vides est bien. Si tu dois faire plus compliqué, tu peux utiliser les tableaux php avec cette syntaxe, 1 seul paramètre $t (le tableau) et tu y met ce que tu veux comme clé / valeur:

function Test1($t = []){
  $a = isset($t['a']) ? $t['a'] : null;
  $b = isset($t['b']) ? $t['b'] : null;
  $c = isset($t['c']) ? $t['c'] : null;
  $d = isset($t['d']) ? $t['d'] : 1;
  return 'a: '.$a.', b: '.$b.', c is null: '.is_null($c).', c: '.$c.', d: '.$d;
}

echo "\nExecution5 : " . Test1(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4]);
echo "\nExecution6 : " . Test1(['a'=>1, 'b'=>2]);
echo "\nExecution7 : " . Test1(['a'=>1, 'b'=>2, 'd'=>4]);

Merci pour ce retour, c’est une bonne idée.

Je passe par du code php car pour ma gestion de chauffage, j’avais beaucoup de scénario identique par pièce (et à maintenir c’est pas évident)

Du coup j’ai fais une fonction php que j’appele depuis un bloc action d’un scénario pour avoir le nom des objets (jeedom) dans l’appel, puis tous le code est déporté dans les userFunction


Et dans les logs j’ai juste un résumé des infos qui m’interesses

Pour moi la difficulté c’était de passer par le bloc action qui detecte et interprete l’appel à une fonction présente dans userFunction.
je passe par le bloc action pour avoir le suivi des commandes orphelines si je supprime une commande sans devoir regarder dans toutes mes classes php.
A la fin, je me lancerais peut-être un jour dans la création d’un plugin mais n’étant pas un expert php ça me prend déjà beaucoup de temps…

Le principal c’est que ça fonctionne (l’hiver arrive doucement mais surement…)

J’espère juste que cette façon de faire n’est pas plus couteux en ressource car le RPI 3 commence a être chargé :smiley:

Les variables optionnel sont des cas particuliers pour la salle de bains par exemple d’ouvre plus la vanne thermostatique que pour les autres pièces. Idem pour mon bureau, la tête dysfonctionne alors je suis obligé de la fermer plus que les autres lorsque la consigne est atteinte.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.