IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

Fonction PHP et AJAX


Sujet :

AJAX

  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 299
    Points : 67
    Points
    67
    Par défaut Fonction PHP et AJAX
    Bonjour,
    J'ai un code qui ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function PHP() { 
    ..
    }
    <button target="_blank">PDF</button>
    Cette fonction php génère un PDF de données lorsqu'elle est exécutée.
    J'ai besoin que mon bouton exécute cette fonction lorsque je clique (sur le bouton).
    Seulement le PHP est déjà lancé, donc je vais devoir passer par de l'AJAX.
    Je voudrai passer l'ensemble de ma fonction PHP vers une nouvelle page et ne pas l'exécuter où elle est, car elle et le bouton se situent sur une modal Boostrap qui ne me permet pas de rendre un PDF correct.
    Je pense que la solution ici est l'AJAX.

    J'aimerai si possible que vous me proposiez une façon d'emmener ma fonction vers une autre page vierge, et de l'exécuter. Ma fonction doit garder toutes ses données (elle charge des données elle-même d'une liste AJAX, il faut qu'elle les conserve et les exécute sur la nouvelle page).

    Auriez vous un départ de code pour me guider là dessus? merci d'avance

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bonsoir,
    Ton code est un peu hors contexte, on ne sait pas s’il s’agit de JavaScript ou de PHP. Dans les deux cas, il n’est pas syntaxiquement correct, mais je suppose que c’est seulement dû au copier-coller.
    As-tu un début de code ajax ? Des messages d’erreur éventuels ? Pour l’instant il n’y a pas assez de détails, on ne peut pas t’aider.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 299
    Points : 67
    Points
    67
    Par défaut
    Je n'ai pas d'erreur, je demande simplement comment je dois m'y prendre pour exécuter une fonction PHP à partir d'un button.
    Oui en effet pour la syntaxe tu dois parler des balises php, bien sûr elles y sont, ce n'est pas ça le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    function PHP() { 
    ..
    } ?>
    <button target="_blank">PDF</button>
    Ce bouton doit exécuter ma fonction PHP dans un nouvel onglet. Comment s'y prendre? Quels méthodes? AJAX? peux-tu me proposer un début de code?
    Contrainte : plusieurs variables de cette fonction PHP sont remplis par une liste déroulante ajax en amont (c'est à dire avant la fonction PHP).
    Merci d'avance

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- Il me semblait pourtant que tu connaissais le fonctionnement d'Ajax, non ?

    2- Là, il faut que :
    • ton bouton lance un script JS sur (on)click
    • dans lequel tu récupères les données utiles (en JS, donc)
    • que tu transmets, via Ajax, à un fichier PHP externe
    • dans lequel tu lances ta fonction PHP.

    Ensuite,... Ben... Tu n'as pas expliqué ce que tu veux faire du résultat (fichier pdf créé).
    D'ailleurs, on ne sait pas ce que ta fonction fait concrètement...
    Dernière modification par Invité ; 30/10/2019 à 17h44.

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    La solution la plus simple, étant donné que tu souhaites ouvrir un nouvel onglet, c’est d’utiliser <a>. Ainsi, même pas besoin d’ajax. Par contre, tu dois être conscient que la page ne s’ouvrira pas forcément dans un nouvel onglet, car au bout du compte, c’est l’utilisateur ou l’utilisatrice qui décide, via les paramètres de son navigateur.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a target="_blank" href="script-pdf.php">PDF</a>
    Tu peux utiliser CSS pour donner au lien l’apparence d’un bouton.

    Le fichier script-pdf.php contiendra la fonction que tu as déjà écrite, et une partie de traitement des données $_GET (un clic sur un lien est une requête HTTP GET) permettant de savoir quel PDF il faut générer. Les variables de cette « liste ajax » dont tu parles passeront probablement par là. Il faut donc utiliser un peu de JavaScript pour rajouter les paramètres à l’URL du lien. Ou alors tout faire généner par PHP au départ.

    L’inconvénient de GET est qu’il ne permet pas d’authentifier l’utilisateur / l’utilisatrice, ni de protéger des données sensibles. Si besoin, tu peux utiliser une session PHP pour que les données restent côté serveur.

    Si GET ne te plaît pas, tu peux utiliser un formulaire pour envoyer une requête POST. Le principe reste le même :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <form target="_blank" method="post" action="script-pdf.php">
      <input type="submit" value="PDF" />
      <input type="hidden" name="param1" value="value1" />
    </form>
    Note que, en fonction des navigateurs, il n’est pas toujours possible de styler un bouton de formulaire comme on veut.
    Les <input type="hidden"> te permettront d’ajouter des données POST, que ton script PHP pourra lire dans le tableau $_POST.




    Si tu préfères une solution ajax, sache qu’il y a un problème plus gros encore concernant l’ouverture du nouvel onglet. Je te renvoie à la lecture du paragraphe Bonnes pratiques dans la doc de window.open pour connaître tous les détails. Tu préfèreras peut-être rester sur la même page et afficher le PDF dans un élément HTML superposé au reste (une solution qui a plein de noms : fenêtre modale, lightbox, overlay, popover, etc.). (Mais même dans ce cas, il faudra afficher le PDF dans une balise <iframe> ou <object> et je ne sais pas à quel point c’est fiable.)

    On garde le même script-pdf.php que pour la solution HTML. Je reprends ton bouton :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <button id="button-pdf">PDF</button>
    (L’attribut target n’a pas de signification sur <button>.)
    L’id permet de manipuler le bouton via JavaScript.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    document.addEventListener("DOMContentLoaded", function () {
      "use strict"; // voir https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Strict_mode
     
      const button = document.getElementById("button-pdf");
     
      // écoute les clics sur le bouton
      button.onclick = function () {
        // désactive le bouton pour éviter les multi-clics
        button.disabled = true;
     
        // ici on peut ajouter un indicateur de chargement, à la place ou à côté du bouton
     
        // ajout des paramètres de requête : à toi d’aller les piocher dans la fameuse « liste ajax »
        // je ne sais pas à quoi ressemble cette liste, donc je ne peux pas entrer dans les détails
        const params = ... ;
     
        // initialise une requête ajax
        const req = new XMLHttpRequest();
        req.open("GET", "script-pdf.php?" + params);
     
        // indique à ajax qu’on veut recevoir un fichier contenant des données binaires
        req.responseType = "blob";
     
        // si la requête est POST, il faut ajouter l’encodage à la main
        //req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
     
        // fonction de rappel
        req.onload = function () {
          ...
        };
     
        // si la requête est POST, c’est ici qu’il faut passer params
        req.send();
      };
    });
    Je m’interromps parce que la suite mérite quelques explications. Pour commencer, il y a le problème de permission avec window.open. La doc que j’ai liée explique en détail comment faire, je te laisse coder cette partie.
    Tu auras peut-être remarqué le req.responseType = "blob", j’ai mis ça parce que j’ai supposé que ton serveur allait servir un fichier PDF complet, et uniquement ce fichier, en réponse à la requête ajax. Ce responseType permet d’utiliser createObjectURL pour obtenir une URL locale (dans la mémoire du navigateur) qu’on peut alors passer à window.open.
    Comme ça occupe de la mémoire vive, il faut penser à la libérer quand on n’en a plus besoin avec revokeObjectURL.

    Au sein de la fonction req.onload, on aura donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    const blobUrl = URL.createObjectURL(req.response);
    // passe blobUrl à ta fonction qui gère les popups
     
    // à la fin
    URL.revokeObjectURL(blobUrl);
     
    // à cet endroit on peut aussi réactiver le bouton si tu estimes que ça apporte quelque chose
    button.disabled = false;
    Voilà, j’ai essayé d’expliquer au mieux, mais avec les informations que tu n’as pas données, il y a des zones que je n’ai pas pu couvrir. Cela dit, n’hésite pas à poser des questions
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 299
    Points : 67
    Points
    67
    Par défaut
    Merci pour vos réponses à tous les 2.
    J'ai mis en place un ajax qui me renvoie vers mon fichier php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //variable que je récupère d'un autre ajax, ça tourne pas de soucis de ce côté 
    <input value="<?php echo $PDFdevis['client_societe'] ?>" class="pdf_client" />
            <script>
                function getPDF()
                {		
                $.ajax({
                    method: "POST",
                    url: "modal_header/Actions/ajax/devisPDF.php",
                    data: {"pdf_client": $(".pdf_client").val()}
                })
                .done(function( retour_html ) {
                    $("#devisPDF").html( retour_html );
                    window.open('modal_header/Actions/ajax/devisPDF.php');
                })
                .fail(function() {
                    alert( "error getPDF()" );
                });
                }
            </script>
    Le fichier devisPDF ( j'utilise fpdf) :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    <?php
          require('/opt/lampp/htdocs/Contact/Include/connection.php');
     
          require('/opt/lampp/htdocs/Contact/Atelier/fpdf/fpdf.php');
     
          // le mettre au debut car plante si on declare $mysqli avant !
          $pdf = new FPDF( 'P', 'mm', 'A4' );
     
          // on declare $mysqli apres !
          $mysqli = new mysqli('localhost', 'root', '', 'contact');
          // cnx a la base
          mysqli_select_db($mysqli, 'contact') or die('Erreur de connection a la BDD : ' .mysqli_connect_error());
     
          $var_id_facture = 13;
     
          // on sup les 2 cm en bas
          $pdf->SetAutoPagebreak(False);
          $pdf->SetMargins(0,0,0);
     
          // nb de page pour le multi-page : 18 lignes
          //$sql = 'select count(*) FROM ligne_facture where id_facture=' .$var_id_facture;
          $sql = 'select count(*) FROM facture WHERE facture_id=' .$var_id_facture;
          $result = mysqli_query($mysqli, $sql)  or die ('Erreur SQL : ' .$sql .mysqli_connect_error() );
          $row_client = mysqli_fetch_row($result);
          mysqli_free_result($result);
          $nb_page = $row_client[0];
          $sql = 'select abs(FLOOR(-' . $nb_page . '/18))';
          $result = mysqli_query($mysqli, $sql)  or die ('Erreur SQL : ' .$sql .mysqli_connect_error() );
          $row_client = mysqli_fetch_row($result);
          mysqli_free_result($result);
          $nb_page = $row_client[0];
     
          $num_page = 1; $limit_inf = 0; $limit_sup = 18;
          While ($num_page <= $nb_page)
          {
              $pdf->AddPage();
     
              // logo : 80 de largeur et 55 de hauteur
              $pdf->Image('/opt/lampp/htdocs/Contact/Atelier/modal_header/Actions/ajax/favicon.png', 10, 10, 50, 50);
     
              // n° page en haute à droite
              $pdf->SetXY( 120, 5 ); $pdf->SetFont( "Arial", "B", 12 ); $pdf->Cell( 160, 8, $num_page . '/' . $nb_page, 0, 0, 'C');
     
              // n° facture, date echeance et reglement et obs
              $select = 'select * FROM facture WHERE facture_id=' .$var_id_facture;
              $result = mysqli_query($mysqli, $select)  or die ('Erreur SQL : ' .$select .mysqli_connect_error() );
              $row = mysqli_fetch_row($result);
              mysqli_free_result($result);
     
     
     
              // nom du fichier final
              $nom_file = "facture.pdf";
     
              // date facture
     
              $pdf->SetFont('Arial','',11); $pdf->SetXY( 122, 30 );
              $pdf->Cell( 60, 8, "MA VILLE, le dd");
              // si derniere page alors afficher total
              if ($num_page == $nb_page)
              {
                  // les totaux, on n'affiche que le HT. le cadre après les lignes, demarre a 213
                  $pdf->SetLineWidth(0.1); $pdf->SetFillColor(192); $pdf->Rect(5, 213, 90, 8, "DF");
                  // HT, la TVA et TTC sont calculés après
                  $nombre_format_francais = "Total HT : XX €";
                  $pdf->SetFont('Arial','',10); $pdf->SetXY( 95, 213 ); $pdf->Cell( 63, 8, $nombre_format_francais, 0, 0, 'C');
                  // en bas à droite
                  $pdf->SetFont('Arial','B',8); $pdf->SetXY( 181, 227 ); $pdf->Cell( 24, 6, number_format($row[3], 2, ',', ' '), 0, 0, 'R');
     
                  // trait vertical cadre totaux, 8 de hauteur -> 213 + 8 = 221
                  $pdf->Rect(5, 213, 200, 8, "D"); $pdf->Line(95, 213, 95, 221); $pdf->Line(158, 213, 158, 221);
     
                  // reglement
                  $pdf->SetXY( 5, 225 ); $pdf->Cell( 38, 5, "Mode de Règlement XXXX:");
                  // echeance
                  $pdf->SetXY( 5, 230 ); $pdf->Cell( 38, 5, "Date Echéance XXXX");
              }
     
              // observations
              $pdf->SetFont( "Arial", "BU", 10 ); $pdf->SetXY( 5, 75 ) ; $pdf->Cell($pdf->GetStringWidth("Observations"), 0, "Observations", 0, "L");
              $pdf->SetFont( "Arial", "", 10 ); $pdf->SetXY( 5, 78 ) ; $pdf->MultiCell(190, 4, $row[5], 0, "L");
     
              // adr fact du client
              $select = "select * FROM client c join facture f on c.client_societe=f.facture_client where facture_id=" . $var_id_facture;
              $result = mysqli_query($mysqli, $select)  or die ('Erreur SQL : ' .$select .mysqli_connect_error() );
              $row_client = mysqli_fetch_row($result);
              mysqli_free_result($result);
              $pdf->SetFont('Arial','B',11); $x = 110 ; $y = 50;
              $pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, $row_client[0], 0, 0, ''); $y += 4;
              if ($row_client[1]) { $pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, $row_client[1], 0, 0, ''); $y += 4;}
              if ($row_client[2]) { $pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, $row_client[2], 0, 0, ''); $y += 4;}
              if ($row_client[3]) { $pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, $row_client[3], 0, 0, ''); $y += 4;}
              if ($row_client[4] || $row_client[5]) { $pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, $row_client[4] . ' ' .$row_client[5] , 0, 0, ''); $y += 4;}
              if ($row_client[6]) { $pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, 'N° TVA Intra : ' . $row_client[6], 0, 0, '');}
     
              // ***********************
              // le cadre des articles
              // ***********************
              // cadre avec 18 lignes max ! et 118 de hauteur --> 95 + 118 = 213 pour les traits verticaux
              $pdf->SetLineWidth(0.1); $pdf->Rect(5, 95, 200, 118, "D");
              // cadre titre des colonnes
              $pdf->Line(5, 105, 205, 105);
              // les traits verticaux colonnes
              $pdf->Line(145, 95, 145, 213); $pdf->Line(158, 95, 158, 213); $pdf->Line(176, 95, 176, 213); $pdf->Line(187, 95, 187, 213);
              // titre colonne
              $pdf->SetXY( 1, 96 ); $pdf->SetFont('Arial','B',8); $pdf->Cell( 140, 8, "Libellé", 0, 0, 'C');
              $pdf->SetXY( 145, 96 ); $pdf->SetFont('Arial','B',8); $pdf->Cell( 13, 8, "Qté", 0, 0, 'C');
              $pdf->SetXY( 156, 96 ); $pdf->SetFont('Arial','B',8); $pdf->Cell( 22, 8, "PU HT", 0, 0, 'C');
              $pdf->SetXY( 177, 96 ); $pdf->SetFont('Arial','B',8); $pdf->Cell( 10, 8, "TVA", 0, 0, 'C');
              $pdf->SetXY( 185, 96 ); $pdf->SetFont('Arial','B',8); $pdf->Cell( 22, 8, "TOTAL HT", 0, 0, 'C');
     
              // les articles
              $pdf->SetFont('Arial','',8);
              $y = 97;
              // 1ere page = LIMIT 0,18 ;  2eme page = LIMIT 18,36 etc...
              $sql = 'select * FROM facture where facture_id=' .$var_id_facture;
              $sql .= ' LIMIT ' . $limit_inf . ',' . $limit_sup;
              $res = mysqli_query($mysqli, $sql)  or die ('Erreur SQL : ' .$sql .mysqli_connect_error() );
              while ($data =  mysqli_fetch_assoc($res))
              {
                  // libelle
                  $pdf->SetXY( 7, $y+9 ); $pdf->Cell( 140, 5, $data['facture_id'], 0, 0, 'L');
                  // qte
                  $pdf->SetXY( 145, $y+9 ); $pdf->Cell( 13, 5, strrev(wordwrap(strrev($data['facture_id']), 3, ' ', true)), 0, 0, 'R');
                  // PU
                  $nombre_format_francais = number_format($data['facture_id'], 2, ',', ' ');
                  $pdf->SetXY( 158, $y+9 ); $pdf->Cell( 18, 5, $nombre_format_francais, 0, 0, 'R');
                  // Taux
                  $nombre_format_francais = number_format($data['facture_id'], 2, ',', ' ');
                  $pdf->SetXY( 177, $y+9 ); $pdf->Cell( 10, 5, $nombre_format_francais, 0, 0, 'R');
                  // total
                  $nombre_format_francais = number_format($data['facture_id']*$data['facture_id'], 2, ',', ' ');
                  $pdf->SetXY( 187, $y+9 ); $pdf->Cell( 18, 5, $nombre_format_francais, 0, 0, 'R');
     
                  $pdf->Line(5, $y+14, 205, $y+14);
     
                  $y += 6;
              }
              mysqli_free_result($res);
     
              // si derniere page alors afficher cadre des TVA
              if ($num_page == $nb_page)
              {
                  // le detail des totaux, demarre a 221 après le cadre des totaux
                  $pdf->SetLineWidth(0.1); $pdf->Rect(130, 221, 75, 24, "D");
                  // les traits verticaux
                  $pdf->Line(147, 221, 147, 245); $pdf->Line(164, 221, 164, 245); $pdf->Line(181, 221, 181, 245);
                  // les traits horizontaux pas de 6 et demarre a 221
                  $pdf->Line(130, 227, 205, 227); $pdf->Line(130, 233, 205, 233); $pdf->Line(130, 239, 205, 239);
                  // les titres
                  $pdf->SetFont('Arial','B',8); $pdf->SetXY( 181, 221 ); $pdf->Cell( 24, 6, "TOTAL", 0, 0, 'C');
                  $pdf->SetFont('Arial','',8);
                  $pdf->SetXY( 105, 221 ); $pdf->Cell( 25, 6, "Taux TVA", 0, 0, 'R');
                  $pdf->SetXY( 105, 227 ); $pdf->Cell( 25, 6, "Total HT", 0, 0, 'R');
                  $pdf->SetXY( 105, 233 ); $pdf->Cell( 25, 6, "Total TVA", 0, 0, 'R');
                  $pdf->SetXY( 105, 239 ); $pdf->Cell( 25, 6, "Total TTC", 0, 0, 'R');
     
                  // les taux de tva et HT et TTC
                  $col_ht = 0; $col_tva = 0; $col_ttc = 0;
                  $taux = 0; $tot_tva = 0; $tot_ttc = 0;
                  $x = 130;
                  $sql = 'select * FROM facture where facture_id=' .$var_id_facture;
                  $res = mysqli_query($mysqli, $sql)  or die ('Erreur SQL : ' .$sql .mysqli_connect_error() );
                  while ($data =  mysqli_fetch_assoc($res))
                  {
                      $pdf->SetXY( $x, 221 ); $pdf->Cell( 17, 6, $data['facture_id'] . ' %', 0, 0, 'C');
                      $taux = $data['facture_id'];
     
                      $nombre_format_francais = number_format($data['facture_id'], 2, ',', ' ');
                      $pdf->SetXY( $x, 227 ); $pdf->Cell( 17, 6, $nombre_format_francais, 0, 0, 'R');
                      $col_ht = $data['facture_id'];
     
                      $col_tva = $col_ht - ($col_ht * (1-($taux/100)));
                      $nombre_format_francais = number_format($col_tva, 2, ',', ' ');
                      $pdf->SetXY( $x, 233 ); $pdf->Cell( 17, 6, $nombre_format_francais, 0, 0, 'R');
     
                      $col_ttc = $col_ht + $col_tva;
                      $nombre_format_francais = number_format($col_ttc, 2, ',', ' ');
                      $pdf->SetXY( $x, 239 ); $pdf->Cell( 17, 6, $nombre_format_francais, 0, 0, 'R');
     
                      $tot_tva += $col_tva ; $tot_ttc += $col_ttc;
     
                      $x += 17;
                  }
                  mysqli_free_result($res);
     
                  $nombre_format_francais = "Net à payer TTC : " . number_format($tot_ttc, 2, ',', ' ') . " €";
                  $pdf->SetFont('Arial','B',12); $pdf->SetXY( 5, 213 ); $pdf->Cell( 90, 8, $nombre_format_francais, 0, 0, 'C');
                  // en bas à droite
                  $pdf->SetFont('Arial','B',8); $pdf->SetXY( 181, 239 ); $pdf->Cell( 24, 6, number_format($tot_ttc, 2, ',', ' '), 0, 0, 'R');
                  // TVA
                  $nombre_format_francais = "Total TVA : " . number_format($tot_tva, 2, ',', ' ') . " €";
                  $pdf->SetFont('Arial','',10); $pdf->SetXY( 158, 213 ); $pdf->Cell( 47, 8, $nombre_format_francais, 0, 0, 'C');
                  // en bas à droite
                  $pdf->SetFont('Arial','B',8); $pdf->SetXY( 181, 233 ); $pdf->Cell( 24, 6, number_format($tot_tva, 2, ',', ' '), 0, 0, 'R');
              }
     
              // **************************
              // pied de page
              // **************************
              $pdf->SetLineWidth(0.1); $pdf->Rect(5, 260, 200, 6, "D");
              $pdf->SetXY( 1, 260 ); $pdf->SetFont('Arial','',7);
              $pdf->Cell( $pdf->GetPageWidth(), 7, "Clause de réserve de propriété (loi 80.335 du 12 mai 1980) : Les marchandises vendues demeurent notre propriété jusqu'au paiement intégral de celles-ci.", 0, 0, 'C');
     
              $y1 = 270;
              //Positionnement en bas et tout centrer
              $pdf->SetXY( 1, $y1 ); $pdf->SetFont('Arial','B',10);
              $pdf->Cell( $pdf->GetPageWidth(), 5, "REF BANCAIRE : FR76 xxx - BIC : xxxx", 0, 0, 'C');
     
              $pdf->SetFont('Arial','',10);
     
              $pdf->SetXY( 1, $y1 + 4 ); 
              $pdf->Cell( $pdf->GetPageWidth(), 5, "NOM SOCIETE", 0, 0, 'C');
     
              $pdf->SetXY( 1, $y1 + 8 );
              $pdf->Cell( $pdf->GetPageWidth(), 5, "ADRESSE 1 + CP + VILLE", 0, 0, 'C');
     
              $pdf->SetXY( 1, $y1 + 12 );
              $pdf->Cell( $pdf->GetPageWidth(), 5, "Tel + Mail + SIRET", 0, 0, 'C');
     
              $pdf->SetXY( 1, $y1 + 16 );
              $pdf->Cell( $pdf->GetPageWidth(), 5, "Adresse web", 0, 0, 'C');
     
              // par page de 18 lignes
              $num_page++; $limit_inf += 18; $limit_sup += 18; 
     
              $pdf->Output("I", 'devis.pdf'); 
     
          } ?>
    En image, ça donne ça :
    Nom : Capture d’écran de 2019-10-29 14-55-58.png
Affichages : 695
Taille : 118,8 Ko
    A présent, ce qu'il me reste, c'est de pouvoir transmettre des variables via l'AJAX vers ce devis (nom du client, articles, etc).
    J'ai tenté de faire un var_dump de la valeur passée par l'AJAX :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div id="devisPDF">
        <?php var_dump($_POST['pdf_client']); ?>
    </div>
    Mon soucis, c'est que cela renvois une valeur nulle et une erreur:
    Notice: Undefined index: pdf_client in /opt/lampp/htdocs/Contact/Atelier/modal_header/Actions/ajax/devisPDF.php on line 10
    NULL
    Fatal error: Uncaught Exception: FPDF error: Some data has already been output, can't send PDF file in /opt/lampp/htdocs/Contact/Atelier/fpdf/fpdf.php:271 Stack trace: #0 /opt/lampp/htdocs/Contact/Atelier/fpdf/fpdf.php(1063): FPDF->Error('Some data has a...') #1 /opt/lampp/htdocs/Contact/Atelier/fpdf/fpdf.php(999): FPDF->_checkoutput() #2 /opt/lampp/htdocs/Contact/Atelier/modal_header/Actions/ajax/devisPDF.php(229): FPDF->Output('I', 'devis.pdf') #3 {main} thrown in /opt/lampp/htdocs/Contact/Atelier/fpdf/fpdf.php on line 271
    Je pense que l'appel de la page via un window.open() dans l'AJAX tel qu'il est ne permet pas de transmettre ma variable.

    une idée?
    merci

    PS : côté de ma variable elle est bien envoyé vers la page:
    Nom : Capture d’écran de 2019-10-29 15-17-17.png
Affichages : 683
Taille : 45,0 Ko

  7. #7
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 299
    Points : 67
    Points
    67
    Par défaut
    J'ai trouvé d'où vient le problème. Dans la doc du site http://www.fpdf.org/ : FAQ, le 2) . Puis aussi le 8) qui spécifie qu'il ne faut pas utiliser d'AJAX...
    J'ai tenté de faire un simple echo "test"; ,j'ai une erreur. On ne peut pas envoyer de données au PDF en direct.
    Je vais creuser pour trouver une solution. Vais-je devoir passer par une page intermédiaire? Comment faire pour recevoir les variables envoyés par l'Ajax sans se taper l'erreur?
    Si vous avez une idée je suis preneur

    merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1-
    • Te rends-tu comptes que tu es le SEUL à comprendre ce que tu racontes ?
    • As-tu conscience que nous ne sommes pas derrière ton épaule, ni à voir ce qui se passe sur ton écran ?

    Ce qui est pénible avec toi, c'est que tu ne donnes que des brides d'informations à chaque fois.
    Et il faut souvent plusieurs messages pour pouvoir tout réunir et avoir une vue d'ensemble.

    2- Rien que cette phrase :
    Citation Envoyé par Zarkoffe Voir le message
    ...J'ai tenté de faire un simple echo "test"; ,j'ai une erreur.
    • Dans quel page as-tu fait cet echo ?
    • il y a quoi d'autre dans cette page ?
    • à quel endroit du script ?
    • ... ?

    Comment veux-tu qu'on te suive ??


    3- On a bien compris que tu as un "problème", mais on ne sais toujours pas :

    3.1- ce que tu as au départ :
    • un bouton, OK, mais quoi d'autre ?
    • De quels paramètres à transmettre parles-tu ?
    • et sous quelle forme sont-ils :issus d'un formulaire ? ou en BDD (et il suffit juste de transmettre un id, index auto-incrément) ?
    • (tu as aussi parlé d'une "modale Bootstrap... ?)
    • ... ?

    3.2-ce que tu veux faire comme traitement :
    • générer un PDF, OK (avec fPDF, OK)
    • qui doit contenir/intégrer les données reçues, OK (reste à savoir comment lui transmettre : à voir)
    • ... ?

    3.3- ce que tu veux obtenir à l'arrivée : tu veux en faire quoi, de ce PDF ?
    • l'afficher ? l'enregistrer ?
    • et tu veux rester sur la même page (d'où Ajax) ? ou passer sur une autre ?
    • ... ?


    N.B. "OK" = j'ai compris.

  9. #9
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Tu as eu une bonne idée de mettre un lien vers le site de fpdf, j’ai pu y comprendre une chose : ça a l’air d’être une bibli assez ancienne, et le mainteneur n’a probablement pas connaissance de la technique responseType = "blob".

    L’erreur “data has already been output” que tu reçois est très probablement dûe au fait que fpdf utilise la fonction header() pour envoyer l’en-tête HTTP Content-Type: application/pdf. Ce Content-Type n’est pas compatible avec des données HTML, ça explique pourquoi la génération échoue quand tu appelles var_dump().

    D’autre part, ton appel à window.open() est complètement sans relation avec la requête ajax qui précède. Dans les faits il s’agit d’une seconde requête HTTP, sans paramètres POST. Il y a deux choses importantes à propos de window.open() que tu as ratées dans mes explications précédentes :

    1. Qu’il faut commencer par vérifier si la méthode est autorisée ; ça marche peut-être chez toi, mais tôt ou tard il y aura un client ou une cliente qui rencontrera le problème, tu ne pourras pas l’esquiver. (Re)lis le guide du MDN que j’ai déjà cité (« Bonnes pratiques »).
    2. Qu’il faut utiliser la technique du blob que j’ai déjà expliquée, avec createObjectURL().

    Note importante : tu dois utiliser l’objet XMLHttpRequest natif pour gérer le blob, jQuery ne sait pas faire ça. Suis le code que je t’ai donné, et s’il y a un problème, reviens poser des questions
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  10. #10
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 299
    Points : 67
    Points
    67
    Par défaut
    Salut Watilin, merci beaucoup pour ta réponse.
    Que ce soit ce que tu dis à propos du header() de la librairie que j'utilise, ou la double requête HTTP dû à window.open, je crois que tu vises dans le mille.
    Je ne suis pas très à l'aise avec le JS/Jquery, mais en m'appuyant sur ton code je pense que j'ai un bon début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    <button id="button-pdf">PDF</button>
     
    <script>
            document.addEventListener("DOMContentLoaded", function () {
                "use strict"; // voir https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Strict_mode
     
                const button = document.getElementById("button-pdf");
     
                // écoute les clics sur le bouton
                button.onclick = function () {
                    // désactive le bouton pour éviter les multi-clics
                    button.disabled = true;
     
                    // ici on peut ajouter un indicateur de chargement, à la place ou à côté du bouton
     
                    // ajout des paramètres de requête : à toi d’aller les piocher dans la fameuse « liste ajax »
                    // je ne sais pas à quoi ressemble cette liste, donc je ne peux pas entrer dans les détails
                    const params = {"pdf_client": $(".pdf_client").val()} ;
     
                    // initialise une requête ajax
                    const req = new XMLHttpRequest();
                    req.open("GET", "modal_header/Actions/ajax/devisPDF.php?" + params);
     
                    // indique à ajax qu’on veut recevoir un fichier contenant des données binaires
                    req.responseType = "blob";
     
                    // si la requête est POST, il faut ajouter l’encodage à la main
                    //req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
     
                    // fonction de rappel
                    req.onload = function () {
                        const blobUrl = URL.createObjectURL(req.response);
                        // passe blobUrl à ta fonction qui gère les popups
                        openFFPromotionPopup();
     
                        // à la fin
                        URL.revokeObjectURL(blobUrl);
     
                        // à cet endroit on peut aussi réactiver le bouton si tu estimes que ça apporte quelque chose
                        button.disabled = false;
                    };
     
                    // si la requête est POST, c’est ici qu’il faut passer params
                    req.send();
                };
            });
            var WindowObjectReference = null; // variable globale
     
            function openFFPromotionPopup() {
                if (WindowObjectReference == null || WindowObjectReference.closed) {
                    WindowObjectReference = window.open("modal_header/Actions/ajax/devisPDF.php","PromoteFirefoxWindowName", "resizable=yes,scrollbars=yes,status=yes");
                }
                else {
                    WindowObjectReference.focus();
                }
            }
    </script>
    Lorsque je clique sur le button, rien ne se passe, et rien n'est visible dans la console. Si tu pouvais jeter un petit coup d'oeil sur ce qui peut te sembler louche... merci
    Il y a de grandes chances que je m'y sois pas tout à fait bien pris (notamment sur l'appel de la fonction "openFFPromotionPopup()").
    Pense tu que ta manière de procéder permettra de résoudre le problème que j'ai avec mon PDF?
    Ce Content-Type n’est pas compatible avec des données HTML, ça explique pourquoi la génération échoue
    Tu penses qu'on va pouvoir surpasser ce problème? Qu'on va pouvoir envoyer des données en ajax puis ensuite charger le PDF?

    Merci

Discussions similaires

  1. [AJAX] appeler fonction php en ajax
    Par cédric20 dans le forum AJAX
    Réponses: 2
    Dernier message: 09/06/2011, 10h59
  2. [AJAX] fonction php dans ajax
    Par Fabinounours dans le forum AJAX
    Réponses: 10
    Dernier message: 01/10/2009, 16h20
  3. [AJAX] Appel de fonction php avec ajax
    Par simoinfonet dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/05/2008, 11h39
  4. [AJAX] ajax updater et fonctions php
    Par john123 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/03/2008, 21h56
  5. [AJAX] [php] appel de fonction php dans evenement
    Par nicerico dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 20/11/2006, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo