Bonjour,

Dans mon projet , j'ai une rubrique de gestion des absences pour les employés d'une entreprise, et j'affiche également la liste des absents pour chaque jour, et je veux savoir si je peut imprimer cette liste à l'aide d'un bouton 'imprimer '
Je développe mon site avec php
Merci d'avance

7 réponses


Salut,

Pour imprimer une page, c'est bien d'avoir 2 pages distinctes.

On va dire qu'on a page1, et page2.

Dans page1,
tu as plein de trucs, DONT la partie que tu veux imprimer.
Mais toi tu ne veux pas imprimer toute la page1, tu ne veux imprimer qu'une partie intéressante de cette page1.

C'est là qu'intervient la page2,
en fait cette page2 sera la mise en forme de ce que tu veux imprimer, et seulement ça.

Dans page1,
tu mets un lien quelque part dans ta page :

// ... CONTENU ...
<a href="page2.php">Imprimer</a>
// ... CONTENU ...

Dans page2,
tu mets tout ce que tu veux imprimer, et seulement ce que tu veux imprimer,
le tout dans une balise <body onload="window.print()"> :

<body onload="window.print()">
    // le contenu à imprimer
<body>
Sanae
Auteur

Merci pour ta réponse
Oui j'ai compris mais le problème c'est que dans la première page j'ai un formulaire pour préciser les données que je dois afficher
alors la liste s'affiche premièrement dans la première page , et moi quand je clique sur le bouton ok du formulaire , le système me renvoie directement à la deuxième page et la fenêtre d'impression s'affiche aussi , tout ca sans cliquer sous le lien imprimer
Page1: j'ai ce formulaire pour afficher les données dans un tableau , et ce tableau là que je veuille imprimer.

echo '<fieldset><center><form method=post action="ListeAbsences".php">
<h2>Consultation liste des absences </h2>
<label>Service </label>';?>

<select name="choix">;
  <?php
$conn= new PDO('mysql:host=localhost;dbname=sfe2','root','');
$sl= "SELECT distinct nom_service from service";
$std=$conn->query($sl);
$res=$std->fetchAll(PDO::FETCH_COLUMN,0);
  for($i=0;$i<count($res);$i++){
  echo " <option value=".$res[$i].">".$res[$i]."</option>";
} 
                echo'</select> <br/><br/>;
                '?>
            <input type="date" name="dateE">;
            <input type="submit" name ="ok"  align = right value="Consulter"><br/><br/></form></center></fieldset>;

Page 2:

<body onload="window.print()">
<?php
session_start();
include("dbf.php");
$email=$_SESSION["email"] ;
echo"<div id=session>";
echo "<p>Welcome ".$_SESSION['email']."</p></div>";
$conn= new PDO('mysql:host=localhost;dbname=sfe2','root','');
if (isset($_POST['choix']) && isset($_POST['dateE'])){
  $service=$_POST['choix'];
  $jour=$_POST['dateE'];

$sl2= "SELECT cin,Nom,Prenom,nom_service,periode,observation, dateA  from absent where nom_service='$service' and dateA='$jour'";
$sth=$conn->query($sl2);
if (!$sth) {
  echo "<div class=test>erreur</test>";
}
$res=$sth->fetchAll(PDO::FETCH_ASSOC);
echo"<center><h2>Liste d'absences :".$_POST['dateE']."</h2></center>";
echo '<center><table border=3 #F5F5F5>
   <thead>';

echo "<tr> <th>cin</th> 
<th>Nom</th>";

echo "<th>Prenom</th>
    <th>Service</th>
    <th>Periode</th>
    <th>Observation</th>
    ";
echo "</tr></thead>";
  foreach ($res as $row) {

  echo "<tbody>
  <tr>";
  echo "<td>".$row['cin']."</td>";
  echo "<td>".$row['Nom']."</td>";
  echo "<td>".$row['Prenom']."</td>";
  echo "<td>".$row['nom_service']."</td>";
  echo "<td>".$row['periode']."</td>";
  echo "<td>".$row['observation']."</td>";
  //echo "<td>".$row['dateE']."</td>";

  echo "<tr>";}}

?>
</body>

PS: ces lignes de code figurent aussi dans la première page.
Merci

Je ne vois pas ton bouton "Imprimer".
Ton button "Consulter", c'est lui qui devrait s'appeler "imprimer" (il me semble).

Quand tu clic sur "Consulter", sur ta page1,
ça t'emmène bien sur ta page2 (ListeAbsences.php),
du coup on tombe sur un <body onload="window.print()">,
ce qui ouvre la fenêtre d'impression.
Tout est normal, je ne comprend pas le problème.

J'ai juste l'impression qu'il faut renommer "Consulter" en "Imprimer".

Attention,
dans le code de la page1, pour le action, tu as mis 3 guillemets.
Et ça me parait étrange de mettre les <fieldset> à l'extérieur des <form>.

Sanae
Auteur

Moi je veux afficher tout d'abord le tableau dans la première page a l'aide du bouton consulter ,
aprés le tableau s'affichera avec le bouton imprimer pour que je puisse imprimer le tableau

Dans la première page, à l'aide du bouton "Consulter" ?

Mais... Il est déjà là dans la 1ère page non ? (sans l'aide du bouton "Consulter").
C'est pas clair hein.

Est-ce que tu veux,
qu'il soit affiché dans la page1 (+ le superflu, ce qui ne doit pas être imprimé),
sur cette page1 il y a un bouton "Consulter" qui t'amène sur la page2,
sur cette page 2, on ne voit QUE ce qui doit être imprimé, ET il y a aussi un bouton "Imprimer" (pour lancer l'impression).

C'est ça ?
en fait ce serai un "aperçu" de l'impression quoi (avant de choisir d'imprimer ou non).

Si c'est ça, il te faut 3 pages.

Tu ne changes rien à la 1ère,
tu enlève le onload="window.print()" de la 2ème, et tu rajoute un lien vers la 3ème. <a href="page3.php">Imprimer</a>
et pour la 3ème, tu fais un copié/collé de la 2ème, mais tu retire le lien "Imprimer", et tu ajoutes le onload="window.print()".

Sanae
Auteur

j'ai fait ce que vous m'avez dit mais il me donne une feuille vide , rien n'est affiché
page 2:

$conn= new PDO('mysql:host=localhost;dbname=sfe2','root','');
if (isset($_POST['choix']) && isset($_POST['dateE'])){
  $service=$_POST['choix'];
  $jour=$_POST['dateE'];

$sl2= "SELECT cin,Nom,Prenom,nom_service,periode,observation, dateA  from absent where nom_service='$service' and dateA='$jour'";
$sth=$conn->query($sl2);
if (!$sth) {
  echo "<div class=test>erreur</test>";
}
$res=$sth->fetchAll(PDO::FETCH_ASSOC);
echo"<center><h2>Liste d'absences :".$_POST['dateE']."</h2></center>";
echo '<center><table border=3 #F5F5F5>
   <thead>';

echo "<tr> <th>cin</th> 
<th>Nom</th>";

echo "<th>Prenom</th>
    <th>Service</th>
    <th>Periode</th>
    <th>Observation</th>
    ";
echo "</tr></thead>";
  foreach ($res as $row) {

  echo "<tbody>
  <tr>";
  echo "<td>".$row['cin']."</td>";
  echo "<td>".$row['Nom']."</td>";
  echo "<td>".$row['Prenom']."</td>";
  echo "<td>".$row['nom_service']."</td>";
  echo "<td>".$row['periode']."</td>";
  echo "<td>".$row['observation']."</td>";
  //echo "<td>".$row['dateE']."</td>";

  echo "<tr>";} echo'<a href="page3.php">Imprimer</a>';}

?>

Page3:

<body onload="window.print()">
<?php
session_start();
include("dbf.php");
$email=$_SESSION["email"] ;
echo"<div id=session>";
echo "<p>Welcome ".$_SESSION['email']."</p></div>";
$conn= new PDO('mysql:host=localhost;dbname=sfe2','root','');
if (isset($_POST['choix']) && isset($_POST['dateE'])){
  $service=$_POST['choix'];
  $jour=$_POST['dateE'];

$sl2= "SELECT cin,Nom,Prenom,nom_service,periode,observation, dateA  from absent where nom_service='$service' and dateA='$jour'";
$sth=$conn->query($sl2);
if (!$sth) {
  echo "<div class=test>erreur</test>";
}
$res=$sth->fetchAll(PDO::FETCH_ASSOC);
echo"<center><h2>Liste d'absences :".$_POST['dateE']."</h2></center>";
echo '<center><table border=3 #F5F5F5>
   <thead>';

echo "<tr> <th>cin</th> 
<th>Nom</th>";

echo "<th>Prenom</th>
    <th>Service</th>
    <th>Periode</th>
    <th>Observation</th>
    ";
echo "</tr></thead>";
  foreach ($res as $row) {

  echo "<tbody>
  <tr>";
  echo "<td>".$row['cin']."</td>";
  echo "<td>".$row['Nom']."</td>";
  echo "<td>".$row['Prenom']."</td>";
  echo "<td>".$row['nom_service']."</td>";
  echo "<td>".$row['periode']."</td>";
  echo "<td>".$row['observation']."</td>";
  //echo "<td>".$row['dateE']."</td>";

  echo "<tr>";}}

Bonjour.
Pour commencer, tu as un gros problème sur la seconde page, session_start()doit être appelé avant tout code HTML, ce qui n'est pas ton cas, vu que tu as la balise body juste avant.
Ensuite, tu peux tout simplement utiliser le css pour pouvoir lancer l'impression sur une même page, en masquant les éléments que tu ne veux pas affichier via le @media print en css.
Tu peux en voir un petit exemple ici.