Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Editer la facture au format PDF
Dans cette
formation Php , sur la base de l'
application Web de facturation que nous avons développée, nous souhaitons proposer à l'administrateur, un bouton permettant d'éditer la
facture du client au
format PDF .
Et nous allons le voir, c'est une
classe offrant tous les objets nécessaires qui va permettre de disposer les éléments pour concevoir le document final par le
code Php .
Sources et présentation de la problématique
Cette solution doit être développée sur les travaux aboutis de la
facturation client . Nous devons donc les réceptionner.
La décompression fournit les fichiers de l'application Web pour la
facturation , l'
approvisionnement et la
gestion des stocks . Pour mener à bien ces travaux, vous devez disposer de la
base de données MySql stocks . Le cas échéant, vous devez la créer et importer le
fichier stocks.sql situé dans le
sous dossier bdd du dossier de décompression. Les informations du compte utilisateur à associer sont dévoilées dans le
fichier connexion.php du
sous dossier commun .
Bien sûr, ce projet doit être référencé dans
EasyPhp en spécifiant son adresse issue de l'explorateur Windows. Les deux serveurs,
Http et
Database , doivent être démarrés. Dès lors, nous pouvons débuter.
Depuis l'interface d'EasyPhp, cliquer sur le lien du projet,
Nous accédons ainsi à l'
interface Web d'approvisionnement des stocks . Nos travaux doivent porter sur la
facturation .
Dans le pied de page, cliquer sur la seconde icône,
Cette fois, nous accédons à l'interface de facturation.
Le principe est le suivant. L'administrateur désigne une
référence client à l'aide de la première liste déroulante. Puis, il s'agit d'ajouter les articles à la commande. Il désigne une
référence produit à l'aide de la seconde liste déroulante, saisit la
quantité achetée et clique sur le
bouton Ajouter . A chaque clic, les articles se cumulent dans la représentation de la facture, en bas de l'interface. A l'issue, l'utilisateur clique sur le
bouton Valider pour archiver la commande en
base de données MySql . Un message de succès est retourné à la fin du traitement.
Bouton pour éditer la facture
Une fois la commande validée, donc archivée en
base de données , nous proposons de greffer un
bouton d'édition en bas de la
facture client , soit en bas de l'interface. Ce bouton n'existe pas. Il doit donc être créé pour apparaître dynamiquement. Un calque de réception à piloter par le code client est nécessaire. Donc il doit posséder un identifiant. Souvenez-vous en effet, c'est la
fonction Javascript recolter , exploitant des
objets Ajax qui récolte les traitements réalisés par le serveur.
A la racine du dossier de décompression, cliquer droit sur le fichier facturation.php ,
Dans le menu contextuel, choisir de l'ouvrir avec un éditeur comme le Notepad ++,
En bas de la page Web, après la ligne 223 du div fermant, ajouter les deux calques mentionnés en gras dans l'extrait ci-dessous :
...
<div class="prix" style="font-weight:bold;">
1243.75
</div>
<div class="bord"></div>
</div>
<div style="float:left; width:5%; height:25px;"></div>
<div style="float:left; width:100%; height:auto;" id="editer">
</div>
</div>
</div>
<div style="float:left; width:10%; height:auto;"></div>
...
Nous ajoutons ces deux calques juste en-dessous de la facture. Le premier consiste à aérer la présentation. Il s'agit d'un calque vide d'une hauteur de 25 px. Le second est destiné à recevoir le bouton à créer dynamiquement, une fois la commande validée. C'est pourquoi nous lui attribuons l'
identifiant editer . C'est par ce nom désormais que nous pourrons le piloter par le
code client Javascript .
Enregistrer les modifications (CTRL + S) et remonter en haut de la page, jusqu'à découvrir la fonction Javascript recolter,
L'
instruction switch que nous y avions développée sert à réceptionner les données du serveur selon l'action enclenchée. Dans notre cas, il s'agit de la facturation identifiée par la dernière branche (case 'facturer').
...
case 'facturer':
if(transport.responseText=="ok")
alert("La facture a été validée avec succès");
else
alert("Une erreur est survenue");
break;
}
...
Et c'est elle que nous devons adapter. En l'état, elle se contente de retourner un message à l'utilisateur. Désormais, en cas de succès, le
bouton d'édition de la facture doit être créé dans le
calque editer que nous venons d'ajouter. Ce bouton doit déclencher l'affichage d'une nouvelle
page php à créer. C'est elle qui doit se charger de construire la
facture au format PDF . Mais pour cela, elle doit connaître le client et la commande concernés. Donc le bouton doit appeler la page en lui passant ces paramètres. En conséquence, nous devons intervenir dans le
traitement serveur pour retourner les identifiants correspondants.
A la racine du dossier de décompression, cliquer droit sur le fichier rep_facture.php ,
Dans le menu contextuel, choisir de l'ouvrir avec le Notepad,
C'est une fois de plus la dernière
branche du switch (case "facturer") qui nous intéresse. En cas d'erreur, l'indication
nok est retournée (print("nok")). En cas de succès, l'indication
ok (print("ok")) doit être remplacée par les identifiants du client et de la commande.
Remplacer l'instruction print("ok"), comme suit :
...
$requete = "UPDATE articles SET Article_Qte=Article_Qte-".$ligne_com[1]." WHERE Article_code='".$ligne_com[0]."';";
$retours = mysqli_query($liaison2, $requete);
}
}
print($com_client."-".$detail_com);
}
else
print("nok");
break;
}
...
Ces variables sont déclarées plus haut dans le code. Elles correspondent respectivement à l'identifiant du client et à celui de sa commande fraîchement validée. Grâce à l'
instruction print , nous les retournons concaténées, séparées par un tiret. Côté client, ce tiret servira à les réceptionner indépendamment.
Enregistrer les modifications et revenir dans le code de la page facturation.php ,
Dans la fonction recolter , adapter le code de la branche facturer , comme suit :
...
case 'facturer':
var reponse = transport.responseText;
if(transport.responseText=="nok")
alert("Une erreur est survenue");
else
{
alert("La facture a été validée avec succès");
document.getElementById("editer").innerHTML = "<input type='button' value='Editer la facture' onclick='window.open(\"edition.php?info=" + reponse + "\")'/>";
}
break;
...
Nous stockons tout d'abord le résultat du traitement serveur dans la
variable reponse . Nous intervertissons le test de l'
instruction conditionnelle , pour l'adapter aux modifications que nous venons d'entreprendre côté serveur. Lorsque l'information
nok est retournée, comme précédemment, nous en alertons l'administrateur à l'aide d'une boîte de message (alert). Dans le cas contraire (else), en plus du message de succès, nous construisons dynamiquement le
bouton d'édition dans le
calque d'identifiant editer . Nous le désignons comme toujours grâce à la
méthode getElementById de l'
objet Javascript document . Grâce à sa
propriété innerHTML , nous pouvons construire son balisage interne. Nous y ajoutons donc un
contrôle input de
type button . Au clic, celui-ci exploite la
méthode open de l'
objet Javascript window . Elle permet d'ouvrir la page désignée en paramètre. Elle se nomme
edition.php . Nous devons la créer. Et comme vous le constatez, le
paramètre info lui est associé dans l'url. Il s'agit de la réponse serveur, soit des identifiants pour le client et la commande. Notez la présence des antislashs pour permettre d'encadrer cette url de côtes. L'expression est en effet déjà encadrée de doubles et de simples côtes.
Enregistrer les modifications (CTRL + S) et basculer sur le navigateur Internet,
Recharger la page Web en validant sa barre d'adresse avec la touche Entrée du clavier,
Choisir un client avec la première liste déroulante,
Choisir un article avec la seconde liste déroulante,
Saisir une quantité et cliquer sur le bouton Ajouter ,
Enfin, cliquer sur le bouton Valider pour archiver la commande,
Au message de succès en retour, cliquer sur le bouton Ok,
Comme vous le constatez, le
bouton d'édition vient se greffer sous les données de la facture. Il occupe toute la largeur disponible. C'est ainsi que les styles CSS le contraignent. Si vous souhaitez le réduire, il suffit de régler certains attributs de sa
propriété Style , au moment de sa création.
Bien sûr à ce stade, si vous cliquez sur ce bouton, une erreur est retournée par le navigateur. La page n'est pas trouvée. Et pour cause, elle n'existe pas encore.
Réceptionner les données de la facture
Pour éditer la facture au format PDF, encore faut-il regrouper tous les éléments qui la concerne. Nous devons commencer par
réceptionner les identifiants transmis dans l'url de la page Web . Sur ces identifiants, nous devons exécuter une
requête multi-table . Elle doit permettre d'extraire toutes les informations du client et de sa commande.
A la racine du dossier de décompression, créer le fichier edition.php ,
Puis, l'éditer dans le Notepad,
Créer alors la section de code Php suivante :
<?php
if(isset($_GET['info']) && $_GET['info']!="")
{
$liaison2 = mysqli_connect('127.0.0.1', 'gStock', 'gS123k12');
mysqli_select_db($liaison2, 'stocks');
$tab_param = explode("-",$_GET['info']);
$num_cli = $tab_param[0];
$num_com = $tab_param[1];
echo "Numero client : ".$num_cli."<br />Numero commande :".$num_com;
mysqli_close($liaison2);
}
?>
Comme nous l'avons appris lors de précédentes formations, c'est l'
instruction Php $_GET qui permet de réceptionner le paramètre de l'URL en mentionnant son nom. Nous testons tout d'abord son existence grâce à la
fonction isset . De même, nous nous assurons qu'il n'est pas vide. Si ces critères sont satisfaits, nous commençons par initialiser la
chaîne de connexion à la base de données ($liaison2). Nous devons effectivement exécuter des requêtes.
Ensuite, nous exploitons la
fonction Php explode pour découper la chaîne du paramètre sur le tiret. Les deux identifiants sont désormais rangés indépendamment dans le
tableau de variables $tab_param . Nous l'exploitons pour les stocker dans des variables respectives ($num_cli et $num_com). Puis, à titre de test temporaire, nous les restituons à l'écran, grâce à la
fonction Php echo . Nous n'oublions pas de refermer la connexion à la base de données à l'issue du traitement (mysqli_close), même si pour l'instant elle n'a pas encore été sollicitée.
Enregistrer les modifications et basculer sur le navigateur Internet,
Recharger la page Web en validant sa barre d'adresse,
Créer une nouvelle facture en désignant un client et ses articles,
Cliquer sur le bouton Valider pour archiver la commande,
Enfin, cliquer sur le bouton Editer la facture ,
Les identifiants sont parfaitement réceptionnés. Nous allons pouvoir les exploiter et les recouper pour extraire toutes les données de la commande, depuis la
base de données MySql .
Fermer l'onglet de la page edition.php et revenir dans son code,
A la place de l'instruction echo, ajouter les lignes Php suivantes :
...
$c_civ=""; $c_nom=""; $c_pre=""; $c_date=""; $c_tot="";
$c_ref =""; $c_des=""; $c_qte=""; $c_pht=0; $c_mht=0; $compteur=0;
$requete = "SELECT * FROM clients a, commandes b, detail c WHERE a.Client_num=".$num_cli." AND b.Com_num=".$num_com." AND c.Detail_com=".$num_com.";";
$retours = mysqli_query($liaison2, $requete);
...
Nous déclarons tout d'abord toutes les variables nécessaires pour stocker les informations du client et de sa commande. Notez tout de même la présence de la
variable $compteur . Une boucle sera nécessaire pour questionner la
table articles à la recherche des informations liées aux achats. Cette variable permettra de connaître le nombre de lignes de la facturation. En conséquence, elle permettra de positionner idéalement certains éléments dans la hauteur de la page.
Ensuite, nous réalisons une
requête sélection multi-table , consistant à récupérer toutes les informations de champs (*). Les tables sont énumérées les unes à la suite des autres, séparées par une virgule. Notez l'emploi d'un suffixe pour chacune. C'est une lettre de l'alphabet qui les désigne désormais. Cette technique permet ensuite de réaliser la correspondance des champs dans la
clause Where , sans devoir engager la
clause INNER JOIN . Nous récupérons toutes les données pour lesquelles le client est identifié dans la
table commandes (a.Client_num = ".$num_cli." AND b.Com_num = ".$num_com). Et pour cette commande, nous récupérons toutes les informations dans la
table detail (AND c.Detail_com=".$num_com."). Ensuite, nous exécutons cette requête sur la
base de données MySql , comme toujours, grâce à la
fonction Php mysqli_query .
Mais à ce stade et comme nous le disions, le client peut avoir acheté plusieurs articles. Et pour chacun d'entre eux, les informations détaillées sont archivées dans la
table articles . Nous devons donc parcourir toutes les références achetées et pour chacune, réaliser une
requête sélection permettant d'extraire ces informations ligne à ligne.
Avant cela, il est temps d'instancier la
classe FPDF libre de droit et d'exploitation. Nous devons en effet inscrire les informations de la société émettrice et du destinataire dans l'entête du document. Vous trouverez cette classe dans le
sous dossier fpdf du dossier de décompression. Si vous éditez le
fichier fpdf.php , vous constatez qu'il offre de nombreuses propriétés et méthodes pour construire un
document pdf .
A partir de la ligne 581 notamment, vous notez la présence de la
méthode Cell .
...
function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
{
// Output a cell
$k = $this->k;
if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
{
// Automatic page break
$x = $this->x;
$ws = $this->ws;
if($ws>0)
...
Celle-ci permet de construire des cellules à disposer sur la page à fabriquer. En argument, il faut définir sa largeur, sa hauteur, son contenu mais aussi d'autres paramètres que nous dévoilerons au fur et à mesure. De nombreuses aides sont présentes sur le Web afin de comprendre l'utilité et l'exploitation des différentes propriétés et méthodes de cette classe. Ici, nous allons en aborder certaines.
A la suite du code précédent et avant la fermeture de la connexion à la base de données, ajouter les instructions suivantes :
...
$requete = "SELECT * FROM clients a, commandes b, detail c WHERE a.Client_num=".$num_cli." AND b.Com_num=".$num_com." AND c.Detail_com=".$num_com.";";
$retours = mysqli_query($liaison2, $requete);
require('fpdf/fpdf.php');
$pdf = new FPDF('P','mm','A4');
$pdf->AddPage();
$pdf->SetFont('Arial','',9);
mysqli_close($liaison2);
...
Tout d'abord, nous exploitons la
fonction Php require afin de faire référence au fichier de cette classe. Il est ainsi inclus et reconnu dans la construction. Puis, nous instancions la
classe FPDF ($pdf = new FPDF('P','mm','A4');). En premier argument, nous spécifions une orientation portrait. Le deuxième argument permet de spécifier l'unité de mesure, le millimètre ici. Et en dernier argument, nous déterminons les dimensions du document, au format A4 donc. Il en résulte un objet que nous avons nommé
$pdf . Cet objet a désormais hérité des propriétés et méthodes de la classe. Pour les appeler, contrairement à de nombreux langages de programmation, nous n'utilisons pas le point mais le
symbole -> . La
méthode AddPage() parle d'elle-même. Elle crée la première page du
document Pdf à construire. Puis, grâce à la
méthode SetFont , nous définissons la police et sa taille. Le deuxième argument est vide pour utiliser un style normal. Nous aurions indiqué
B pour du gras et
I pour de l'italique. A chaque fois que nous devrons changer de style, nous devrons la rappeler.
Nous devons maintenant enclencher la boucle permettant l'extraction de tout le détail de la commande.
A la suite du code précédent et toujours avant la fermeture de la connexion à la base de données, ajouter les instructions Php suivantes :
...
while($retour = mysqli_fetch_array($retours))
{
if($c_civ=="")
{
$c_civ = $retour["Client_civilite"];
$c_nom=$retour["Client_nom"]; $c_pre=$retour["Client_prenom"];
$c_date=$retour["Com_date"]; $c_tot=$retour["Com_montant"];
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Parc Info",0,0,'L');
$pdf->Cell(60,5,$c_civ." ".$c_pre." ".$c_nom,0,1,'L');
$pdf->SetFont('Arial','',9);
$pdf->Cell(120,5,"10 Boulevard Gambetta",0,0,'L');
$pdf->Cell(60,5,"Votre adresse",0,1,'L');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"38000 Grenoble",0,0,'L');
$pdf->Cell(60,5,"Votre ville",0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Votre commande numéro : ".$num_com,0,0,'L');
$pdf->SetFont('Arial','',9);
$pdf->Cell(60,5,"Date de commande : ".$c_date,0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
}
}
...
Tout d'abord, pour chaque enregistrement parcouru, la
fonction Php mysqli_fetch_array permet de découper les données sur les informations de champ. Ces enregistrements correspondent à chacune des lignes de la commande. Désormais, c'est la
variable $retour qui va nous permettre de pointer sur les champs, par leur nom.
Ensuite, nous déclenchons un test sur la
variable $c_civ . Si elle est vide, nous savons qu'il s'agit du premier passage dans la boucle puisqu'elle n'a pas encore été affectée. Il en va forcément de même pour les informations du client. Nous commençons donc par récupérer ces données parentes, en les stockant dans des variables respectives.
Ensuite, nous exploitons les méthodes de l'
objet $pdf , en commençant par sa
méthode Cell . Nous créons tout d'abord une cellule de 35mm de hauteur et de 10mm de largeur. Cette largeur n'a que peu d'importance ici. En effet, suite à cette cellule, nous imposons le retour à la ligne ($pdf->Cell(35,10,"",0,1,'R');), comme le mentionne le chiffre 1 en cinquième argument. Le chiffre 0 à sa place aurait autorisé les cellules suivantes à se positionner à côté. Le troisième argument est vide. En conséquence, cette cellule ne contient pas de texte. Elle est utilisée pour aérer la présentation et débuter les inscriptions plus bas. Le quatrième argument fixé à 0 indique qu'aucune bordure ne doit être tracée. Avec le chiffre 1, la cellule serait encadrée. Le dernier argument n'est pas utile ici mais pas gênant. Il définit un alignement à droite (R pour Right).
Comme nous souhaitons ensuite inscrire les titres des blocs d'adresse, nous définissons une police grasse et plus grande ($pdf->SetFont('Arial','B',10);). Puis, nous débutons la construction par l'organisation des informations. Un document A4 mesure 21,7 cm de large sur 29 cm de haut. Il faut considérer des marges de 1,5 cm environ, de part et d'autre. Nous partons du principe que nous disposons de 18 cm en largeur (180 mm).
Dans une première cellule, nous inscrivons le nom de la société, aligné à gauche ($pdf->Cell(120,5,"Parc Info",0,0,'L');). Comme nous n'imposons pas le retour à la ligne, la cellule suivante est repousée à 120 mm sur la droite. Nous lui attribuons la largeur restante pour inscrire les informations du client ($pdf->Cell(60,5,$c_civ."".$c_pre." ".$c_nom,0,1,'L');), elles aussi alignées à gauche. Mais cette fois, nous imposons le retour à la ligne, pour inscrire les adresses respectives.
Ensuite, nous répliquons exactement les mêmes techniques pour disposer les adresses, codes postaux et villes, en prenant soin d'adapter le style de la police. Pour le client, étant donné qu'il s'agit d'une base de test, nous simulons ses informations par des textes standards.
Suite à ces blocs d'adresse, nous ajoutons une ligne de séparation ($pdf->Cell(35,10,"",0,1,'R');). Puis, nous inscrivons les informations sur le numéro et la date de la commande, en respectant les alignements précédents.
Il est temps d'effectuer les premiers tests.
Après la boucle while et toujours avant la fermeture de la connexion à la base de données, ajouter la ligne suivante :
...
}
$pdf->Output();
mysqli_close($liaison2);
}
...
La
méthode Output de la
classe instanciée , permet d'exporter le résultat construit. Sans argument, elle restitue ce contenu sur la page Web appelante, soit en lieu et place dans le navigateur.
Enregistrer les modifications et basculer sur la fenêtre du navigateur,
Choisir un client et ajouter des articles à la commande,
Cliquer sur le bouton Valider puis sur le bouton Editer la facture ,
Comme vous le constatez, les premiers éléments sont en place et ils sont parfaitement disposés et alignés.
Nous devons maintenant construire le corps de la facture. Il s'agit d'énumérer chaque article acheté avec sa quantité, sa désignation, son prix et le montant total. A chaque passage dans la boucle, nous devons récupérer les informations associées à la référence spécifiée dans la commande. Donc nous devons engager une nouvelle
requête Sql de sélection sur la table articles avec une
clause Where sur le champ de sa
clé primaire , celui de la référence du produit.
Revenir dans le code de la page edition.php ,
Dans la boucle while , après l'instruction conditionnelle, ajouter les lignes Php suivantes :
...
while($retour = mysqli_fetch_array($retours))
{
if($c_civ=="")
{
$c_civ = $retour["Client_civilite"];
$c_nom=$retour["Client_nom"]; $c_pre=$retour["Client_prenom"];
$c_date=$retour["Com_date"]; $c_tot=$retour["Com_montant"];
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Parc Info",0,0,'L');
$pdf->Cell(60,5,$c_civ." ".$c_pre." ".$c_nom,0,1,'L');
$pdf->SetFont('Arial','',9);
$pdf->Cell(120,5,"10 Boulevard Gambetta",0,0,'L');
$pdf->Cell(60,5,"Votre adresse",0,1,'L');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"38000 Grenoble",0,0,'L');
$pdf->Cell(60,5,"Votre ville",0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Votre commande numéro : ".$num_com,0,0,'L');
$pdf->SetFont('Arial','',9);
$pdf->Cell(60,5,"Date de commande : ".$c_date,0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
}
$requete = "SELECT * FROM articles WHERE Article_code='".$retour["Detail_ref"]."';";
$reponses = mysqli_query($liaison2, $requete);
$reponse = mysqli_fetch_array($reponses);
$c_ref = $reponse["Article_code"]; $c_des=$reponse["Article_designation"];
$c_qte = $retour["Detail_qte"]; $c_pht=number_format($reponse["Article_PUHT"],2, ',', ' ');
$c_mht = number_format($retour["Detail_qte"]*$reponse["Article_PUHT"],2, ',', ' ');
$pdf->Cell(20,10,"",0,0,'L');
$pdf->Cell(20,10,$c_ref,1,0,'L');
$pdf->Cell(70,10,$c_des,1,0,'L');
$pdf->Cell(10,10,$c_qte,1,0,'R');
$pdf->Cell(30,10,$c_pht,1,0,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(30,10,$c_mht,1,1,'R');
$pdf->SetFont('Arial','',9);
$compteur ++;
}
...
Nous mémorisons tout d'abord la syntaxe de la
requête Sql permettant d'isoler l'enregistrement de la référence en cours de lecture dans la boucle (WHERE Article_code='".$retour["Detail_ref"]."'). Nous exécutons cette requête sur la
base de données MySql par la
fonction Php mysqli_query , comme toujours. Nous découpons alors l'information de champ grâce à la
fonction mysqli_fetch_array . Il en résulte un tableau de variables ($reponse) permettant d'atteindre les données souhaitées, par leur nom de champ. Et à ce titre, nous les stockons dans des variables respectives. Notez l'emploi de la
fonction Php number_format pour formater le calcul du total de l'article. Elle limite les décimales à deux chiffres après la virgule, impose un séparateur de millier et définit la virgule comme le système de décimales en vigueur. Nous n'avons plus qu'à disposer ces informations dans un tableau pour construire la
facture PDF .
Comme précédemment, nous exploitons la
méthode Cell pour chaque cellule à construire. Nous réalisons tout d'abord un décalage de 2cm ($pdf->Cell(20,10,"",0,0,'L')). Nous restituons la référence dans une première colonne de 2cm avec bordures ($pdf->Cell(20,10,$c_ref,1,0,'L')). Nous conservons les bordures pour toutes les autres cellules en faisant varier les largeurs, pour les adapter aux contenus attendus. Après la dernière cellule, nous imposons le retour à la ligne ($pdf->Cell(30,10,$c_mht,1,1,'R')). Ainsi, nous poursuivrons l'énumération des autres articles parcourus, sur les lignes suivantes du tableau. Nous n'oublions pas d'incrémenter la
variable $compteur .
La facture n'est pas terminée, mais nous pouvons tester son rendu à ce stade.
Enregistrer les modifications et basculer sur la fenêtre du navigateur,
Choisir un client et ajouter des articles à la commande,
Cliquer sur le bouton Valider puis sur le bouton Editer la facture ,
Les éléments sont parfaitement listés, restitués et alignés. La facture offre un rendu tout à fait acceptable. Nous devons la poursuivre. Il est question d'afficher les informations de synthèse, comme le total hors taxe de la commande.
Revenir dans le code de la page edition.php ,
Après la boucle while et toujours avant la fermeture de la connexion, ajouter les lignes Php suivantes :
...
$pdf->SetFont('Arial','',9);
$compteur ++;
}
$pdf->SetFont('Arial','B',11);
$pdf->Cell(35,10,"",0,1,'R');
$pdf->Cell(120,10,"Montant total HT : ",0,0,'R');
$pdf->Cell(30,10,"",0,0,'R');
$pdf->Cell(30,10,number_format($c_tot, 2, ',', ' '),1,1,'R');
$pdf->Cell(120,10,"TVA : 20%",0,0,'R');
$pdf->Cell(30,10,"",0,0,'R');
$pdf->Cell(30,10,number_format($c_tot/5, 2, ',', ' '),1,1,'R');
$pdf->Cell(120,10,"Montant total TTC : ",0,0,'R');
$pdf->Cell(30,10,"",0,0,'R');
$pdf->Cell(30,10,number_format($c_tot + $c_tot/5, 2, ',', ' '),1,1,'R');
$pdf->Cell(30,30,"",0,1,'R');
$pdf->SetFont('Arial','U',11);
$pdf->Output();
mysqli_close($liaison2);
}
...
Il s'agit d'une construction désormais classique qui fait intervenir les
méthodes Cell et
SetFont de la
classe FPDF . Nous exploitons de nouveau la
fonction Php number_format pour formater convenablement et de façon homogène tous les montants. Si vous avez conservé l'interface de facturation en l'état, il suffit de cliquer de nouveau sur le
bouton Editer la facture pour la mettre à jour.
Les éléments de synthèse sont placés comme nous l'avons décrit, par la création des cellules. Il nous reste à positionner les informations des mentions légales dans le pied de page. Nous pourrions implémenter la
méthode Footer de la
classe FPDF . Celle-ci existe en effet, mais elle est vide. Une autre solution consiste à calculer l'espace restant sur une page au format A4, dont la hauteur est de 297 mm. C'est la raison pour laquelle nous avons incrémenté la
variable $compteur . Elle connaît le nombre de lignes du détail de la facture. Donc, elle permet de connaître l'espace variable restant pour atteindre le pied de page.
Nous proposons de raisonner sur un document de 290 mm de hauteur sur laquelle nous devons déduire 2x15 mm de marges, soit un espace alloué restant de 260 mm. Outre le détail de la facture, nous avons inséré des données dans des cellules définies, à hauteurs fixes. En reprenant le code, nous obtenons une hauteur fixe de 120mm à déduire. L'espace alloué restant est donc de 260 - 120, soit 140 mm. Nous devons préserver une hauteur de 20 mm pour le pied de page. Il reste donc 120mm. A ces 120 mm restants, nous devons déduire la hauteur totale du tableau de détail. Il en résultera la distance à parcourir pour rejoindre le pied de page.
En conséquence, à la suite du code précédent, ajouter les lignes Php suivantes :
...
$pdf->Cell(30,10,number_format($c_tot + $c_tot/5, 2, ',', ' '),1,1,'R');
$pdf->Cell(30,30,"",0,1,'R');
$pdf->SetFont('Arial','U',11);
$restant = 120 - $compteur*10;
$pdf->Cell(30,$restant,"",0,1,'R');
$pdf->Cell(60,10,"Mentions légales et conditions :",0,1,'L');
$pdf->SetFont('Arial','I',9);
$pdf->Cell(180,10,"blablabla blablabla blablabla blablablablablabla",0,1,'L');
$pdf->Output();
mysqli_close($liaison2);
}
?>
...
Chaque hauteur du tableau de la facture est de 10 mm. Nous multiplions cette dimension par le nombre de lignes ajoutées ($compteur*10). Nous créons une cellule vide de la distance résultante ($pdf->Cell(30,$restant,"",0,1,'R')), pour repousser la suite des instructions dans le pied de page.
Si vous cliquez de nouveau sur le bouton Editer la facture ou que vous réactualisez la page edition.php, vous remarquez que les informations sont bien inscrites en bas de page du
document Pdf . Et cette position reste identique quelle que soit la hauteur de la facture grâce au calcul sur le nombre de lignes. Dernier point important, nous proposons de sauvegarder les
factures Pdf sur le disque dur, plus précisément dans le sous dossier local factures. Il suffit d'exploiter de nouveau la
méthode Output de la
classe FPDF , mais en lui passant des arguments. L'un d'entre eux est nécessairement le nom du fichier.
A la fin du code, ajouter les deux lignes Php suivantes :
...
$pdf->Cell(180,10,"blablabla blablabla blablabla blablablablablabla",0,1,'L');
$nom_fichier ="factures/".$num_cli."-".$num_com.".pdf";
$pdf->Output($nom_fichier,'F');
$pdf->Output();
mysqli_close($liaison2);
}
?>
...
Fort logiquement, nous définissons le nom du fichier en fonction des identifiants du client et de sa commande, dans le
sous dossier local factures . Nous appelons la méthode Output en lui passant ce chemin en premier argument. Le second ('F') précise qu'il s'agit d'un chemin relatif.
La facture apparaît en effet archivée dans le sous dossier local. D'autres formations seront l'occasion d'approfondir cette précieuse
classe FPDF .