Erreur suite a un changement de fonction

Bon ben je m’auto répond car çà ne marche pas.

Si vous utiliser un widget que votre fonction getWidgetTemplateCode() ne gère pas, une commande message toute simple par exemple → çà pète puisque votre fonction ne renvoit pas le template du core.

Et du coup sur le dashboard, vos commandes provoquent des erreurs 500 puisque votre fonction ne gère que vos cas à vous.

On se dirige donc vers la modification de vos plugins. Car là, en gros, ou le Core n’évolue pas sur ces fonctions, ou vos plugins pètent. Et à part gérer pré 4.2 / 4.2+ je vois pas …

Peu etre en passant par les reflection php pour récuperer les arguments de la fonction core et faire la bonne en fonction …

J’ai peux être une idée débile,
Dans le core si le retours n’est pas une array, tu la construit a l’endroit du retours ?

Cdt
Thibaut

A cet endroit j’ai pas les infos à mettre dans l’array, sinon j’aurai pas fait comme çà

@kiboost on est d’accord que sont les seul 2 référence de la fonction dans le core ?

Si oui j’ai peux être une solution

Cdt
Thibaut

Juste en passant, non, si on appelle explicitement sur la cmd et non pas la classe fille, on appelle la méthode non overridée, l’originale de cmd.

Et du coup le plugin ne renseigne plus ses propre templates

La 1ère est 4.2 la deuxième est 4.0 / 4.1

Fait une recherche dans cmd.class.php

Mais le plugin pourrait directement le gérer dans son tohtml() et ça marcherai en pré 4.2 !!

Ha, bizzard, c’est toute les référence dans la classe cmd sur la branche alpha.

Cdt
Thibaut

Deux exemples de plugins qui gèrent leur propre toHtml() avec leurs propres template :

Je pense qu’en faisant çà vous régler tout vos soucis, toutes versions du Core.

Un édit de ce type réaliserait pas une solution viable sans édit des dev qui suivent leur plugin ?

   public function getWidgetHelp($_version='dashboard', $_widgetName='') {
   	$widget = $this->getWidgetTemplateCode($_version, false, $_widgetName);
   	if(!is_array($widget)) $widget = array('template' => $widget, 'isCoreWidget' => false);
   	$widgetCode = $widget['template'];
   	$isCorewidget = $widget['isCoreWidget'];

Cdt
Thibaut

edit :
Ps : je relance ma vm de test pour voir si c’est mieux de le faire dnas le plugin ou dans le core

Edit 2 :
Ca a l’air d’être une erreur je regarde a nouveaux si c’est de la merde ce que je fait

çà changera rien puisque tu garde la définition de fonction du core différente de celle du plugin.

Plus j’y pense et plus je me dit que le plugin n’a pas a faire comme çà, plusieurs plugins officiels utilisent également leur propre toHtml().

exemple plugin weather : https://github.com/jeedom/plugin-weather/blob/beta/core/class/weather.class.php#L650

Je sais pas pourquoi je n’y ai pas pensé dès le début en fait.

J’ai compris que l’erreur venais de chez moi, j’ai donc fait un code un peux merdique mais sa a l’air de fonctionner

Je suis donc passer de ca :

		public function getWidgetTemplateCode($_version = 'dashboard', $_noCustom = false) {
			if ($_version != 'scenario') return parent::getWidgetTemplateCode($_version, $_noCustom);
			list($command, $arguments) = explode('?', $this->getConfiguration('request'), 2);
			if ($command == 'sendMsg')
				return getTemplate('core', 'scenario', 'cmd.sendMsg', 'discordlink');
			if ($command == 'sendMsgTTS')
				return getTemplate('core', 'scenario', 'cmd.sendMsgtts', 'discordlink');
			if ($command == 'sendEmbed')
				return getTemplate('core', 'scenario', 'cmd.sendEmbed', 'discordlink');
			if ($command == 'sendFile')
				return getTemplate('core', 'scenario', 'cmd.sendFile', 'discordlink');
			if ($command == 'covidSend')
				return getTemplate('core', 'scenario', 'cmd.covidSend', 'discordlink');
			return parent::getWidgetTemplateCode($_version, $_noCustom);
		}

A ca :

		public function getWidgetTemplateCode($_version = 'dashboard', $_clean = true, $_widgetName = '') {
			$data = null;
			if ($_version != 'scenario') return parent::getWidgetTemplateCode($_version, $_clean, $_widgetName = '');
			list($command, $arguments) = explode('?', $this->getConfiguration('request'), 2);
			if ($command == 'sendMsg')
				$data = getTemplate('core', 'scenario', 'cmd.sendMsg', 'discordlink');
			if ($command == 'sendMsgTTS')
				$data = getTemplate('core', 'scenario', 'cmd.sendMsgtts', 'discordlink');
			if ($command == 'sendEmbed')
				$data = getTemplate('core', 'scenario', 'cmd.sendEmbed', 'discordlink');
			if ($command == 'sendFile')
				$data = getTemplate('core', 'scenario', 'cmd.sendFile', 'discordlink');
			if ($command == 'covidSend')
				$data = getTemplate('core', 'scenario', 'cmd.covidSend', 'discordlink');
			if (!is_null($data)) {
				if (version_compare(jeedom::version(),'4.2.0','>=')) {
					 if(!is_array($data)) return array('template' => $data, 'isCoreWidget' => false);
				} else {
					return $data;
				}
			}
			return parent::getWidgetTemplateCode($_version, $_clean, $_widgetName = '');
		}

Pas tout compris la :joy:

J’ai edit mon message, mais sa a l’air de fonctionner :slight_smile:

Cdt
Thibaut

T’aura le même problème en 4.0 et 4.1.
Fait un tohtml …

Je t’avoue que je suis pas sur de maitriser le tohtml.

Sinon j’ai vérifier et il y a pas de problème, plus de paramètre sa le gène pas par contre pas assez si…

Je met ce patch en attendant et je vois pour faire mon to HTML, car je sait pas encore le faire.

Cdt
Thibaut

De mémoire @sigalou sur alexaapi fait du toHtml pourtant… pourquoi il aurait les deux fonctions alors ?

Il utilise les 2 méthodes d’après ce que j’ai vu.

Il a aussi l’erreur

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