Proposer fichier au téléchargement dans un plugin

flipflipflipflip Membre
26 mai modifié dans Discussions générales

Bonjour, j'ai créé un plugin qui propose de télécharger (en autre) un fichier qui est le résultat d'une liste de données stockées et gérées par le plugin.

Pour accéder à mon plugin j'ai créé une page statique qui contient un hook qui appelle le plugin. Toutes les actions sont réalisées autour de cette page statique. Pour proposer le fichier au téléchargement je génère une url qui ressemble à ça : http://wxp/index.php?static18/portail&p=export&a=sorders&v=10205|10|1,2|1,2,3

La fonction php en charge de générer le fichier et forcer le téléchargement :

   public function sorders($value) {
      $value = explode('|', $value);
      [.... Code de génération du fichier...]
      $file = './plugins/portail/tmp/export/'.$client[0]['bpcnum'].'-'.$client[0]['bpaadd'].'.xlsx';
      if(file_exists($file)) {
         header('Content-Description: File Transfer');
         header('Content-Type: application/download');
         header('Content-Disposition: attachment; filename='.basename($file));
         header('Content-Transfer-Encoding: binary');
         header('Expires: 0');
         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
         header('Pragma: no-cache');
         header('Content-Length: '.filesize($file));
         readfile($file);
         exit;
      } else {
         return false;
      }
   }

Le fichier ce génère bien et est valide (je peux l'ouvrir en le téléchargeant via filezilla), mais lorsque je veux l'ouvrir dans Excel il est vide. J'ai fais le même test en générant un fichier texte et surprise il contient

<!DOCTY

Donc de ce que je comprends est que header ne renvoie pas le fichier mais la page. J'ai essayé de voir le fonctionnement de la fonction sendTelechargement de plxMotor et en fait c'est un paramètre à passer dans l'url (telechargement ou download) pour n'afficher aucun éléments html et renvoyer directement le header. Le problème est que comme je passe par une page statique mon url contient déjà le mot clé "static" que je ne peux pas remplacer par "telechargement" sinon plus d'accès au plugin :(

Je vois pas trop comment contourner le problème, est-ce que vous avez une idée ?

Merci d'avance.

J'ai un string de l'array

Mots clés:

Réponses

  • flipflipflipflip Membre

    Je continue mes recherches. Ce week-end je me suis dis que c'était tout con, j'avais juste à ajouter une regex dans la fonction preChauffage pour gérer les url du type http://azs/index.php?static18/portail/download/&p=export&a=sorders&v=10205|10|1,2|1,2,3. Ce qui donne

          elseif($this->get AND preg_match('/^(static([0-9-]+)\/portail\/telechargement|static([0-9-]+)\/portail\/download)\/(.+)$/',$this->get,$capture)) { 
              [... Adapter le code ...]
             } else { 
                $this->error404(L_DOCUMENT_NOT_FOUND); 
             } 
          }
    

    Je fais un test sur https://regex101.com/r/FeiaNB/2 et tout est ok. Mais il y a un problème, au début de la fonction il y a déjà une regex qui intercepte les pages statiques, du coups la mienne n'est jamais traitée.

    J'ai un string de l'array

  • flipflipflipflip Membre

    Ouffff après pas mal de recherches et de prises de têtes j'ai trouvé la solution.

    Dans mon plugin j'utilise le hook plxMotorPreChauffageBegin et j'injecte le code suivant :

    $string = "if(\$this->get AND preg_match('/^(static([0-9]+)\/portail\/telechargement|static([0-9]+)\/portail\/download)\/(.+)$/',\$this->get,\$capture)) {
      \$this->mode = 'telechargement'; # Mode telechargement
      \$this->cible = \$capture[2];
      \$this->plxPlugins->aPlugins['portail']->_portailExports->sorders(".$value[0].", '".$value[1]."', '".$value[2]."', '".$value[3]."');
    }";
    
    echo "<?php ".$string."; ?>";
    

    J'ai un string de l'array

Connectez-vous ou Inscrivez-vous pour répondre.