Page 1 sur 2

Problème avec ma classe et la librairie GD.

Posté : 05 mars 2007, 21:05
par christopher
Salut,

J'ai créé une classe pour tracer des graphiques mais impossible de les afficher. Lorsque je lance ma page Stat.php j'ai une croix rouge à la place de mon image, et impossible d'afficher la source de ma page !!!

Comment faire...?

Ma classe :
<?php
class LeaStat {

        Private $idimg;
        Public $Title_Size;
        Public $Title_Color;
        Public $Text_Color;

        Public function __construct() {
                $this->Text_Color = $this->RGBcolor(0, 0, 0);
                $this->Title_Color = $this->RGBcolor(0, 0, 0);
        }

        Public function BackGroundColor($red, $green, $blue) {
                //.................. etc...
        }
        
        Public function RGBcolor($red, $green, $blue) {
                //.................. etc...
        }
        
        Public function Pie($Title, $Def, $Data, PERCENT_ON, EFFECT_3D_ON) {
                header('Content-type: image/png');
                //...........................
                //.....................
                //..................
                //............etc...
                imagepng($this->idimg);
                imagedestroy($this->idimg);
        }
}
?>
Ma page Stat.php :
<?php
        require_once 'Lib/Lea.php';

        $Def = array('Hewlett-Packard', 'Packard Bell', 'Dell', 'Acer', 'Fujitsu Siemens', 'Autres');
        $Data = array(17.80, 13.90, 12.40, 12.10, 6.00, 38.00);
        $Title = 'Etude du marché français de la micro-informatique';
        
        /* Object */
        $Pie = new LeaStat();
        $Pie->BackGroundColor(240, 240, 255);
        $Pie->Title_Size = 15;
        $Pie->Title_Color = $Pie->RGBcolor(0, 0, 0);
        $Pie->Pie($Title, $Def, $Data, PERCENT_ON, EFFECT_3D_ON);
?>
<html>
<head>
</head>
<body>
<img src="Lib/Class/Lea.Stat.class.php" />
</body>
</html>
Merci d'avance :wink: .

Posté : 06 mars 2007, 08:43
par titerm
Tu créés une classe qui génère une image, et tu fourni en source a l'image cette classe....
Dans la page principale, tu instancies la classe, tu appelles ses fonctions et rien...

Il faut
- soit fournir a ton image le source qui génère l'image (la class et son instantiation et utilisation).

- Soit faire comme tu as fais mais ne pas utiliser de source externe pour l'image mais la définir en inline avec la balise suivante

<img src="data:image/gif;base64,DATA">

ou DATA sera le résultat de ta fonction Pie() sans le header et encoder en base 64 via base64_encode...

La mauvaise nouvelle, c'est que IE (même le 7) gère mal cette partie de la norme HTML et donc tu n'as vraiment le choix que d'utiliser la 1ère methode.

Posté : 06 mars 2007, 19:17
par christopher
Salut, et encore merci pour ta réponse...

Mais malheureusement je n'ai pas trop compris...

Je vais être lourd, mais peut m'expliquer un peu plus ta première solution ???

Merci beaucoup.

Posté : 06 mars 2007, 21:26
par titerm
En gros, tu fais un 3eme fichier dans lequel tu appels le fichier qui instancie la class et génère ton image, ton fichier Stat.php

3emefichier.php ou .html pour le coup vu qu'il n'y a pas de php dedans pour cet exemple


Code : Tout sélectionner

<html> <head> <title>image test</title> </head> <body> <img src="Stat.php"> </body> </html>

Posté : 07 mars 2007, 00:05
par christopher
J'ai changé le chemin de mon require_once et maintenant quand je lance ma page stat.php j'ai un message d'erreur :
L'image “http://www.tableadmin.info/LeaLibrary2/Stat.php” ne peut être affichée car elle contient des erreurs.
require_once 'Lib/Class/Lea.Stat.class.php';
Sinon :

J'ai fait se que tu m'a dit mais toujours rien !

Ma page Stat.php
<?php
	require_once 'Lib/Lea.php';

	$Def = array('Hewlett-Packard', 'Packard Bell', 'Dell', 'Acer', 'Fujitsu Siemens', 'Autres');
	$Data = array(17.80, 13.90, 12.40, 12.10, 6.00, 38.00);
	$Title = 'Etude du marché français de la micro-informatique';
	
	/* Object creating */
	$Pie = new LeaStat();
	$Pie->BackGroundColor(240, 240, 255);
	$Pie->Title_Size = 15;
	$Pie->Title_Color = $Pie->RGBcolor(0, 0, 0);
	$Pie->Pie($Title, $Def, $Data, PERCENT_ON, EFFECT_3D_ON);
?>
Ma page d'affichage :

Code : Tout sélectionner

<html> <head> </head> <body> <img src="Stat.php" /> </body> </html>
Je comprend vraiment pas ! Y a t'il une option a activer ?
Je travail sous PHP 5, cela a-t-il une influence ?

Posté : 07 mars 2007, 00:34
par christopher
J'ai changé le chemin de mon require_once et maintenant quand je lance ma page stat.php j'ai un message d'erreur :
L'image “http://www.tableadmin.info/LeaLibrary2/Stat.php” ne peut être affichée car elle contient des erreurs.
require_once 'Lib/Class/Lea.Stat.class.php';
Sinon :

J'ai fait se que tu m'a dit mais toujours rien !

Ma page Stat.php
<?php
	require_once 'Lib/Lea.php';

	$Def = array('Hewlett-Packard', 'Packard Bell', 'Dell', 'Acer', 'Fujitsu Siemens', 'Autres');
	$Data = array(17.80, 13.90, 12.40, 12.10, 6.00, 38.00);
	$Title = 'Etude du marché français de la micro-informatique';
	
	/* Object creating */
	$Pie = new LeaStat();
	$Pie->BackGroundColor(240, 240, 255);
	$Pie->Title_Size = 15;
	$Pie->Title_Color = $Pie->RGBcolor(0, 0, 0);
	$Pie->Pie($Title, $Def, $Data, PERCENT_ON, EFFECT_3D_ON);
?>
Ma page d'affichage :

Code : Tout sélectionner

<html> <head> </head> <body> <img src="Stat.php" /> </body> </html>
Je comprend vraiment pas ! Y a t'il une option a activer ?
Je travail sous PHP 5, cela a-t-il une influence ?

Posté : 07 mars 2007, 07:48
par Tictac
que retourne cette fonction => $Pie->Pie($Title, $Def, $Data, PERCENT_ON, EFFECT_3D_ON); ?

Ca pourrait aider à comprendre !

Posté : 07 mars 2007, 09:31
par titerm
Tu vas dans le répertoire log de ton apache, et tu regarde le contenu de php_error.log...

Il se trouve ici
echo ini_get('error_log');
Tu vas constater que tu as probablement une erreur php et que ducoup, le contenu de ton image n'est pas valide.

Pour débugger, tu peux appeler directement dans la barre d'url du navigateur ton fichier Lib/Class/Lea.Stat.class.php, et si dans ta fonction Pie() tu commentes temporairement le header('Content-type',...) tu verras s'afficher les messages d'erreur s'il y en a.

Posté : 07 mars 2007, 10:15
par christopher
Pour l'erreur j'ai trouvé, mon serveur ne trouvait pas le fichier arial.ttf pour la fonction imagettftext.

Et pour répondre a TicTac ma fonction renvoi un graphique avec un diagramme circulaire :wink:

Parcontre j'ai un gros problème !

J'obtient une image de 600x400px mais avec une croix rouge à la pace de mon graphique !

Et quand je fait le ini_get() j'ai aucune erreur.
<?php echo ini_get('error_log'); ?>
j'ai créé un librairie avec une multitude de classes donc je passe par un fichier qui me les rassemble toutes, mais quand je passe par se fichier ça plante il me dit qu'il ne trouve pas la classe !

Ma classe Lea.Stat.class.php :
<?php
class LeaStat {
	
	/* Size of Image */
	Private $idimg;
	Private $Frame = 20;
	Private $WidthImg;
	Private $HeightImg;
	Private $BG_Color = array();
	Private $Text_Size;
	Private $BlackColor;
	
	Public  $Title_Police = 'arial.ttf';
	Public 	$Title_Size = 30;
	Public  $Title_Color = array();
	Public  $Text_Police = 'arial.ttf';
	Public  $Text_Color = array();
	Public  $Pie_Size = 250;
	Public  $Pie_Thickness = 50;
	Public  $Rect_Size = 10;
	Public 	$Rect_Step = 25;
	
	Public function __construct() {
		$this->Text_Color = $this->RGBcolor(0, 0, 0);
		$this->Title_Color = $this->RGBcolor(0, 0, 0);
	}
			
	/**
	 * This function return an array of RGB color.
	 *
	 * @param Integer $Red
	 * @param Integer $Green
	 * @param Integer $Blue
	 * @return Array
	 */
	Public function RGBcolor($Red, $Green, $Blue) {
		return array('R' => $Red, 'G' => $Green, 'B' => $Blue);
	}
	
	/**
	 * This function define de background color.
	 *
	 * @param Array $BackGroundColor
	 */
	Public function BackGroundColor($Red, $Green, $Blue) {
		$this->BG_Color = $this->RGBcolor($Red, $Green, $Blue);
	}
	
	Private function CreateBackground($WidthImg, $HeightImg) {
		$this->WidthImg = $WidthImg;
		$this->HeightImg = $HeightImg;
		$this->idimg = imagecreate($this->WidthImg, $this->HeightImg);
		$Background = imagecolorallocate($this->idimg, $this->BG_Color['R'], $this->BG_Color['G'], $this->BG_Color['B']);
		$this->BlackColor = imagecolorallocate($this->idimg, 0, 0, 0);
	}
	
	Public function Pie($Title, $DefArray, $DataArray, $PourcentType = true, $DimEffect = true) {
        //...........................................
        //...........................................
        //.................................
        }
}
?>
Le fichier Lea.Config.php :
<?php
/* Language */
define('LANG', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

/* Folder Path */
define('HTTP_HOST', $_SERVER['HTTP_HOST']);
define('ROOT', $_SERVER['DOCUMENT_ROOT']);
define('FOLDER_PARENT', '');
define('FOLDER_LIB', 'Lib/');
define('FOLDER_CLASS', 'Class/');
define('FOLDER_CONFIG', 'Config/');
define('FOLDER_JAVA', 'Java/');
define('FOLDER_TEMPLATE', 'Templates/');
define('FOLDER_LANG', 'Languages/');
define('FOLDER_FONTS', 'Fonts/');
?>
Mon fichier lea.php du dossier Lib/ :
<?php
/* Define the constant */
require_once 'Lea.Config.php'; // Loading of file configuration.

/* Require the headers */
require_once FOLDER_CONFIG.'Lea.Init.php'; // PHP Initialization.

/* Loading of language file */
if(file_exists(FOLDER_PARENT.FOLDER_LIB.FOLDER_LANG.'Lea.Lang.'.LANG.'.php')) {
	require_once FOLDER_LANG.'Lea.Lang.'.LANG.'.php';
	$GLOBALS['lang'] = $lang;
} else {
	require_once FOLDER_LANG.'Lea.Lang.eng.php';
	$GLOBALS['lang'] = $lang;
}
		                   
/* Require the class */
require_once FOLDER_CLASS.'Lea.Connect.class.php'; // Class MySQL connection.
require_once FOLDER_CLASS.'Lea.String.class.php'; // Class String processing.
require_once FOLDER_CLASS.'Lea.Template.class.php'; // Class Templates engine.
require_once FOLDER_CLASS.'Lea.Session.class.php'; // Class Sessions processing.
require_once FOLDER_CLASS.'Lea.Cookies.class.php'; // Class Cookies processing.
require_once FOLDER_CLASS.'Lea.Auth.class.php'; // Class Authentification processing.
require_once FOLDER_CLASS.'Lea.Text.class.php'; // Class Text processing.
require_once FOLDER_CLASS.'Lea.Image.class.php'; // Class Image processing.
require_once FOLDER_CLASS.'Lea.Search.class.php'; // Class Search processing.
require_once FOLDER_CLASS.'Lea.Account.class.php'; // Class Account processing.
require_once FOLDER_CLASS.'Lea.Date.class.php'; // Class Calendar processing.
require_once FOLDER_CLASS.'Lea.Mail.class.php'; // Class Mail processing.
require_once FOLDER_CLASS.'Lea.Stat.class.php'; // Class Stat processing.

/* Print informations library */
$LeaTemplate = new LeaTemplate(FOLDER_PARENT.FOLDER_LIB.FOLDER_TEMPLATE);
$LeaTemplate->SetFile("Infos", "Lea.Infos.tpl");
$LeaTemplate->ParseDisplay("Infos");

?>
Ma page qui appel la librairie et ou je créé mon objet :
<?php
        // Avec ce chemin ci ça fonctionne :
        // require_once 'Lib/Class/Lea.Stat.class.php';
        // Mais pas avec celui-ci :
        require_once 'Lib/Lea.php';


	$Def = array('Hewlett-Packard', 'Packard Bell', 'Dell', 'Acer', 'Fujitsu Siemens', 'Autres');
	$Data = array(17.80, 13.90, 12.40, 12.10, 6.00, 38.00);
	$Title = 'Etude du marché français de la micro-informatique';
	
	/* Object creating */
	$Pie = new LeaStat();
	$Pie->BackGroundColor(240, 240, 255);
	$Pie->Title_Size = 15;
	$Pie->Title_Color = $Pie->RGBcolor(0, 0, 0);
	$Pie->Pie($Title, $Def, $Data);
?>

Posté : 07 mars 2007, 10:37
par mere-teresa
Le code source HTML que donne-t-il ? (oui oui, là où il y a la croix rouge)

Posté : 07 mars 2007, 10:42
par titerm
Et quand je fait le ini_get() j'ai aucune erreur.
Je crois qu'on s'est mal compris, le ini_get sert juste a ton montrer ou se trouve le fichier d'erreur... Il faut ensuite aller le consulter...

Posté : 07 mars 2007, 10:54
par christopher
Sur ma page stat.php j'ai pas de code source !

Et voila le code source de ma page diag.php

Code : Tout sélectionner

<html> <head> </head> <body> <img src="Stat.php" /> </body> </html>

Posté : 07 mars 2007, 11:09
par titerm
Dans ta fonction pie() a la fin
fais
imagepng($this->idimg,'/tmp/monimage.png');

et edit l'image /tmp/monimage.png avec un editeur quelquonque... Tu devrais y trouver des messages d'erreur au milieu du code binaire de l'image

Posté : 07 mars 2007, 11:13
par christopher
J'ai fait la manipulation :
imagepng($this->idimg, 'pie.png');
Et j'obtient mon image PNG, elles est correcte.

Posté : 07 mars 2007, 11:52
par titerm
Quand tu dis elle est correct, cad que si tu met le chemin dans la barre d'url du navigateur , elle s'affiche correctement ??