500 : Internal Server Error lorsque j'essaie d'afficher une image sur le dashboard

Bonjour, j’essaie d’afficher une image qui est sous forme de lien à la base.
Sauf que sur le dashboard j’ai l’erreur « 500 : Internal Server Error ». Voici mon fichier core/class/nasaapi.class.php :

<?php
/* This file is part of Jeedom.
*
* Jeedom is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Jeedom is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jeedom. If not, see <http://www.gnu.org/licenses/>.
*/

/* * ***************************Includes********************************* */
require_once __DIR__  . '/../../../../core/php/core.inc.php';

class nasaapi extends eqLogic {
  /*     * *************************Attributs****************************** */
  public function getAPOD() {
	  // Clé API de la NASA
	  $api_key = $this->getConfiguration('param1');
	  // URL de l'API de la NASA
	  $api_url = "https://api.nasa.gov/planetary/apod?api_key=$api_key";
	  // Récupération des données de l'API
	  $response = file_get_contents($api_url);
	  $data = json_decode($response, true);
	  // Récupération de l'explication de la photo
	  $explication = $data['explanation'];
	  $url = $data['url'];
	  $titre = $data['title'];
	  // Affichage de l'explication
	  return[$explication, $url, $titre];
  }

  /*
  * Permet de définir les possibilités de personnalisation du widget (en cas d'utilisation de la fonction 'toHtml' par exemple)
  * Tableau multidimensionnel - exemple: array('custom' => true, 'custom::layout' => false)
  public static $_widgetPossibility = array();
  */

  /*
  * Permet de crypter/décrypter automatiquement des champs de configuration du plugin
  * Exemple : "param1" & "param2" seront cryptés mais pas "param3"
  public static $_encryptConfigKey = array('param1', 'param2');
  */

  /*     * ***********************Methode static*************************** */

  /*
  * Fonction exécutée automatiquement toutes les minutes par Jeedom
  public static function cron() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 5 minutes par Jeedom
  public static function cron5() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 10 minutes par Jeedom
  public static function cron10() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 15 minutes par Jeedom
  public static function cron15() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 30 minutes par Jeedom
  public static function cron30() {}
  */

  
  // Fonction exécutée automatiquement toutes les heures par Jeedom
  public static function cronHourly() {
	  foreach (self::byType(__CLASS__,true) as $eqLogic) {
    $eqLogic->getAPOD();
	  }
  }
  

  /*
  * Fonction exécutée automatiquement tous les jours par Jeedom
  public static function cronDaily() {}
  */

  /*     * *********************Méthodes d'instance************************* */

  // Fonction exécutée automatiquement avant la création de l'équipement
  public function preInsert() {
  }

  // Fonction exécutée automatiquement après la création de l'équipement
  public function postInsert() {
  }

  // Fonction exécutée automatiquement avant la mise à jour de l'équipement
  public function preUpdate() {
  }

  // Fonction exécutée automatiquement après la mise à jour de l'équipement
  public function postUpdate() {
  }

  // Fonction exécutée automatiquement avant la sauvegarde (création ou mise à jour) de l'équipement
  public function preSave() {
  }

  // Fonction exécutée automatiquement après la sauvegarde (création ou mise à jour) de l'équipement
  public function postSave() {
	  $info = $this->getCmd(null, 'explanation');
	  if (!is_object($info)) {
		  $info = new nasaapiCmd();
		  $info->setName(__('Explication', __FILE__));
	  }
	  $info->setLogicalId('explanation');
	  $info->setEqLogic_id($this->getId());
	  $info->setType('info');
	  $info->setSubType('string');
	  $info->save();
	  
	  $refresh = $this->getCmd(null, 'refresh');
	  if (!is_object($refresh)) {
		  $refresh = new nasaapiCmd();
		  $refresh->setName(__('Rafraichir', __FILE__));
	  }
	  $refresh->setEqLogic_id($this->getId());
	  $refresh->setLogicalId('refresh');
	  $refresh->setType('action');
	  $refresh->setSubType('other');
	  $refresh->save();
	  
	  $title = $this->getCmd(null, 'titre');
	  if (!is_object($title)) {
		  $title = new nasaapiCmd();
		  $title->setName(__('Titre', __FILE__));
	  }
	  $title->setEqLogic_id($this->getId());
	  $title->setLogicalId('titre');
	  $title->setType('info');
	  $title->setSubType('string');
	  $title->save();
	  
	  $urldelimage = $this->getCmd(null, 'url');
	  if (!is_object($urldelimage)) {
		  $urldelimage = new nasaapiCmd();
		  $urldelimage->setName(__('URL', __FILE__));
	  }
	  $urldelimage->setEqLogic_id($this->getId());
	  $urldelimage->setLogicalId('url');
	  $urldelimage->setType('info');
	  $urldelimage->setSubType('string');
	  $urldelimage->save();
}

  // Fonction exécutée automatiquement avant la suppression de l'équipement
  public function preRemove() {
  }

  // Fonction exécutée automatiquement après la suppression de l'équipement
  public function postRemove() {
  }

  /*
  * Permet de crypter/décrypter automatiquement des champs de configuration des équipements
  * Exemple avec le champ "Mot de passe" (password)
  public function decrypt() {
    $this->setConfiguration('password', utils::decrypt($this->getConfiguration('password')));
  }
  public function encrypt() {
    $this->setConfiguration('password', utils::encrypt($this->getConfiguration('password')));
  }
  */

  /*
  * Permet de modifier l'affichage du widget (également utilisable par les commandes)
  public function toHtml($_version = 'dashboard') {}
  */

  /*
  * Permet de déclencher une action avant modification d'une variable de configuration du plugin
  * Exemple avec la variable "param3"
  public static function preConfig_param3( $value ) {
    // do some checks or modify on $value
    return $value;
  }
  */

  /*
  * Permet de déclencher une action après modification d'une variable de configuration du plugin
  * Exemple avec la variable "param3"
  public static function postConfig_param3($value) {
    // no return value
  }
  */

  /*     * **********************Getteur Setteur*************************** */

}

class nasaapiCmd extends cmd {
  /*     * *************************Attributs****************************** */

  /*
  public static $_widgetPossibility = array();
  */

  /*     * ***********************Methode static*************************** */


  /*     * *********************Methode d'instance************************* */

  /*
  * Permet d'empêcher la suppression des commandes même si elles ne sont pas dans la nouvelle configuration de l'équipement envoyé en JS
  public function dontRemoveCmd() {
    return true;
  }
  */

  // Exécution d'une commande
  public function execute($_options = array()) {
	  $eqlogic = $this->getEqLogic(); //récupère l'éqlogic de la commande $this
	  switch ($this->getLogicalId()) { //vérifie le logicalid de la commande
	    case 'refresh': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm .
		$data = $eqlogic->getAPOD(); // Récupère les données de l'API de la NASA
        $eqlogic->checkAndUpdateCmd('explanation', $data[0]); // Met à jour la commande "explication" avec l'explication de la photo
        $eqlogic->checkAndUpdateCmd('url', $data[1]); // Met à jour la commande "url" avec l'URL de la photo
        $eqlogic->checkAndUpdateCmd('titre', $data[2]); // Met à jour la commande "titre" avec le titre de la photo
		break;
	    }
	}
  public function toHtml($_version = 'dashboard') {
	  $replace = $this->preToHtml($_version);
      if (!is_array($replace)) {
          return $replace;
      }
      $version = jeedom::versionAlias($_version);

      $url = $this->getConfiguration('url');
      $title = $this->getConfiguration('title');
      $explanation = $this->getConfiguration('explanation');
      
      $replace['#image#'] = $url;
      $replace['#title#'] = $title;
      $replace['#explanation#'] = $explanation;


      /*if ($version == 'v4') {
          $replace['#background#'] = $this->getDisplay('background', 'dashboard');
      }*/
      return $this->postToHtml($_version, template_replace($replace, getTemplate('core', $version, 'nasaapiwidget', 'nasaapi')));//  retourne notre template qui se nomme eqlogic pour le widget	  

    }

		 

  /*     * **********************Getteur Setteur*************************** */

}

Pour être plus rapide voici la fonction toHtml() (qui est dans le fichier du dessus mais au moins pas besoin de chercher :slight_smile: ):

  public function toHtml($_version = 'dashboard') {
	  $replace = $this->preToHtml($_version);
      if (!is_array($replace)) {
          return $replace;
      }
      $version = jeedom::versionAlias($_version);

      $url = $this->getConfiguration('url');
      $title = $this->getConfiguration('title');
      $explanation = $this->getConfiguration('explanation');
      
      $replace['#image#'] = $url;
      $replace['#title#'] = $title;
      $replace['#explanation#'] = $explanation;


      /*if ($version == 'v4') {
          $replace['#background#'] = $this->getDisplay('background', 'dashboard');
      }*/
      return $this->postToHtml($_version, template_replace($replace, getTemplate('core', $version, 'nasaapiwidget', 'nasaapi')));//  retourne notre template qui se nomme eqlogic pour le widget	  

    }

et le fihier core/template/dashboard/nasaapiwidget.html :

<div class="nasaapiwidget">
    <img src="#image#" alt="Nasa Image of the Day">
    <h2>#title#</h2>
    <p>#explanation#</p>
</div>

Si quelqu’un sait ou ca bloque, son aide serait la bienvenue.
Si besoin d’info complementaire, n’hésitez pas.:upside_down_face:
Merci d’anvance :slight_smile:

Bonjour,

Une erreur 500 c’est probablement une erreur de syntaxe.
Et en cas d’erreur 500 il faut toujours regarder le log http.error; la réponse s’y trouve.

Encore un nouveau post pour ces images!!!
A quoi servent les réponses qui vous ont été faites si vous les ignorez?

C’est essentiel d’avoir le contexte. Elle n’est pas dans la bonne classe. nasaapi

Vous avez oublié le post ? L'état ne s'actualise et reste à 0 avec le message d'erreur: {"state":"ok","result":"0"} - #16 par jpty
Je ne vois pas de trace de la fonction qui récupère l’image sur le site de la Nasa et la stocke localement pour que le navigateur puisse l’afficher. Vous vous rapprochez du pb de CSP.
Dans le post oublié, je vous ai également écrit de mettre les checkAndUpdateCmd dans la fonction getAPOD afin que les commandes de l’eqLogic soient renseignées. Ce que retourne getAPOD dans le cronHourly ne va jamais être affecté aux commandes.

Pour le contenu du fichier nasaapiwidget.html , prenez exemple sur le template fourni par le core:
core/template/dashboard/eqLogic.html en remplaçant #cmd# par ce que vous avez écrit.

1 « J'aime »

j’ai regardez dasn les logs et j’ai ce message d’erreur,

0000|[Sun May 14 15:18:27.205463 2023] [php7:error] [pid 11038] [client 172.17.0.1:60104] PHP Fatal error:  Uncaught Error: Call to undefined method nasaapiCmd::preToHtml() in /var/www/html/plugins/nasaapi/core/class/nasaapi.class.php:238
0001|Stack trace:
0002|#0 /var/www/html/core/class/eqLogic.class.php(877): nasaapiCmd->toHtml('dashboard', '')
0003|#1 /var/www/html/core/ajax/object.ajax.php(147): eqLogic->toHtml('dashboard')
0004|#2 /var/www/html/core/ajax/object.ajax.php(193): jeeAjax_objectToHtml('1', 'dashboard', 'all', 'all', '')
0005|#3 {main}
0006|thrown in /var/www/html/plugins/nasaapi/core/class/nasaapi.class.php on line 238, referer: http://192.168.2.250:9080/index.php?v=d&p=dashboard

ce qui a l’air de signifier que la méthode preToHtml() n’existe pas, ou quelque chose comme ca, je ne sais pas pourquoi.

Parce que ta méthode toHtml


Par ailleurs les valeurs récupérées actuellement dans la config ne devrait pas être dans la config (ce n’est pas de la config) mais dans des commandes.
Il y a une différence importante car la config est en db donc ça fait des écritures et lectures en db à chaque utilisation.

Bonjour, je me souvient bien de votre reponse qui était très intéressante, cependant je n’avais pas forcement approfondi le sujet car j’ai trouver un sujet ou le dev avait pas l’air d’avoir importer l’image en local, ou alors je me trompe. Mais la en aillant remis un lien du sujet ou l’on avait déjà discuté je viens de me rendre comtpe que vous aviez apporter une nouvelle réponse. Je ne l’avais pas vue car aucune notification ne m’avais été envoyé, enfin bref l’a n’est pas le sujet. Je vais essayer de repondre a ce que je dois repondre ici et repondre aussi sur l’autre sujet du coup.
J’ai essayer de m’inspirer de divers plugin pour le fichier core/template/dashboard/eqLogic.html (que j’avais rennomer nasaapiwidget.html mais je ne suis revenue à la normale). Ensuite je viens de modifier la fonction getAPOD pour que les commande sois renseigné. Maintenant je vais donc essayer de stocker les image en local.

En faisant les différentes corrections dans toHtml telle que la recup de la valeur des commandes préconisée par Mips, j’obtiens ce message:


Preuve qu’il y a bien un pb de CSP.
Si vous n’avez pas ce pb, c’est que le serveur apache de votre Jeedom est configuré en mode non sécurisé.

NB: Je n’étais pas parti sur un template avec la fonction toHtml mais sur un widget (simple et épuré) affecté à la commande:
Nom du fichier: cmd.info.string.NasaImage.html dans le répertoire core\template\dashboard du plugin.

<div class="cmd cmd-widget #history#" data-type="info" data-subtype="string" data-template="custom" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
  <div class="title #hide_name#">
    <span class="cmdName">#name_display#</span>
  </div>
  <div class="content-sm">
    <img src="#state#" style="border: 1px solid #ddd; border-radius: 4px; padding: 5px; width:300px;"/>
    <a href="http://jeedom:/#state#" target="blank"><i style="font-size:24px" class="icon mdi-resize"></i></a>
  </div>
</div>

Oh merci! Déjà maintenant il n’y plus de message d’erreur mais les image ne s’affiche pas, logique…
Merci pour les explication complementaire.

Super merci, je vais donc essayer de l’enregistrer en local pour eviter ce soucis, je vosi si j’ai le temps ce soir, sinon ca seras dasn la semaien :wink: merci encore.