Page 1 sur 1

conv. PDF (suite) : Fatal Errors sur les fonctions

Posté : 08 avr. 2008, 17:36
par rastignac
Bonjour

voilà en essayant plusieurs manières de générer un tableau en pdf (à partir d'un fichier php), j'ai a chaque fois des fatal du type Fatal error: Call to undefined function: basictable().

Je pense donc que ces fonctions ne sont pas reconnues. mais...
<?php
ob_start();//pour éviter l'erreur output
require('fpdf.php');//la librairie d'Olivier(Fpdf)
require('PhpToPdf.php');

$pdf=new FPDF('P','mm','A4'); //je crée mon objet pdf,avec certaine caratéristique facultative

$pdf->AddPage();//je crée la page
$pdf->SetFont("Arial","B",16);
$pdf->Text(90,10,"DUPLEX");
$pdf->Image("./logos/logo.jpg", 90, 12);

class PDF extends FPDF
{
//Chargement des données
function LoadData($file)
{
    //Lecture des lignes du fichier
    $lines=file($file);
    $data=array();
    foreach($lines as $line)
        $data[]=explode(';',chop($line));
    return $data;
}

//Tableau simple
function BasicTable($header,$data)
{
    //En-tête
    foreach($header as $col)
        $this->Cell(40,7,$col,1);
    $this->Ln();
    //Données
    foreach($data as $row)
    {
        foreach($row as $col)
            $this->Cell(40,6,$col,1);
        $this->Ln();
    }
}

//Tableau amélioré
function ImprovedTable($header,$data)
{
    //Largeurs des colonnes
    $w=array(40,35,45,40);
    //En-tête
    for($i=0;$i<count($header);$i++)
        $this->Cell($w[$i],7,$header[$i],1,0,'C');
    $this->Ln();
    //Données
    foreach($data as $row)
    {
        $this->Cell($w[0],6,$row[0],'LR');
        $this->Cell($w[1],6,$row[1],'LR');
        $this->Cell($w[2],6,number_format($row[2],0,',',' '),'LR',0,'R');
        $this->Cell($w[3],6,number_format($row[3],0,',',' '),'LR',0,'R');
        $this->Ln();
    }
    //Trait de terminaison
    $this->Cell(array_sum($w),0,'','T');
}

//Tableau coloré
function FancyTable($header,$data)
{
    //Couleurs, épaisseur du trait et police grasse
    $this->SetFillColor(255,0,0);
    $this->SetTextColor(255);
    $this->SetDrawColor(128,0,0);
    $this->SetLineWidth(.3);
    $this->SetFont('','B');
    //En-tête
    $w=array(40,35,45,40);
    for($i=0;$i<count($header);$i++)
        $this->Cell($w[$i],7,$header[$i],1,0,'C',1);
    $this->Ln();
    //Restauration des couleurs et de la police
    $this->SetFillColor(224,235,255);
    $this->SetTextColor(0);
    $this->SetFont('');
    //Données
    $fill=0;
    foreach($data as $row)
    {
        $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill);
        $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
        $this->Cell($w[2],6,number_format($row[2],0,',',' '),'LR',0,'R',$fill);
        $this->Cell($w[3],6,number_format($row[3],0,',',' '),'LR',0,'R',$fill);
        $this->Ln();
        $fill=!$fill;
    }
    $this->Cell(array_sum($w),0,'','T');
}
}

$header=array('Pays','Capitale','Superficie (km²)','Pop. (milliers)');
//Chargement des données
$pdf->SetFont('Arial','',14);
$pdf->AddPage();
$pdf->BasicTable($header,'vvv');
$pdf->AddPage();
$pdf->ImprovedTable($header,'vvv');
$pdf->AddPage();
$pdf->FancyTable($header,'vvv');

ob_end_clean();//je clean  le header

	
$pdf->output();//j'affiche ma page

?> 
Une idée sur l'erreur et sa solution surtout ? :)

Posté : 08 avr. 2008, 17:41
par Ryle
Ta méthode basicTable() est définie pour un objet de type PDF, or, ta variable $pdf est une instance de FPDF (new FPDF(...)) qui ne connait pas cette méthode... ;)

Posté : 08 avr. 2008, 17:43
par rastignac
En fait, je crois que c'est moi qui est bête...
le fichier data.txt n'existe pas chez moi ça devrait régler le problème...

Posté : 08 avr. 2008, 17:47
par Ryle
Ta classe PDF étends de la classe FPDF. Elle hérite donc de ses méthodes et attributs. Les attributs et méthodes que tu définis pour la classe PDF en revanche ne sont disponible que pour ses instances à elle et pas celles de FPDF.

Si tu fais un
 $pdf=new FPDF('P','mm','A4') 
alors ton objet est de type FPDF et ne connait pas les méthodes spécifiques à PDF.
Si en revanche tu fais un
$pdf=new PDF('P','mm','A4')
alors ton objet est de type PDF et disposes de ses méthodes ainsi que de celles de FPDF dont il hérite :)

Posté : 08 avr. 2008, 17:53
par rastignac
Je crois que je comprends, oui

Mais quand j'instancie un PDF, comme tu me l'as dit, voilà ce qu'il me répond :
Fatal error: Cannot instantiate non-existent class

Si tu vas surement me dire que c'est normal... :) mais je débute, et quand je regarde des tutos et que je refais pareil ça me fait les mêmes erreurs lol....

aussi, quand j'essaye une autre méthode :
<?php
ob_start();//pour éviter l'erreur output
require('fpdf.php');//la librairie d'Olivier(Fpdf)
require('PhpToPdf.php');

$pdf=new FPDF('P','mm','A4'); //je crée mon objet pdf,avec certaine caratéristique facultative


$pdf->AddPage();//je crée la page
$pdf->SetFont("Arial","B",16);
$pdf->Text(90,10,"DUPLEX");
$pdf->Image("./logos/logo.jpg", 90, 12);

$proprietesTableau = array(
	'TB_ALIGN' => 'L',
	'L_MARGIN' => 15,
	'BRD_COLOR' => array(0,92,177),
	'BRD_SIZE' => '0.3',
	);
	
// Définition des propriétés du header du tableau.	
$proprieteHeader = array(
	'T_COLOR' => array(150,10,10),
	'T_SIZE' => 12,
	'T_FONT' => 'Arial',
	'T_ALIGN' => 'C',
	'V_ALIGN' => 'T',
	'T_TYPE' => 'B',
	'LN_SIZE' => 7,
	'BG_COLOR_COL0' => array(170, 240, 230),
	'BG_COLOR' => array(170, 240, 230),
	'BRD_COLOR' => array(0,92,177),
	'BRD_SIZE' => 0.2,
	'BRD_TYPE' => '1',
	'BRD_TYPE_NEW_PAGE' => '',
	);

// Contenu du header du tableau.	
$contenuHeader = array(
	50, 50, 50,
	"Titre de la première colonne", "année N-1", "année N",
	);

// Définition des propriétés du reste du contenu du tableau.	
$proprieteContenu = array(
	'T_COLOR' => array(0,0,0),
	'T_SIZE' => 10,
	'T_FONT' => 'Arial',
	'T_ALIGN_COL0' => 'L',
	'T_ALIGN' => 'R',
	'V_ALIGN' => 'M',
	'T_TYPE' => '',
	'LN_SIZE' => 6,
	'BG_COLOR_COL0' => array(245, 245, 150),
	'BG_COLOR' => array(255,255,255),
	'BRD_COLOR' => array(0,92,177),
	'BRD_SIZE' => 0.1,
	'BRD_TYPE' => '1',
	'BRD_TYPE_NEW_PAGE' => '',
	);	

// Contenu du tableau.	
$contenuTableau = array(
	"champ 1", 1, 2,
	"champ 2", 3, 4,
	"champ 3", 5, 6,
	"champ 4", 7, 8,
	);
	
$PDF->drawTableau($PDF, $proprietesTableau, $proprieteHeader, $contenuHeader, $proprieteContenu, $contenuTableau);


ob_end_clean();//je clean  le header
$pdf->output();//j'affiche ma page

?> 
il me répond ceci :

Fatal error: Call to a member function on a non-object in d:\program files\easyphp1-8\www\essaipdf3.php on line 70

Je recopie pourtant seulement le tuto, je pige pas

Posté : 08 avr. 2008, 18:10
par Ryle
"Mais c'est normal !" :) (j'y tenais pas plus que ça en fait, mais ça avait l'air de te faire plaisir ;))

Alors pour le "Call to a member function on a non-object" cela veut dire que tu fais appel à une méthode via la flèche (->) ou les deux points (::) alors que l'élément concerné n'est pas un objet. En effet, ta variable $PDF n'est pas la même que celle que tu as instancié plus haute $pdf.
PHP n'est pas sensible à la casse pour les fonctions mais il l'est pour les variables ;)

Concernant le problème de "non-existent class", c'est tout simplement qu'il te faut avoir déclaré quelque part ta classe (class PDF extends FPDF {...}), que ce soit dans un include ou directement dans ton code avant de pouvoir l'utiliser. S'il ne trouve pas la classe, il ne peut pas l'instancier :)