Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Nouveaux clients et factures en Php
Dans la
formation Php précédente, nous avons monté une
interface Web pour gérer l'approvisionnement des stocks d'un magasin. C'est un
code Php qui a permis d'actualiser les quantités renseignées dans une
table de base de données MySql. Ici, nous souhaitons débuter les travaux pour offrir une interface Web permettant d'établir la
facturation d'un nouveau client.
Et cette application doit exploiter la même
base de données MySql de facturation, pour laquelle nous avions construit les
relations entre les tables.
Sources et présentation de la problématique
Il s'agit d'un développement décomposé en plusieurs étapes, étant donnée la complexité de l'application finale à offrir. C'est pourquoi nous devons commencer par récupérer les sources restituant les solutions que nous avons avancées jusqu'alors.
La décompression conduit au fichier de la page Web principale. Il est nommé
index.php.
Il représente l'
interface Web d'approvisionnement des stocks. Le
fichier facturation.php est celui qui nous intéresse pour cette formation. Les ressources externes sont disposées dans les sous dossiers.
Comme vous le savez, ce projet doit être référencé dans
EasyPhp en désignant son adresse issue de l'explorateur Windows et en lui attribuant un nom. Les deux serveurs,
Http et Database doivent être démarrés.
- Dans l'interface d'EasyPhp, cliquer alors sur le bouton Open du module MySql Administration,
Nous ouvrons ainsi l'interface d'administration de
PhpMyAdmin. Dans la liste des bases de données du volet de gauche, vous devez visualiser la
base stocks. Il s'agit des données relationnelles que nous avons exploitées dans les deux formations précédentes.
Si vous ne la possédez pas, vous devez la créer en la nommant
stocks et en réglant le système d'
interclassement sur utf8_general_ci. Ensuite, vous devez y importer le
fichier stocks.sql situé dans le
sous dossier bdd du dossier de décompression. Sur cette base de données, vous devez alors créer le compte utilisateur suivant :
- Nom d'utilisateur : gStock,
- Nom d'hôte : Adresse locale, ici : 127.0.0.1,
- Mot de passe : gS123k12,
Il s'agit des informations exploitées dans le
fichier connexion.php. Celui-ci est imbriqué dans la construction de l'application Web. Il initialise ainsi la
chaîne de connexion à la base de données. Pour cet utilisateur, vous devez octroyer les privilèges nécessaires en cochant la
case Tout cocher. Une fois tous ces paramétrages réglés, nous pouvons accéder à l'interface Web pour la facturation de nouveaux clients.
- Dans l'interface d'EasyPhp, cliquer sur le lien du projet pour accéder à sa page d'accueil,
Nous retrouvons l'interface Web que nous avons finalisée lors de la formation précédente. Elle permet d'
approvisionner les stocks pour une référence désignée.
- Dans le pied de la page Web, cliquer sur l'icône de facturation,
Nous accédons au contenu de la page Web liée nommée
facturation.php. Elle doit permettre de désigner un client à facturer à l'aide de la première
liste déroulante. Pour ce client, elle doit autoriser d'ajouter tour à tour à la facture, tous les articles achetés, à l'aide de la seconde
liste déroulante.
Mais elle doit aussi proposer de créer un nouveau client à la volée, n'existant donc pas encore en
base de données. C'est pourquoi il existe un
bouton Créer le client en haut de l'interface. Une fois créé et archivé en base de données, il pourra être facturé comme n'importe quel autre client. Et c'est tout l'enjeu de cette formation.
Remplir les listes déroulantes
Au premier chargement de la
page Web de facturation, les listes déroulantes doivent être opérationnelles. La première doit proposer toutes les références des clients archivés en
base de données MySql. La seconde doit offrir toutes les références des produits qu'il est possible d'acheter, eux aussi archivés en base de données, mais dans une autre table. Il n'en est rien pour l'instant. Ces listes sont vides. Nous devons nous connecter aux
tables MySql respectives pour extraire les informations correspondantes, par
requêtes Sql exécutées par le
code Php.
- 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 ++,
Vous notez la présence du
formulaire encapsulant les
contrôles Html, à partir de la ligne 34.
...
<form id="formulaire" name="formulaire" method="post" action="rep_facture.php">
<div class="titre_h1" style="height:350px;">
<div style="width:10%; height:50px; float:left;"></div>
<div style="width:35%; height:50px; float:left; font-size:20px; font-weight:bold; text-align:left; color:#a13638;">
<u>Informations du client</u><br />
</div>
<div style="width:10%; height:50px; float:left;"></div>
<div style="width:35%; height:50px; float:left; font-size:16px; font-weight:bold; text-align:left;">
<input type="button" id="creer_client" name="creer_client" value="Créer le client" />
</div>
<div style="width:10%; height:50px; float:left;"></div>
<div style="width:10%; height:75px; float:left;"></div>
<div style="width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;">
Réf. Client :<br />
<select id="ref_client" name="ref_client">
<option value = "0">Choisir client</option>
<?php
?>
</select>
</div>
...
Les
listes déroulantes sont respectivement positionnées à partir des lignes 49 et 82. Elles se nomment
ref_client et
ref_produit. Chacune propose la première ligne du premier choix par défaut, inscrite par la
balise option. Et pour chacune, une section de
code Php est prévue juste en dessous. C'est dans ces sections que doit intervenir un
code Php restituant les informations issues de la
base de données. Elles doivent être restituées les unes en dessous des autres dans les
listes déroulantes.
- Dans la section Php de la première liste déroulante, ajouter le code suivant :
...
<div style="width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;">
Réf. Client :<br />
<select id="ref_client" name="ref_client">
<option value = "0">Choisir client</option>
<?php
$requete = "SELECT Client_num FROM clients ORDER BY Client_num;";
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo "<option value = '".$retour["Client_num"]."'>".$retour["Client_num"]."</option>";
}
?>
</select>
</div>
...
- Dans la section Php de la seconde liste déroulante, ajouter le code suivant :
...
<div style="width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;">
Réf. Produit :<br />
<select id="ref_produit" name="ref_produit">
<option value = "0">Réf. produit</option>
<?php
$requete = "SELECT Article_code FROM articles ORDER BY Article_code;";
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo "<option value = '".$retour["Article_code"]."'>".$retour["Article_code"]."</option>";
}
?>
</select>
</div>
...
Nous restituons exactement les mêmes techniques que celles que nous avons mises en oeuvre dans le développement de l'interface pour l'
approvisionnement des stocks. Tout d'abord, nous sommes en capacité d'exécuter des
requêtes Sql sur la base de données du fait de l'initialisation de la chaîne de connexion, précisément dans le
fichier connexion.php. Celui-ci est imbriqué dans la construction des pages Web.
Pour remplir la première liste déroulante, nous sélectionnons toutes les informations du
champ de la clé primaire (SELECT Client_num FROM clients). C'est lui qui identifie chaque client de façon unique. La
fonction Php mysqli_query permet alors d'exécuter cette requête sur la base de données, désignée par la chaîne de connexion en premier paramètre. Nous exploitons ensuite une
boucle while afin de parcourir chaque enregistrement extrait par la requête. A chaque passage, c'est la
fonction Php mysqli_fetch_array qui découpe chaque ligne en tableau de variables, sur les informations de champ. Dès lors, nous pouvons restituer dans une
balise option, tous les numéros de client, les uns en dessous des autres :
echo"<option value = '".$retour["Article_code"]."'>".$retour["Article_code"]."</option>";
Dans la
section Php de la seconde liste déroulante, nous opérons de la même façon. Nous réceptionnons cette fois toutes les références de la
table articles (SELECT Article_code FROM articles). Le
champ Article_code est la
clé primaire identifiant chaque produit comme unique. Nous exécutons la requête et, parcourons tous les enregistrements résultants. Nous restituons chaque code article dans la seconde liste déroulante.
- Enregistrer les modifications (CTRL + S) et basculer sur le navigateur Web,
- Rafraîchir la page à l'aide de la touche F5 du clavier,
- Déployer la liste déroulante des clients,
Les références issues de la
table clients sont proposées. Elles ne sont que deux pour l'instant. L'objectif final de cette formation est précisément de permettre la
création de nouveaux clients à la volée. Ainsi, ils pourront être facturés dans l'enchaînement.
- Déployer la liste déroulante des produits,
Tous les codes issus de la table articles sont énumérés.
Extraire les données d'une liste déroulante
Quelques travaux sont à réaliser avant de nous soucier de la création des clients. Au choix d'une
référence client dans la première
liste déroulante, ses données associées doivent être extraites et restituées dans les
contrôles Html de la même ligne. Il s'agit de la civilité, du nom et du prénom.
De même, au choix d'un
code article dans la seconde
liste déroulante, les informations correspondantes doivent être affichées sur la même ligne. Il s'agit de la quantité en stock, de la désignation et du prix du produit.
- Revenir dans le code de la page facturation.php,
Nous l'avons constaté brièvement, à soumission, le
formulaire appelle un code externalisé à placer dans le
fichier rep_facture.php.
...
<div style="float:left; width:80%; height:350px; text-align:center;">
<form id="formulaire" name="formulaire" method="post" action="rep_facture.php">
<div class="titre_h1" style="height:350px;">
...
Celui-ci est disponible à la racine du dossier de décompression. C'est alors la
fonction Javascript recolter qui doit se charger de récupérer les données de son traitement. Elle est située en entête de code, précisément à partir de la ligne 6.
...
<script language='javascript' type="text/javascript">
function recolter()
{
document.getElementById("formulaire").request({
onComplete:function(transport){
document.getElementById('').value = transport.responseText;
}
});
}
</script>
...
Elle exploite des
objets Ajax pour que le transfert s'opère sans recharger la page Web. C'est pourquoi le
fichier prototype.js est déclaré en référence dans le
fichier entete.php, lui-même imbriqué dans la construction de ce projet.
Un choix dans chacune de ces listes doit donc déclencher le
traitement serveur. Mais ce traitement diffère selon la liste déroulante actionnée. C'est la raison pour laquelle, avant d'appeler la
fonction recolter, nous devons inscrire un paramètre dans une zone de texte masquée. Cette zone de texte existe déjà . Elle est placée en ligne 127. Son identifiant est
param.
- Supprimer l'attribut disabled de ce contrôle input,
...
<div style="width:25%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;">
<input type="button" id="ajouter" name="ajouter" value="Ajouter" style="margin-top:10px;" /><br />
<input type="text" id="param" name="param" style="visibility:hidden;" />
</div>
...
Ce dernier empêche l'internaute d'accéder à la zone de saisie pour la modifier. Il n'est pas intéressant ici puisque la zone est de toute façon masquée. Mais il empêche surtout le formulaire de transmettre sa valeur.
Nous devons donc impérativement l'éliminer.
Selon la valeur de ce paramètre, nous saurons si nous devons extraire les informations du client ou bien les informations de l'article. Nous devons donc ajouter un
gestionnaire d'évènements dans chaque
liste déroulante. Il doit se charger de déclencher les actions au changement de valeur détecté.
- Dans la liste des clients, ajouter le gestionnaire d'évènements, mentionné en gras :
...
<select id="ref_client" name="ref_client" onchange="document.getElementById('param').value = 'recup_client';recolter();">
<option value = "0">Choisir client</option>
<?php
$requete = "SELECT Client_num FROM clients ORDER BY Client_num;";
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo "<option value = '".$retour["Client_num"]."'>".$retour["Client_num"]."</option>";
}
?>
</select>
...
- Dans la liste des articles, ajouter le gestionnaire d'évènements, mentionné en gras :
...
<select id="ref_produit" name="ref_produit" onchange="document.getElementById('param').value = 'recup_article';recolter();">
<option value = "0">Réf. produit</option>
<?php
$requete = "SELECT Article_code FROM articles ORDER BY Article_code;";
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo "<option value = '".$retour["Article_code"]."'>".$retour["Article_code"]."</option>";
}
?>
</select>
...
Nous exploitons premièrement la
méthode Javascript getElementById de l'
objet document. C'est elle qui permet de pointer sur un contrôle dont le nom lui est passé en paramètre. Grâce à sa
propriété value, nous accédons à son contenu. Nous l'affectons d'un paramètre textuel différent selon la liste déroulante appelante. Et puis, dans les deux cas, nous appelons la
fonction recolter pour réceptionner les données issues du traitement serveur.
Désormais, nous devons donc écrire le
code Php réalisant le traitement approprié. Dans les deux cas, il s'agit d'
extraire les informations de la base de données, en fonction d'un choix émis dans une
liste déroulante.
- 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,
<?php
$liaison2 = mysqli_connect('127.0.0.1', 'gStock', 'gS123k12');
mysqli_select_db($liaison2, 'stocks');
mysqli_close($liaison2);
?>
Celui-ci initialise la chaîne de connexion puis la referme. C'est avant cette fermeture destinée à libérer les ressources, que nous devons intercaler nos
traitements Php.
- Avant la fermeture de la connexion, ajouter le code mentionné en gras :
...
$liaison2 = mysqli_connect('127.0.0.1', 'gStock', 'gS123k12');
mysqli_select_db($liaison2, 'stocks');
if(isset($_POST["param"]))
{
switch($_POST["param"])
{
case "recup_client":
break;
case "recup_article":
break;
}
}
mysqli_close($liaison2);
...
Ce traitement serveur est nécessairement conditionnel. Tout d'abord, nous vérifions l'existence du paramètre transmis grâce à la
fonction Php isset. Souvenez-vous, c'est l'instruction Php $_POST qui permet de restituer la valeur transmise par le contrôle d'un formulaire.
Ensuite, pour traiter toutes les possibilités, nous préférons exploiter une
instruction de branchement switch. Nous l'avions démontrée au travers d'une formation destinée à découvrir le
langage Php. Elle permet d'énumérer chronologiquement tous les cas à prévoir. Et nous en ajouterons au fur et à mesure du développement de cette application de
facturation Web. Et dans ce contexte, une
instruction switch est à la fois plus claire et plus productive qu'une
instruction if.
Le premier cas correspond donc à la récupération des informations du client. Le second correspond à la récupération des informations de l'article. Dans chacune des branches, il suffit d'exécuter une requête sélection adaptée. Il s'agit exactement de la même technique que celle que nous avons mise en oeuvre pour restituer les données d'une référence, dans la formation précédente sur l'approvisionnement des stocks.
- Dans chaque branche, ajouter le code Php mentionné en gras :
...
switch($_POST["param"])
{
case "recup_client":
$requete = "SELECT * FROM clients WHERE Client_num = ".$_POST["ref_client"].";";
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
$chaine = $retour["Client_civilite"]."|".$retour["Client_nom"]."|".$retour["Client_prenom"];
print($chaine);
break;
case "recup_article":
$requete = "SELECT * FROM articles WHERE Article_code = '".$_POST["ref_produit"]."';";
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
$chaine = $retour["Article_designation"]."|".$retour["Article_PUHT"]."|".$retour["Article_Qte"];
print($chaine);
break;
}
...
Nous construisons la syntaxe de la
requête Sql permettant d'extraire les données dans la table correspondante. Dans le premier cas, il s'agit de la
table clients. Dans le second, nous pointons sur la
table articles. La
clause Where est nécessairement adaptée pour récolter seulement l'enregistrement correspondant au choix effectué dans la liste déroulante. Dans le premier cas, le critère est posé sur le
champ Client_num. Dans le second, la condition porte sur le
champ Article_code. L'égalité doit être vérifiée sur la valeur transmise par la liste déroulante correspondante.
Attention néanmoins ! Pour la première requête, la valeur dynamique n'est pas encadrée de côtes. Le
champ Client_num est en effet numérique. Dans la seconde, elles sont absolument nécessaires en revanche. Le
champ Article_code est textuel.
Ensuite, les techniques sont classiques. Nous exécutons les requêtes grâce à la
fonction Php mysqli_query. Nous découpons l'information sur les champs grâce à la
fonction mysqli_fetch_array. Dès lors, c'est la
variable $retour qui permet d'atteindre l'information de chaque champ par son nom. Nous les concaténons toutes dans la
variable $chaine. Nous prenons soin néanmoins de les séparer du caractère remarquable de la barre verticale (|). Puis, nous renvoyons l'information concaténée à la page appelante par l'
instruction print.
- Enregistrer les modifications (CTRL + S) et revenir dans le code de la page facturation.php,
Nous devons réceptionner les données transmises par le traitement serveur, grâce à la
fonction Javascript recolter. Cette réception est aussi conditionnelle. Selon le paramètre transmis, nous ne devons pas restituer les informations dans les mêmes contrôles Html.
- Adapter le code Javascript de la fonction recolter, comme suit :
...
<script language='javascript' type="text/javascript">
function recolter()
{
document.getElementById("formulaire").request({
onComplete:function(transport){
switch(document.getElementById('param').value)
{
case 'recup_client':
var tab_info = transport.responseText.split('|');
document.getElementById('civilite').value = tab_info[0];
document.getElementById('nom_client').value = tab_info[1];
document.getElementById('prenom_client').value = tab_info[2];
break;
case 'recup_article':
var tab_info = transport.responseText.split('|');
document.getElementById('designation').value = tab_info[0];
document.getElementById('puht').value = tab_info[1];
document.getElementById('qte').value = tab_info[2];
break;
}
}
});
}
</script>
...
Nous exploitons de nouveau une
instruction switch, mais en
Javascript cette fois. Nous prévoyons les autres cas qu'il s'agira de traiter. Grâce à la
fonction split, nous découpons l'information transmise (transport.responseText) sur le caractère remarquable de la barre verticale. Il en résulte un
tableau de variables que nous nommons
tab_info. Nous n'avons plus qu'à accéder à ses rangées dans l'ordre, pour restituer l'information correspondante dans le
contrôle Html dédié. Comme toujours, nous pointons sur ce dernier grâce à la
méthode Javascript getElementById de l'
objet document. C'est alors sa
propriété value qui permet d'accéder à son contenu pour inscrire la valeur découpée.
- Enregistrer les modifications (CTRL + S),
- Basculer sur la fenêtre du navigateur,
- Recharger la page Web en validant sa barre d'adresse,
- Choisir un numéro de client dans la première liste déroulante,
- Choisir un code article dans la seconde liste déroulante,
Comme vous le remarquez, dans l'un et l'autre cas, les informations associées, issues de la
base de données MySql, sont parfaitement restituées sur le formulaire Web, dans les
contrôles Html prévus à cet effet.
Certains alignements laissent à désirer. La quantité et le prix unitaire devraient être alignés à droite dans leur zone. Il s'agit en effet de valeurs numériques. Il suffit simplement de régler l'
attribut CSS text-align. A vous de définir les préférences de présentation qui vous conviennent.
...
<div style="width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;">
Qté en stock :<br />
<input type="text" id="qte" name="qte" disabled style="text-align:right;"/>
</div>
<div style="width:25%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;">
Désignation du produit :<br />
<input type="text" id="designation" name="designation" disabled />
</div>
<div style="width:25%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;">
Prix unitaire HT :<br />
<input type="text" id="puht" name="puht" disabled style="text-align:right;"/>
</div>
...
Création d'un nouveau client
Grâce aux
relations que nous avions mises en oeuvre sur les
tables de cette
base de données MySql, il n'est fort heureusement pas possible de créer la facture d'un client n'existant pas. Soit il est proposé dans la liste déroulante, soit il doit être créé en amont. C'est la raison de la présence du
bouton Créer le client en haut de l'interface.
Cette création doit se faire selon les informations saisies dans les
contrôles Html Civilité, Nom du client et Prénom du client. Mais un garde-fou est nécessaire. Un client déjà archivé ne doit pas être créé une seconde fois. Pour cela, nous proposons de réaliser une première requête de vérification sur la base de données. Si un enregistrement propose le même nom et le même prénom, l'insertion doit être avortée. Nous devons donc mettre en oeuvre une double
clause Where.
- Revenir dans le code de la page facturation.php,
- En haut du formulaire, ajouter le gestionnaire d'évènements suivant au bouton creer_client,
...
<div style="width:10%; height:50px; float:left;"></div>
<div style="width:35%; height:50px; float:left; font-size:16px; font-weight:bold; text-align:left;">
<input type="button" id="creer_client" name="creer_client" value="Créer le client" onclick="document.getElementById('param').value = 'creer_client';recolter();"/>
</div>
<div style="width:10%; height:50px; float:left;"></div>
...
La technique est similaire à celle employée pour les listes déroulantes. Mais cette fois, l'action intervient au clic sur le bouton. Un paramètre d'identification est tout d'abord transmis dans la zone de texte dédiée, pour connaître l'action à réaliser côté serveur. Puis, la
fonction recolter est appelée pour réceptionner les résultats du traitement.
Nous devons donc considérer ce nouveau cas dans le
fichier rep_facture.php.
- Basculer dans le code de la page rep_facture.php,
- Dans le switch, ajouter la branche suivante :
...
$chaine = $retour["Article_designation"]."|".$retour["Article_PUHT"]."|".$retour["Article_Qte"];
print($chaine);
break;
case "creer_client":
$requete = "SELECT COUNT(Client_num) AS nb FROM clients WHERE Client_nom='".$_POST["nom_client"]."' AND Client_prenom='".$_POST["prenom_client"]."';";
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
if($retour["nb"]>0)
print("Le client existe déjà . Il ne peut donc pas être créé");
else
{
}
break;
}
}
...
La
fonction Sql Count permet de compter sur un champ tous les enregistrements résultants. Nous récoltons la valeur de retour dans un
champ nb que nous créons à la volée grâce à la
clause AS. Ce décompte dépend d'une double condition. C'est pourquoi dans la
clause Where de la requête, nous recoupons la condition sur l'égalité du nom et du prénom. Nous exécutons cette requête avec la
fonction Php mysqli_query. Pour accéder à l'information du
champ nb, nous découpons les valeurs retournées avec la
fonction mysqli_fetch_array. Si la valeur retournée est supérieure à zéro ($retour["nb"]>0), nous en déduisons qu'un enregistrement correspondant existe déjà . Donc nous retournons l'indication à l'internaute.
Dans le cas contraire (else), nous devons donc procéder à l'insertion de ces informations. Il en résultera la création du nouveau client. Nous devons réceptionner l'information de retour dans la
fonction Javascript recolter.
- Revenir dans le code de la page facturation.php,
- Dans le switch de la fonction recolter, ajouter la branche suivante :
...
document.getElementById('qte').value = tab_info[2];
break;
case 'creer_client':
alert(transport.responseText);
break;
}
...
Pour l'instant, nous nous contentons de restituer le message transmis dans une boîte de dialogue, grâce à la
fonction Javascript alert.
Nous proposons de tester le fonctionnement à ce stade.
- Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
- Recharger la page Web en validant sa barre d'adresse,
- Choisir un numéro de client à l'aide de la première liste déroulante,
- Puis, cliquer sur le bouton Créer le client,
Comme nous n'avons pas modifié ni le nom ni le prénom, la
requête Sql trouve un enregistrement concordant. De fait, le message explicite apparaît sur l'écran de l'internaute.
Nous devons désormais développer le code permettant la création d'un client non recensé.
- Revenir dans le code de la page rep_facture.php,
- Dans la branche du if, remplacer le message par le texte nok,
- Dans le else, ajouter le code Php suivant :
...
case "creer_client":
$requete = "SELECT COUNT(Client_num) AS nb FROM clients WHERE Client_nom='".$_POST["nom_client"]."' AND Client_prenom='".$_POST["prenom_client"]."';";
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
if($retour["nb"]>0)
print("nok");
else
{
$requete = "INSERT INTO clients(Client_civilite, Client_nom, Client_prenom) VALUES ('".$_POST["civilite"]."', '".$_POST["nom_client"]."', '".$_POST["prenom_client"]."');";
$retours = mysqli_query($liaison2, $requete);
if($retours==1)
print(mysqli_insert_id($liaison2));
}
break;
}
...
Simplement,nous engageons une
requête Sql Insert Into permettant d'ajouter les informations du formulaire dans les champs respectifs de la table clients. Nous l'exécutons comme toujours grâce à la
fonction mysqli_query. Si la valeur retournée vaut 1, cela signifie qu'un enregistrement a correctement été ajouté. Dans ce cas, nous retournons la valeur du dernier ID créé, grâce à la précieuse
fonction Php mysqli_insert_id. Elle prélève la dernière valeur auto-incrémentée du champ de la clé primaire. Cette astuce permet d'éviter de réaliser une nouvelle requête à la recherche de cette information.
- Enregistrer les modifications et revenir dans le code de la page facturation.php,
Lorsque la création du nouveau client a lieu, nous devons exploiter l'ID retourné pour l'ajouter dans la liste déroulante des clients. Et nous devons placer le focus sur cette dernière valeur, pour automatiser les actions. Ainsi, dans l'enchaînement, l'administrateur pourra procéder à la facturation du nouveau client.
- Dans la fonction recolter, adapter la dernière branche du switch, comme suit :
...
case 'creer_client':
var rep = transport.responseText;
if(rep=="nok")
alert("Le client existe déjà ");
else
{
var liste = document.getElementById("ref_client");
var option = document.createElement("option");
option.value = rep;
option.text = rep;
liste.add(option);
liste.selectedIndex = liste.length-1;
}
break;
...
Nous déclarons un
objet liste, représentant la liste déroulante des clients. La
méthode createElement de l'
objet document permet d'ajouter une ligne, grâce à l'
attribut option passé en paramètre. Nous définissons la valeur et le texte de cette nouvelle balise, pour le
contrôle select. Puis, nous exploitons la
méthode add de l'
objet liste pour la créer. Enfin, grâce à la
propriété selectedIndex d'un objet liste déroulante, nous sélectionnons sa dernière valeur. Cette position est renvoyée par sa
propriété length qui indique le nombre d'éléments qu'elle contient. Comme le premier élément est reconnu sur la rangée zéro, nous retranchons une unité à cette valeur.
- Enregistrer les modifications et basculer sur la fenêtre du navigateur,
- Recharger la page Web en validant sa barre d'adresse,
- Dans le contrôle Civilité, saisir : Madame, par exemple,
- Dans le contrôle du Nom, taper : Rouana,
- Dans le contrôle du prénom, taper : Marie,
- Puis, cliquer sur le bouton Créer le client,
Comme vous le constatez, aucun message n'apparaît. En revanche, un nouvel identifiant surgit, mis en valeur instantanément par la liste déroulante qui le sélectionne.
Si vous affichez le contenu actualisé de la
table clients dans
PhpMyAdmin, vous constatez en effet la présence du nouveau client identifié. Voilà donc pour ce volet. Dans le prochain, nous réaliserons la facturation du client.