Foreach + windows.open

Ce sujet est résolu
Default
,

Bonjour,

Mon application récupère des factures et je peux afficher le lien pour télécharger ces dernières grace à ce code :

<?php  
      foreach ($bills as $bill):
echo $bill["url"];
       endforeach; 
   ?>

Ce que je veux

Maintenant, plutot que de cliquer sur chaque lien, je souhaiterai un bouton pour cliquer sur toutes les urls afin de les télécharger d'un coup, alors j'essaye tant bien que mal de mélanger du PHP avec JS en utilisant la fonction windows.open mais aucun résultat.
Je ne connais pas trop la syntaxe à appliquer mais la seule solution que je vois serai de faire qq chose qui ressemble à ça :

<?php   if(isset($_POST["print"])) {  

        foreach ($bills as $bill):
             <script>
                         window.open(" <?$bill["url"]?> ");
              </script>
         endforeach; }
   ?>

Merci à vous si vous pouvez m'aider ;)

3 Réponse

Default
,

Salut,

Tu as une mauvaise approche de ton problème, il est généralement très difficile de mixer php & js comme tu le fais et c'est peu recommandé.
Une des solutions que tu peux utiliser et de générer les liens avec ton php et ensuite des les traiter grâce au javascript, par exemple

<?php  
    foreach ($bills as $key => $bill):
        echo "<a href=\"{$bill['url']}\" class=\"bills\" hidden=\"hidden\">Bill {$key}</a>";
     endforeach; 
?>

Ca va te servir à générer tes liens ( on les cache grace à l'attribut hidden car on ne veut pas les afficher sur l'écran ), on peut ensuite les traiter grâce au javascript par ex:

<script type="text/javascript">
  const bills = document.querySelectorAll(".bills")

  bills.forEach( (bill) => {
      //Traitement sur tes liens ( par exemple utiliser le window.open )
  })
</script>

Il faut evidement que tu ajoutes du code pour pouvoir executer le javascript quand tu cliques sur un bouton et que tu peaufines ce que j'ai écrit mais l'idée générale est là.

J'espère avoir pu t'aider, hésites pas à poser d'autres questions si c'est encore un peu floue !

Default
,

et question bête, pour ne pas les télécharger avec php directement via curl ?
https://www.php.net/manual/fr/curl.examples-basic.php

dans ta boucle while, du dl le fichier avec un appel à curl
il sera sur le serveur, mais tu peux ensuite les récupérer par ftp par exemple, ou faire un zip et proposer le fichier en téléchargement ;

<?php  

$zipname = 'enter_any_name_for_the_zipped_file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);

    foreach ($bills as $key => $bill) {
        $ch = curl_init($bill["url"]);
        $fp = fopen("ma_facture_{$key}.pdf", "w");
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_exec($ch);
        if(curl_error($ch)) {
            fwrite($fp, curl_error($ch));
        }
        curl_close($ch);
        fclose($fp);

        $zip->addFile($file);
}
$zip->close();

header('Content-Type: application/zip');

// Il sera nommé downloaded.pdf
header('Content-Disposition: attachment; filename="factures.zip"');
readfile($zipname);

?>

j'ai fait ça à la volée, il y a probablement des boulettes.

Default
,

Bonjour,

Merci à vous pour vos réponses, j'ai utilisé la solution de Narshe et ça fonctionne, je testerai un peu plus tard la seconde mais en tout cas merci beaucoup !