Bonjour,
Je cherche donc a utiliser HTML2PDF pour generer le pdf d'un formulaire.
utilisant une architecture MVC, j'inclue mes fichiers de fonctions ainsi que mes classes avec un include ('monFichier');
cependant ces 2 lignes ajouter au debut, créent une page blanche avec 2 points d'interogations avant l'affichage de mes données.
je viens d'y passer l'apres midi, je ne comprend pas quel en est la source, d'autant plus que je n'ai vu personne relever ce probleme sur la toile!
Jattend votre retours avec impatience!!!!
Ci dessous mon code si ca peut aider...
<?php
ob_start();
include('../include/class.pdogsb.inc.php');
include('../include/fct.inc.php');
$pdo = PdoGsb::getPdoGsb();
$numMois = $_POST['numMois'];
$numAnnee = $_POST['numAnnee'];
$dateModif = $_POST['dateModif'];
$montantValide = $_POST['montantValide'];
$libEtat = $_POST['libEtat'];
$nbJustificatifs = $_POST['nbJustificatifs'];
$idVisiteur = $_POST['visiteur'];
$leMois = $numAnnee.$numMois ;
$lesFraisHorsForfait = $pdo->getLesFraisHorsForfait($idVisiteur,$leMois);
$lesFraisForfait= $pdo->getLesFraisForfait($idVisiteur,$leMois);
?>
<page backtop="5%" backbottom="5%" backleft="5%" backright="5%">
<h1 style="text-align:center">Fiche de frais : <?php echo $numMois."-".$numAnnee ;?> </h1>
<h4>Etat : <?php echo $libEtat ;?> depuis le <?php echo $dateModif ;?> <br/>
Montant validé : <?php echo $montantValide ; ?></h4>
<h3>Descriptif des éléments hors forfait <?php echo $nbJustificatifs ?> justificatifs reçus </h3>
<table>
<tr>
<th class="date">Date</th>
<th class="libelle">Libellé</th>
<th class='montant'>Montant</th>
</tr>
<?php
foreach ( $lesFraisHorsForfait as $unFraisHorsForfait )
{
$date = $unFraisHorsForfait['date'];
$libelle = $unFraisHorsForfait['libelle'];
$montant = $unFraisHorsForfait['montant'];
?>
<tr>
<td><?php echo $date ?></td>
<td><?php echo $libelle ?></td>
<td><?php echo $montant ?></td>
</tr>
<?php
}
?>
</table>
</page>
<?php
$content = ob_get_clean();
require('html2pdf/html2pdf.class.php');
$pdf = new HTML2PDF('P','A4','fr','true','UTF-8');
$pdf->writeHTML($content);
//$pdf->pdf->IncludeJS('print(true)');
$pdf->Output('liste.pdf');
?>```
donc il y a de forte chance que ça vienne de là.
peux-t-on voir ces fichiers ?
Si je met avant la balise fermante de php:
TCPDF ERROR: Some data has already been output, can't send PDF file
ok,
il y a un bout de code qui affiche du html avant.
Vérifier qu'il n'y est pas de echo ou print_r ou var_dump....
Dans les fichier inclus?? nan j'ai verifier il n'y a rien! et j'ai toujours cette page blanche avec les points d'interrogation!
Avant d'afficher autant de contenu, vous avez essayer juste :
<page>
toto
</page>
Afin d'élimer une source des ??
oui j'ai fait tout les test possibles et imaginables, sans les include je n'ai aucun probleme!
J'ai ajouter ob_clean(); combiner a la solution de ob_start(); apres les include et ca fonctionne enfin!!! vraiment merci beaucoup!!!!!!
Si vous avez une meilleur solution àme proposer je suis preneuse!!!
Mon Fichier de fonction: fct.inc.php
<?php
/**
* Fonctions pour l'application GSB
* @package default
* @author Naama
* @version 1.0
*/
/**
* Teste si un quelconque visiteur est connecté
* @return vrai ou faux
*/
function estConnecte(){
return isset($_SESSION['idVisiteur']);
}
/**
* Enregistre dans une variable session les infos d'un visiteur
* @param $id
* @param $nom
* @param $prenom
* @param $statu
*/
function connecter($id,$nom,$prenom,$statu){
$_SESSION['idVisiteur']= $id;
$_SESSION['nom']= $nom;
$_SESSION['prenom']= $prenom;
// Ajout du type d'utilisateur (comptable ou visiteur)
$_SESSION['statu']= $statu;
}
/**
* Détruit la session active
*/
function deconnecter(){
session_destroy();
}
/**
* Transforme une date au format français jj/mm/aaaa vers le format anglais aaaa-mm-jj
* @param $madate au format jj/mm/aaaa
* @return la date au format anglais aaaa-mm-jj
*/
function dateFrancaisVersAnglais($maDate){
@list($jour,$mois,$annee) = explode('/',$maDate);
return date('Y-m-d',mktime(0,0,0,$mois,$jour,$annee));
}
/**
* Transforme une date au format format anglais aaaa-mm-jj vers le format français jj/mm/aaaa
* @param $madate au format aaaa-mm-jj
* @return la date au format format français jj/mm/aaaa
*/
function dateAnglaisVersFrancais($maDate){
@list($annee,$mois,$jour)=explode('-',$maDate);
$date="$jour"."/".$mois."/".$annee;
return $date;
}
/**
* retourne le mois au format aaaamm selon le jour dans le mois
* @param $date au format jj/mm/aaaa
* @return le mois au format aaaamm
*/
function getMois($date){
@list($jour,$mois,$annee) = explode('/',$date);
if(strlen($mois) == 1){
$mois = "0".$mois;
}
return $annee.$mois;
}
/* gestion des erreurs*/
/**
* Indique si une valeur est un entier positif ou nul
* @param $valeur
* @return vrai ou faux
*/
function estEntierPositif($valeur) {
return preg_match("/[^0-9]/", $valeur) == 0;
}
/**
* Indique si un tableau de valeurs est constitué d'entiers positifs ou nuls
* @param $tabEntiers : le tableau
* @return vrai ou faux
*/
function estTableauEntiers($tabEntiers) {
$ok = true;
foreach($tabEntiers as $unEntier){
if(!estEntierPositif($unEntier)){
$ok=false;
}
}
return $ok;
}
/**
* Vérifie si une date est inférieure d'un an à la date actuelle
* @param $dateTestee
* @return vrai ou faux
*/
function estDateDepassee($dateTestee){
$dateActuelle=date("d/m/Y");
@list($jour,$mois,$annee) = explode('/',$dateActuelle);
$annee--;
$AnPasse = $annee.$mois.$jour;
@list($jourTeste,$moisTeste,$anneeTeste) = explode('/',$dateTestee);
return ($anneeTeste.$moisTeste.$jourTeste < $AnPasse);
}
/**
* Vérifie la validité du format d'une date française jj/mm/aaaa
* @param $date
* @return vrai ou faux
*/
function estDateValide($date){
$tabDate = explode('/',$date);
$dateOK = true;
if (count($tabDate) != 3) {
$dateOK = false;
}
else {
if (!estTableauEntiers($tabDate)) {
$dateOK = false;
}
else {
if (!checkdate($tabDate[1], $tabDate[0], $tabDate[2])) {
$dateOK = false;
}
}
}
return $dateOK;
}
/**
* Vérifie que le tableau de frais ne contient que des valeurs numériques
* @param $lesFrais
* @return vrai ou faux
*/
function lesQteFraisValides($lesFrais){
return estTableauEntiers($lesFrais);
}
/**
* Vérifie la validité des trois arguments : la date, le libellé du frais et le montant
* des message d'erreurs sont ajoutés au tableau des erreurs
* @param $dateFrais
* @param $libelle
* @param $montant
*/
function valideInfosFrais($dateFrais,$libelle,$montant){
if($dateFrais==""){
ajouterErreur("Le champ date ne doit pas être vide");
}
else{
if(!estDatevalide($dateFrais)){
ajouterErreur("Date invalide");
}
else{
if(estDateDepassee($dateFrais)){
ajouterErreur("date d'enregistrement du frais dépassé, plus de 1 an");
}
}
}
if($libelle == ""){
ajouterErreur("Le champ description ne peut pas être vide");
}
if($montant == ""){
ajouterErreur("Le champ montant ne peut pas être vide");
}
else
if( !is_numeric($montant) ){
ajouterErreur("Le champ montant doit être numérique");
}
}
/**
* Ajoute le libellé d'une erreur au tableau des erreurs
* @param $msg : le libellé de l'erreur
*/
function ajouterErreur($msg){
if (! isset($_REQUEST['erreurs'])){
$_REQUEST['erreurs']=array();
}
$_REQUEST['erreurs'][]=$msg;
}
/**
* Retoune le nombre de lignes du tableau des erreurs
* @return le nombre d'erreurs
*/
function nbErreurs(){
if (!isset($_REQUEST['erreurs'])){
return 0;
}
else{
return count($_REQUEST['erreurs']);
}
}
?>
Et mon fichier de classes: classe.pdogsb.php
<?php
/**
* Classe d'accès aux données.
* Utilise les services de la classe PDO
* pour l'application GSB
* Les attributs sont tous statiques,
* les 4 premiers pour la connexion
* $monPdo de type PDO
* $monPdoGsb qui contiendra l'unique instance de la classe
* @package default
* @author Naama
* @version 1.0
* @link http://www.php.net/manual/fr/book.pdo.php
*/
class PdoGsb{
private static $serveur='mysql:host=localhost';
private static $bdd='dbname=PPE';
private static $user='root' ;
private static $mdp='' ;
private static $monPdo;
private static $monPdoGsb=null;
/**
* Constructeur privé, crée l'instance de PDO qui sera sollicitée
* pour toutes les méthodes de la classe
*/
private function __construct(){
PdoGsb::$monPdo = new PDO(PdoGsb::$serveur.';'.PdoGsb::$bdd, PdoGsb::$user, PdoGsb::$mdp);
PdoGsb::$monPdo->query("SET CHARACTER SET utf8");
}
public function _destruct(){
PdoGsb::$monPdo = null;
}
/**
* Fonction statique qui crée l'unique instance de la classe
* Appel : $instancePdoGsb = PdoGsb::getPdoGsb();
* @return l'unique objet de la classe PdoGsb
*/
public static function getPdoGsb(){
if(PdoGsb::$monPdoGsb==null){
PdoGsb::$monPdoGsb= new PdoGsb();
}
return PdoGsb::$monPdoGsb;
}
/**
* Retourne les informations d'un visiteur
* @param $login
* @param $mdp
* @return l'id, le nom et le prénom sous la forme d'un tableau associatif
*/
public function getInfosVisiteur($login, $mdp){
$req = "select visiteur.id as id, visiteur.nom as nom, visiteur.idStatu as idStatu, visiteur.prenom as prenom from visiteur
where visiteur.login='$login' and visiteur.mdp='$mdp'";
$rs = PdoGsb::$monPdo->query($req);
$ligne = $rs->fetch();
return $ligne;
}
/**
* Retourne sous forme d'un tableau associatif toutes les lignes de frais hors forfait
* concernées par les deux arguments
* La boucle foreach ne peut être utilisée ici car on procède
* à une modification de la structure itérée - transformation du champ date-
* @param $idVisiteur
* @param $mois sous la forme aaaamm
* @return tous les champs des lignes de frais hors forfait sous la forme d'un tableau associatif
*/
public function getLesFraisHorsForfait($idVisiteur,$mois){
$req = "select * from lignefraishorsforfait where lignefraishorsforfait.idvisiteur ='$idVisiteur'
and lignefraishorsforfait.mois = '$mois' ";
$res = PdoGsb::$monPdo->query($req);
$lesLignes = $res->fetchAll();
$nbLignes = count($lesLignes);
for ($i=0; $i<$nbLignes; $i++){
$date = $lesLignes[$i]['date'];
$lesLignes[$i]['date'] = dateAnglaisVersFrancais($date);
}
return $lesLignes;
}
/**
* Retourne le nombre de justificatif d'un visiteur pour un mois donné
* @param $idVisiteur
* @param $mois sous la forme aaaamm
* @return le nombre entier de justificatifs
*/
public function getNbjustificatifs($idVisiteur, $mois){
$req = "select fichefrais.nbjustificatifs as nb from fichefrais where fichefrais.idvisiteur ='$idVisiteur' and fichefrais.mois = '$mois'";
$res = PdoGsb::$monPdo->query($req);
$laLigne = $res->fetch();
return $laLigne['nb'];
}
/**
* Retourne sous forme d'un tableau associatif toutes les lignes de frais au forfait
* concernées par les deux arguments
* @param $idVisiteur
* @param $mois sous la forme aaaamm
* @return l'id, le libelle et la quantité sous la forme d'un tableau associatif
*/
public function getLesFraisForfait($idVisiteur, $mois){
$req = "select fraisforfait.id as idfrais, fraisforfait.libelle as libelle,
lignefraisforfait.quantite as quantite from lignefraisforfait inner join fraisforfait
on fraisforfait.id = lignefraisforfait.idfraisforfait
where lignefraisforfait.idvisiteur ='$idVisiteur' and lignefraisforfait.mois='$mois'
order by lignefraisforfait.idfraisforfait";
$res = PdoGsb::$monPdo->query($req);
$lesLignes = $res->fetchAll();
return $lesLignes;
}
/**
* Retourne tous les id de la table FraisForfait
* @return un tableau associatif
*/
public function getLesIdFrais(){
$req = "select fraisforfait.id as idfrais from fraisforfait order by fraisforfait.id";
$res = PdoGsb::$monPdo->query($req);
$lesLignes = $res->fetchAll();
return $lesLignes;
}
/**
* Met à jour la table ligneFraisForfait
* Met à jour la table ligneFraisForfait pour un visiteur et
* un mois donné en enregistrant les nouveaux montants
* @param $idVisiteur
* @param $mois sous la forme aaaamm
* @param $lesFrais tableau associatif de clé idFrais et de valeur la quantité pour ce frais
* @return un tableau associatif
*/
public function majFraisForfait($idVisiteur, $mois, $lesFrais){
$lesCles = array_keys($lesFrais);
foreach($lesCles as $unIdFrais){
$qte = $lesFrais[$unIdFrais];
$req = "update lignefraisforfait set lignefraisforfait.quantite = $qte
where lignefraisforfait.idvisiteur = '$idVisiteur' and lignefraisforfait.mois = '$mois'
and lignefraisforfait.idfraisforfait = '$unIdFrais'";
PdoGsb::$monPdo->exec($req);
}
}
/**
* met à jour le nombre de justificatifs de la table ficheFrais
* pour le mois et le visiteur concerné
* @param $idVisiteur
* @param $mois sous la forme aaaamm
*/
public function majNbJustificatifs($idVisiteur, $mois, $nbJustificatifs){
$req = "update fichefrais set nbjustificatifs = $nbJustificatifs
where fichefrais.idvisiteur = '$idVisiteur' and fichefrais.mois = '$mois'";
PdoGsb::$monPdo->exec($req);
}
/**
* Teste si un visiteur possède une fiche de frais pour le mois passé en argument
* @param $idVisiteur
* @param $mois sous la forme aaaamm
* @return vrai ou faux
*/
public function estPremierFraisMois($idVisiteur,$mois)
{
$ok = false;
$req = "select count(*) as nblignesfrais from fichefrais
where fichefrais.mois = '$mois' and fichefrais.idvisiteur = '$idVisiteur'";
$res = PdoGsb::$monPdo->query($req);
$laLigne = $res->fetch();
if($laLigne['nblignesfrais'] == 0){
$ok = true;
}
return $ok;
}
/**
* Retourne le dernier mois en cours d'un visiteur
* @param $idVisiteur
* @return le mois sous la forme aaaamm
*/
public function dernierMoisSaisi($idVisiteur){
$req = "select max(mois) as dernierMois from fichefrais where fichefrais.idvisiteur = '$idVisiteur'";
$res = PdoGsb::$monPdo->query($req);
$laLigne = $res->fetch();
$dernierMois = $laLigne['dernierMois'];
return $dernierMois;
}
/**
* Crée une nouvelle fiche de frais et les lignes de frais au forfait pour un visiteur et un mois donnés
* récupère le dernier mois en cours de traitement, met à 'CL' son champs idEtat, crée une nouvelle fiche de frais
* avec un idEtat à 'CR' et crée les lignes de frais forfait de quantités nulles
* @param $idVisiteur
* @param $mois sous la forme aaaamm
*/
public function creeNouvellesLignesFrais($idVisiteur,$mois){
$dernierMois = $this->dernierMoisSaisi($idVisiteur);
$laDerniereFiche = $this->getLesInfosFicheFrais($idVisiteur,$dernierMois);
if($laDerniereFiche['idEtat']=='CR'){
$this->majEtatFicheFrais($idVisiteur, $dernierMois,'CL');
}
$req = "insert into fichefrais(idvisiteur,mois,nbJustificatifs,montantValide,dateModif,idEtat)
values('$idVisiteur','$mois',0,0,now(),'CR')";
PdoGsb::$monPdo->exec($req);
$lesIdFrais = $this->getLesIdFrais();
foreach($lesIdFrais as $uneLigneIdFrais){
$unIdFrais = $uneLigneIdFrais['idfrais'];
$req = "insert into lignefraisforfait(idvisiteur,mois,idFraisForfait,quantite)
values('$idVisiteur','$mois','$unIdFrais',0)";
PdoGsb::$monPdo->exec($req);
}
}
/**
* Crée une nouvelle fiche de frais
* récupère le dernier mois en cours de traitement, met à 'CL' son champs idEtat, crée une nouvelle fiche de frais
* avec un idEtat à 'CR' et crée les lignes de frais forfait de quantités nulles
* @param $Visiteur
* @param $mois sous la forme aaaamm
*/
public function NouvellesLignesFrais($visiteur,$mois){
$req = "insert into fichefrais(idvisiteur,mois,nbJustificatifs,montantValide,dateModif,idEtat)
values('$visiteur','$mois',0,0,now(),'CR')";
$req1 = "insert into lignefraisforfait(idvisiteur,mois,idFraisForfait,quantite)
values('$visiteur','$mois','ETP',0)";
$req2 = "insert into lignefraisforfait(idvisiteur,mois,idFraisForfait,quantite)
values('$visiteur','$mois','KM',0)";
$req3 = "insert into lignefraisforfait(idvisiteur,mois,idFraisForfait,quantite)
values('$visiteur','$mois','NUI',0)";
$req4 = "insert into lignefraisforfait(idvisiteur,mois,idFraisForfait,quantite)
values('$visiteur','$mois','REP',0)";
PdoGsb::$monPdo->exec($req);
PdoGsb::$monPdo->exec($req1);
PdoGsb::$monPdo->exec($req2);
PdoGsb::$monPdo->exec($req3);
PdoGsb::$monPdo->exec($req4);
}
/**
* Cacule la somme de tous les frais validés pour un mois
* et met a jours le fiche de frais avec le montant validé, la date du jours de validation, ainsi que le nouveau statu (VA)
* @param $Visiteur
* @param $mois sous la forme aaaamm
*/
public function validerFiche($visiteur,$mois){
$req = "SELECT SUM(lignefraishorsforfait.montant) as totalHF FROM `lignefraishorsforfait` where idVisiteur='$visiteur' and mois='$mois'";
$req1 = "SELECT quantite FROM `lignefraisforfait` where idVisiteur='$visiteur' and mois='$mois'";
$res = PdoGsb::$monPdo->query($req);
$nbr = $res->fetch();
$res1 = PdoGsb::$monPdo->query($req1);
$tab = $res1->fetchAll();
$ETP = ($tab[0]['quantite']) * 110;
$KM = ($tab[1]['quantite']) * 0.62;
$NUI = ($tab[2]['quantite']) * 80;
$REP = ($tab[3]['quantite']) * 25;
$HF = $nbr['totalHF'];
$total= $ETP + $KM + $NUI + $REP + $HF ;
$req2 = "UPDATE fichefrais SET montantValide='$total', dateModif=DATE(NOW()), idEtat='VA' WHERE idVisiteur='$visiteur' and mois='$mois'";
PdoGsb::$monPdo->exec($req2);
}
/**
* Crée un nouveau frais hors forfait pour un visiteur un mois donné
* à partir des informations fournies en paramètre
* @param $idVisiteur
* @param $mois sous la forme aaaamm
* @param $libelle : le libelle du frais
* @param $date : la date du frais au format français jj//mm/aaaa
* @param $montant : le montant
*/
public function creeNouveauFraisHorsForfait($idVisiteur,$mois,$libelle,$date,$montant){
$dateFr = dateFrancaisVersAnglais($date);
$req = "insert into lignefraishorsforfait
values('','$idVisiteur','$mois','$libelle','$dateFr','$montant')";
PdoGsb::$monPdo->exec($req);
}
/**
* Supprime le frais hors forfait dont l'id est passé en argument
* @param $idFrais
*/
public function supprimerFraisHorsForfait($idFrais){
$req = "delete from lignefraishorsforfait where lignefraishorsforfait.id =$idFrais ";
PdoGsb::$monPdo->exec($req);
}
/**
* Reporte le frais hors forfait dont l'id est passé en argument au mois suivant
* @param $idFrais
*/
public function reporterFraisHorsForfait($idFrais){
$req = "update lignefraishorsforfait set lignefraishorsforfait.mois = lignefraishorsforfait.mois + 1 where lignefraishorsforfait.id=$idFrais ";
PdoGsb::$monPdo->exec($req);
}
/**
* Reporte le frais hors forfait dont l'id est passé en argument au mois suivant
* @param $idFrais
*/
public function reporterSupressionFraisHorsForfait($idFrais, $libelle){
$req = "update lignefraishorsforfait set mois=mois+1, libelle='Refusé: $libelle' where lignefraishorsforfait.id = $idFrais";
PdoGsb::$monPdo->exec($req);
}
/**
* Retourne les mois pour lesquel un visiteur a une fiche de frais
* @param $idVisiteur
* @return un tableau associatif de clé un mois -aaaamm- et de valeurs l'année et le mois correspondant
*/
public function getLesMoisDisponibles($idVisiteur){
$req = "select fichefrais.mois as mois from fichefrais where fichefrais.idvisiteur ='$idVisiteur'
order by fichefrais.mois desc ";
$res = PdoGsb::$monPdo->query($req);
$lesMois =array();
$laLigne = $res->fetch();
while($laLigne != null) {
$mois = $laLigne['mois'];
$numAnnee =substr( $mois,0,4);
$numMois =substr( $mois,4,2);
$lesMois["$mois"]=array(
"mois"=>"$mois",
"numAnnee" => "$numAnnee",
"numMois" => "$numMois"
);
$laLigne = $res->fetch();
}
return $lesMois;
}
/**
* Retourne les Visiteur qui ont une fiche de frais
* @param $idVisiteur
* @return un tableau associatif de clé un mois -aaaamm- et de valeurs l'année et le mois correspondant
*/
public function getLesVisiteurs(){
$req = "SELECT visiteur.nom as nom, visiteur.prenom as prenom, visiteur.id as id FROM visiteur ORDER BY visiteur.nom ASC";
$res = PdoGsb::$monPdo->query($req);
$lesvisiteurs = $res->fetchAll();
return $lesvisiteurs;
}
/**
* Retourne les informations d'une fiche de frais d'un visiteur pour un mois donné
* @param $idVisiteur
* @param $mois sous la forme aaaamm
* @return un tableau avec des champs de jointure entre une fiche de frais et la ligne d'état
*/
public function getLesInfosFicheFrais($idVisiteur,$mois){
$req = "select ficheFrais.idEtat as idEtat, ficheFrais.dateModif as dateModif, ficheFrais.nbJustificatifs as nbJustificatifs,
ficheFrais.montantValide as montantValide, etat.libelle as libEtat from fichefrais inner join Etat on ficheFrais.idEtat = Etat.id
where fichefrais.idvisiteur ='$idVisiteur' and fichefrais.mois = '$mois'";
$res = PdoGsb::$monPdo->query($req);
$laLigne = $res->fetch();
return $laLigne;
}
/**
* Modifie l'état et la date de modification d'une fiche de frais
* Modifie le champ idEtat et met la date de modif à aujourd'hui
* @param $idVisiteur
* @param $mois sous la forme aaaamm
*/
public function majEtatFicheFrais($idVisiteur,$mois,$etat){
$req = "update ficheFrais set idEtat = '$etat', dateModif = now()
where fichefrais.idvisiteur ='$idVisiteur' and fichefrais.mois = '$mois'";
PdoGsb::$monPdo->exec($req);
}
}
?>
voila!!!!
Merci beaucoup!!