[PHP5] PHPDRAW - LE PHOTOSHOP DE PHP (OU PRESQUE...)

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 8 oct. 2007 à 00:32
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 1 déc. 2007 à 11:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44299-php5-phpdraw-le-photoshop-de-php-ou-presque

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 déc. 2007 à 11:36
Hey dudes !

S'il y en a qui lisent ce commentaire... ;-)
Ce package a été nomminé aux Innovation awards de phpclasses.org
http://www.phpclasses.org/browse/package/4212.html

Votez pour moi ;-) !
Merciii !
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 nov. 2007 à 10:38
@_KLESK => ah, petite explication quand même...c'est simple, c'est au niveau du parsing de ma chaîne de commande, tu verras que j'ai modifié la méthode. Avant je faisais un simple explode() sur les espaces. Ce n'est plus suffisant, évidemment, pour le texte délimité par des guillemets. Donc, j'ai écrit une bête petite expression régulière qui va à la fois exploser ma chaîne toujours sur les espaces, OU récupérer en entier toute chaîne entre guillemets s'il en trouve une.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 nov. 2007 à 10:35
@_KLESK => voilà, tu vas être content, j'ai fini par mettre à jour ce code avec la possibilité d'écrire du texte. ca te montre la voie :-)

J'ai aussi ajouté tes 2 classes, merci pour ta contribution :-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 oct. 2007 à 13:07
Oui désolé je n'ai pas encore eu le temps. Ja tâcherai de me pencher dessus ce week-end. J'espère. :-)
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
18 oct. 2007 à 13:00
Moi moi moi je sais !!!!!

heu.... [PHP5] ??

;)

Ps: Merci de lire les titres souvent ca aide !!
Pps : malalam, dès que tu as du temps je suis toujours preneur de ton expliquation pour le text et ses espaces, toute cette histoire de "quoting".
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 oct. 2007 à 17:11
Tu as lu le titre de mon code?
[PHP5] PHPDRAW - LE PHOTOSHOP DE PHP (OU PRESQUE...)
Y a rien qui te choque...? ;-)
francisnguyen Messages postés 5 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 17 octobre 2007
17 oct. 2007 à 16:23
PHP Version 4.3.10

Tu crois que ca vient de là?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 oct. 2007 à 12:45
T'as quelle version de php...?
francisnguyen Messages postés 5 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 17 octobre 2007
17 oct. 2007 à 09:56
Bonjour,

Merci d'avoir répondu.

J'utilisai pas firebug, mais finalement c'est assez utile.

Voici l'erreur qu'il trouve :



Parse error: parse error in c:\program files\easyphp1-8\www\divers\phpdraw\ajax\ajax.draw

.php on line 7


Le problème c'est que je vois pas ce qui cloche dans le code.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 oct. 2007 à 20:12
Hello,

1 - mets tous les scripts en error_reporting(E_ALL) (je devrais mettre ça par défaut sur tous mes scripts...mon php est configuré ainsi mais il est vrai que quand je partage des codes, les gens n'ont peut-être pas la même config), afin de voir si ce n'est pas une erreur php non affichée.
2 - installe firebug sur Mozilla et tâche de voir si la requête xmlhttp (ajax) se lance.
3 - y a pas de 3, on vavisera après ces 2 précédents tests :-)
cs_Steves Messages postés 15 Date d'inscription lundi 25 mars 2002 Statut Membre Dernière intervention 16 octobre 2007
16 oct. 2007 à 17:49
recommence
francisnguyen Messages postés 5 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 17 octobre 2007
16 oct. 2007 à 16:18
Bonjour,

Chez moi ca ne marche pas ni sur IE, ni sur FF.

J'ai une config easyphp 1.8

Vous avez une idée de ce qui bloque.

J'ai aucun message d'erreur dans la console de FF.

et j'ai fait la modif dans le fichier inc.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 oct. 2007 à 19:52
@_klesk => demain si je trouve le temps, j'ajoute tes fonctions au code et j'ajoute aussi le traitement du texte afin de te montrer ce que je voulais dire.
@Steves => bah merci :-) Ravi que cela te plaise. Quant à la difficulté du bin's...tout est une question d'expérience :-) Je code en php depuis une 10aine d'années, ça aide, on a plus les mêmes notions de complexité au bout d'un moment.
cs_Steves Messages postés 15 Date d'inscription lundi 25 mars 2002 Statut Membre Dernière intervention 16 octobre 2007
12 oct. 2007 à 11:28
Excellent, j'aime vraiment.
Quand je pense que pour toi c'est un amusement, pour moi c'est hard.
Merci encore.
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
11 oct. 2007 à 14:00
j'ai bien trouver quelque chose pour s'assurer que le text est bien délimiter par ' ou par " mais ça ne resou pas mon probleme il y a toujours une erreure lorsqu'il y a un espace je n'arrive pas a "quoter" comme tu me l'a expliquer.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 oct. 2007 à 13:20
Il suffit de les "quoter". Tu les délimites avec des guillemets, tes textes, c'est une règle, comme les autres règles de la classe. donc si tu fais par exemple: WRITE "mon texte", tu sais dans la classe que dès que tu as WRITE comme commande, tu dois avoir un texte délimité par des guillemets.
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
11 oct. 2007 à 11:50
J'arrive à mettre du text mais je suis coincé quand y à des espaces, si ca interesse je peu renvoyer toute la class.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
10 oct. 2007 à 23:15
@_Klesk => merci :-) Et bien pour les ajouts! Tu as respecté la norme imposée, ça rentre parfaitement dans la classe. Très bien :-) Manque l'ajout de textes :-) Faut ruser un peu et trouver une nouvelle norme pour les commandes, mais c'est facilement faisable.
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
10 oct. 2007 à 00:24
Au passage je n'ai pas noter alors je le fait.

9/10 : pourquoi, pas parce que c'est mal codé ce serait trop exagérer de ma part vu mon niveau par rapport a toi, mais tout simplement parce qu'il n'y avait pas toute les fonctions de dessin de php.

Alors on me dira oui ce n'est pas le but de ce code, et je serait d'accord mais il faut bien avoir une raison pour ne pas mettre 10/10 et 10/10 == un code parfait or a ma connaissance ce code n'existe pas même s'il peu s'en rapprocher. ;)

Great Job tout de même.
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
10 oct. 2007 à 00:14
Du coup maintenant que ca marche j'ai etoffer le fichier class.interpreter.php de façon à avoir d'autre fonction, bien sur on peu en rajouter pas mal.

<?php
/**
* Notre INTERFACE EXPRESSION
*
*/
interface expression {
public static function interpret(interpreter $subject, $mParam);
}

/**
* Une EXPRESSION CONCRETE pour les mouvements vers la droite
*
*/
class right implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid distance '.$mParam);
}
$mParam = (int)$mParam;
if (false === imageline($subject->IMG, $subject->X, $subject->Y, $subject->X+$mParam, $subject->Y, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create line');
}
$subject->X += $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour les mouvements vers la gauche
*
*/
class left implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid distance '.$mParam);
}
$mParam = (int)$mParam;
if (false === imageline($subject->IMG, $subject->X, $subject->Y, $subject->X-$mParam, $subject->Y, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create line');
}
$subject->X -= $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour les mouvements vers le haut
*
*/
class up implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid distance '.$mParam);
}
$mParam = (int)$mParam;
if (false === imageline($subject->IMG, $subject->X, $subject->Y, $subject->X, $subject->Y-$mParam, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create line');
}
$subject->Y -= $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour les mouvements vers le bas
*
*/
class down implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid distance '.$mParam);
}
$mParam = (int)$mParam;
if (false === imageline($subject->IMG, $subject->X, $subject->Y, $subject->X, $subject->Y+$mParam, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create line');
}
$subject->Y += $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour la création d'une ellipse
*
*/
class ellipse implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(false === strpos($mParam, '-')) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid parameter '.$mParam);
}
$aParam = explode('-', $mParam);
$iWidth = (int)$aParam[0];
$iHeight = (int)$aParam[1];
if (false === imageellipse($subject->IMG, $subject->X, $subject->Y, $iWidth, $iHeight, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create ellipse');
}
$subject->Y += $mParam;
}
}
/**
* Une EXPRESSION CONCRETE pour la création d'une ellipse remplie
*
*/
class filledellipse implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(false === strpos($mParam, '-')) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid parameter '.$mParam);
}
$aParam = explode('-', $mParam);
$iWidth = (int)$aParam[0];
$iHeight = (int)$aParam[1];
if (false === imagefilledellipse($subject->IMG, $subject->X, $subject->Y, $iWidth, $iHeight, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create ellipse');
}
$subject->Y += $mParam;
}
}
/**
* Une EXPRESSION CONCRETE pour la création d'un arc remplis
*
*/
class filledarc implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(false === strpos($mParam, '-')) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid parameter '.$mParam);
}
$aParam = explode('-', $mParam);
$iWidth = (int)$aParam[0];
$iHeight = (int)$aParam[1];
$iStart = (int)$aParam[2];
$iEnd = (int)$aParam[3];
if (false === imagefilledarc($subject->IMG, $subject->X, $subject->Y, $iWidth, $iHeight, $iStart, $iEnd, $subject->RCOLOR, IMG_ARC_PIE)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create ellipse');
}
$subject->Y += $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour la création d'un rectangle
*
*/
class rectangle implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(false === strpos($mParam, '-')) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid parameter '.$mParam);
}
$aParam = explode('-', $mParam);
$iX = (int)$aParam[0];
$iY = (int)$aParam[1];
if (false === imagerectangle($subject->IMG, $subject->X, $subject->Y, $iX, $iY, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create rectangle');
}
$subject->Y += $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour la création d'un polygone
*
*/
class polygon implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(false === strpos($mParam, '-')) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid parameter '.$mParam);
}
$aParam = array_map ('intval', explode('-', $mParam));
$iCount = count($aParam);
if(0 !== $iCount%2) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : total points must be even : '.$iCount);
}
$iCount /= 2;
if (false === imagepolygon($subject->IMG, $aParam, $iCount, $subject->RCOLOR)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to create polygon');
}
$subject->Y += $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour la couleur du trait
*
*/
class color implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam) || 9 !== strlen($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid color '.$mParam);
}
$iRed = (int)substr($mParam, 0, 3);
$iGreen = (int)substr($mParam, 3, 3);
$iBlue = (int)substr($mParam, 6, 3);
$subject->RCOLOR = imagecolorallocate($subject->IMG, $iRed, $iGreen, $iBlue);
$subject->SCOLOR = $mParam;
if(false === $subject->RCOLOR) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to allocate color '.$mParam);
}
}
}

/**
* Une EXPRESSION CONCRETE pour la position X
*
*/
class x implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid position '.$mParam);
}
$mParam = (int)$mParam;
$subject->X = $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour la position Y
*
*/
class y implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid position '.$mParam);
}
$mParam = (int)$mParam;
$subject->Y = $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour l'épaisseur du trait
*
*/
class pixel implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_numeric($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid position '.$mParam);
}
$mParam = (int)$mParam;
if (false === imagesetthickness($subject->IMG, $mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to set thickness '.$mParam);
}
$subject->SPIXEL = $mParam;
}
}

/**
* Une EXPRESSION CONCRETE pour la sauvegarde de l'iamegs sous un nom particulier
*
*/
class file implements expression {
public static function interpret(interpreter $subject, $mParam) {
if(!is_string($mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid filename '.$mParam);
}
if (false === imagepng($subject->IMG, $mParam)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : Failed to ssave image to file '.$mParam);
}
}
}

/**
* Notre INTERPRETER
*
*/
class interpreter {
private $iX = 200;
private $iY = 200;
private $sColor;
private $iWidth = 500;
private $iHeight = 500;
private $iThickNess = 1;
private $aDefaultDim = array(500,500);
private $oExpressionStack;
private $imh;
private $colorh;

private $aCor = array(
'X' => array('cor' => 'iX', 'type' => 'is_int', 'gettable' => true, 'settable' => true),
'Y' => array('cor' => 'iY', 'type' => 'is_int', 'gettable' => true, 'settable' => true),
'COLOR' => array('cor' => 'sColor', 'type' => 'is_string', 'gettable' => true, 'settable' => true),
'SCOLOR' => array('cor' => 'sColor', 'type' => 'is_string', 'gettable' => true, 'settable' => true),
'RCOLOR' => array('cor' => 'colorh', 'type' => 'is_int', 'gettable' => true, 'settable' => true),
'WIDTH' => array('cor' => 'iWidth', 'type' => 'is_int', 'gettable' => true, 'settable' => true),
'HEIGHT' => array('cor' => 'iHeight', 'type' => 'is_int', 'gettable' => true, 'settable' => true),
'PIXEL' => array('cor' => 'iThickNess', 'type' => 'is_int', 'gettable' => true, 'settable' => true),
'SPIXEL' => array('cor' => 'iThickNess', 'type' => 'is_int', 'gettable' => true, 'settable' => true),
'IMG' => array('cor' => 'imh', 'type' => 'is_resource', 'gettable' => true, 'settable' => false)
);

public function __construct($sFile = null) {
if(!is_null($sFile)) {
$this->imh = @imagecreatefrompng($sFile);
if(!$this->imh) {
throw new functionnalException(__CLASS__.'::'.__FUNCTION__.'() : '.$sFile.' has not been found');
}
} else {
$this->imh = imagecreatetruecolor($this->iWidth, $this->iHeight);
imagecolorallocate($this->imh, 0, 0, 0);
}
}

public function interpret ($sChaine) {
if(!is_string($sChaine)) {
throw new functionnalException(__CLASS__.'::'.__FUNCTION__.'() : Parameter must be a string');
}
$this->oExpressionStack = new ArrayIterator(explode(' ', $sChaine));
$this->evaluate();
}

private function evaluate() {
while($this->oExpressionStack->valid()) {
$sToken = $this->oExpressionStack->current();
if(!class_exists($sToken)) {
throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid expression '.$sToken);
}
$this->oExpressionStack->next();
$mParam = $this->oExpressionStack->current();
$interpreter = new ReflectionMethod($sToken, 'interpret');
$interpreter->invoke(null, $this, $mParam);
$this->oExpressionStack->next();
}
}

public function getMove() {
if(true === headers_sent()) {
throw new functionnalException(__CLASS__.'::'.__FUNCTION__.'() : Unable to display image, headers already sent');
}
header('Content-type: image/png');
imagepng($this->imh);
}

public function getSavedMove($sFile) {
imagepng($this->imh, $sFile);
}

public function __get($sProp) {
if(!array_key_exists($sProp, $this->aCor) || !isset($this->aCor[$sProp]['gettable']) || false === $this->aCor[$sProp]['gettable']) {
throw new functionnalException(__CLASS__.'::'.__FUNCTION__.'() : Property '.$sProp.' is not gettable');
}
$sThisProp = $this->aCor[$sProp]['cor'];
return $this->$sThisProp;
}

public function __set($sProp, $mVal) {
if(!array_key_exists($sProp, $this->aCor) || !isset($this->aCor[$sProp]['settable']) || false === $this->aCor[$sProp]['settable'] || !isset($this->aCor[$sProp]['type'])) {
throw new functionnalException(__CLASS__.'::'.__FUNCTION__.'() : Property '.$sProp.' is not settable');
}
$sFunc = $this->aCor[$sProp]['type'];
if(!$sFunc($mVal)) {
throw new functionnalException(__CLASS__.'::'.__FUNCTION__.'() : Value '.$mVal.' is not a valid value for '.$sProp.'; waited : '.substr($sFunc, 3));
}
if($sProp === 'COLOR') {
color::interpret($this, $mVal);
$this->sColor = $mVal;
} elseif($sProp === 'PIXEL') {
pixel::interpret($this, $mVal);
$this->iThickNess = (int)$mVal;
} else {
$sThisProp = $this->aCor[$sProp]['cor'];
$this->$sThisProp = $mVal;
}
}
}
?>

et avec ces rajout et ce code on peut obtenir des truc sympa

le bien / le mal :

x 250 y 250 filledarc 500-500-90-270 x 250 y 250 filledarc 500-500-270-180 x 250 y 250 ellipse 500-500 x 250 y 125 ellipse 250-250 x 250 y 375 color 255255255 filledellipse 250-250 color 000000000 x 253 y 125 filledellipse 247-250 color 255255255 x 250 y 125 filledellipse 110-110 color 000000000 x 250 y 375 filledellipse 110-110
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 oct. 2007 à 22:02
Ah ben oui le inc est paramétré pour mon chemin...:-) En effet, je n'y avais pas pensé.
Ravi que ça fonctionne mieux :-)
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
9 oct. 2007 à 21:39
A y est c'est bon.

j'ai modifier inc.main.php a la ligne 4 en :define('PATH_CLASS', '../class/');
tout simplement et la ca marche.

j'ai du aussi bien sur chmoder tmpimg en 777 ;)

Merci de votre aide.
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
9 oct. 2007 à 21:31
je vient de regarder dans firebug et effectivement c'est bien au niveau de la requete POST, mais le gros probleme c'est le $_SERVER['document_root'], il semble poser probleme dans le require_once de inc/inc.main.php.

En sachant que je suis dans un dossier du type www.lesite.com/~moi/phpdraw

Je cherche encore si vous avez une idée je suis preneur :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 oct. 2007 à 20:35
Ca c'est très bizarre parce que moi aussi...lol.
mets toi en error_reporting(E_ALL) dans le script ajax (ajax/ajax.phpdraw.php). Il y a sûrement un message d'erreur. Ou alors, c'est le js mais Firefox devrait le dire.
Difficile de debugger comme ça à distance. Dans le pire des cas, avec Firbug, tu devrais au moins voir le message d'erreur arriver dans la requête POST d'Ajax (dans la console, en dépliant la requête, dans l'onglet réponse).
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
9 oct. 2007 à 20:21
ff 2.0.0.7 Ie 7 et php 5.2.1
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 oct. 2007 à 19:53
quelle est ta configuration ? Php et navigateur?
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
9 oct. 2007 à 19:35
mon problème est simple :
losque je prend les commandes qui sont proposer dans la doc (ex : right 40), il se passe rien, bien sur j'ai noter pour la compatibilitée FF.

je n'est pas encore tester avec la MAJ.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 23:10
Bon ben voilà, c'est compatible IE, IE7 en tous cas.
Coucou => le but était de faire un revival simplifié du LOGO. D'avoir un langage simple et compréhensible, simplement. Clairement, ce code n'a aucune autre utilité que d'être pédagogique et d'amuser 5mn. Je ne vais pas utiliser une syntaxe complexe pour ça. right, yp, rectangle, color...ça a le mérite d'être compréhensible par tous. Un path svg...moins ;-)
Si jamais je me lance dans un véritable éditeur graphique en php, par contre, pourquoi pas en effet! Parce que ça reste une très bonne idée. Mais pas sur ce code-ci.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 23:03
t'as fait ta propre syntaxe de commandes, utiliser celle du w3c aurait ete plus judicieux
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 22:47
Coucou => tu peux expliquer un peu plus précisément stp, je n'ai pas saisi de quoi tu parlais?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 22:47
Que t'arrive-t-il avec au juste ? Pour rappel, je ne l'ai testé que sous Firefox (2), donc je ne sais pas ce qu'il en est sous IE, mais à mon avis...niet.
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
8 oct. 2007 à 22:03
Bonsoir, je suis effectivement certain que ce code a une vertue certaine et je suis en ce moment a la recherche d'explication claire, précise et concies sur le comment du pourquoi des classes et la POO.

Cependent je n'arrive pas a faire fonctionner ce code O_o.

Cordialement.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 19:18
Ce que je voulais dire pour le svg, c'est que t'aurais pu parser un path ou autre pour afficher un path svg dans une image png...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 12:48
Hello,

On verra ce soir si l'upload des tutos fonctionne :-)

- Les commentaires : je commente généralement quand j'ai fini un code totalement. Là, j'ai continué à modifier des trucs, d'où le peu de commentaires. Ceux qui y sont ne sont que la copie du code très simplifié que j'ai fait pour le tuto. Ceci dit, je commente généralement ainsi (et c'est ainsi que je les mettrai) :
méthode/classe/propriété
@desc
@var si propriété
@param si méthode
@return si méthode
Ce sont les seuls tags que j'utilise généralement.
Quant aux sauts de ligne : j'aime bien aérer mes codes en règle générale! ET pour le //, je ne trouve pas ça lisible. C'est vraiment simplement une préférence personnelle.

- les exceptions : j'utilise tjrs la même base pour les exceptions : j'ai généralement une classe main ou generic qui envoie des mails/logge les exceptions avec une mise en page bien précise, d'où le passage en paramètre de __CLASS__ et de __METHOD__. Là j'ai conservé les mêmes appels mais j'ai supprimé la classe parente dont je n'avais pas besoin sur ce code. Eventuellement, je peux la rajouter pour conserver une cohérence. IL y a aussi que j'aime bien voir mes messages précédés de l'appel, en plus du backtrace.

- je connais bien svg, mais ce n'était pas le but ici. J'ai voulu me caler sur GD uniquement. Ceci dit pourquoi pas imaginer différents moteurs graphiques possible en effet. On conserve l'interface, on crée des package de moteurs graphiques et un package général de classes abstraites mettant à jour les propriété, et une classe commande qui se charge du choix du moteur. Par exemple. Le "tas de classes" par contre est nécessaire dans tous les cas. Il permet d'ajouter facilement des fonctionnalités.

Ceci dit, le but était effectivement simplement d'implémenter avec un exemple plus poussé, le design pattern interprète.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 00:32
Leider...

faudrait vraiment que :
tu uploades ton 3 eme tuto :) il m'interesse vraiment :)
tu en rediges un sur ta facon de programmer en php (ou ce que tu consideres comme ideal), pourquoi ? parce-que t'es etonant a toujours mettre une ligne vide dans tes commentaires, et 4 lignes au lieu d'une seule :) au passage, sous doxygen :
/**
* chose
*/
est equivalent a :
//! chose

en plus, tu ne documentes que tes classes, sans mettre de @brief, bref, je ne comprends pas du tout ta facon de commenter...

throw new languageException(__CLASS__.'::'.__FUNCTION__.'() : invalid distance '.$mParam);
tu surcharges ton code alors que la pile d'appels te donne deja cette info...

ton tas de classe aurait ete utile si il avait respecte la syntaxe exacte des path svg... la, c'est comme tu l'as dit, interessant, mais pas utile, c'est juste un cas concret d'un design... domage, t'aurais pu faire d'une pierre deux coup...
cf : http://www.w3.org/TR/SVG/paths.html
le travail d'un path est a peu pres identique a ceux de tes commandes, sauf qu'eux font du vectoriel...
j'imagine bien un truc genre :

un tas de classe de gestion xml <- svgChild <- path

interface CommandeImage
CommandeImage <- path
CommandeImage <- malalam's_Class

interface ImageHandler
ImageHandler <- Gd
ImageHandler <- ImageMagick

avec la malalam's_Class qui aurait ete linkable vers un ImageHandler
Rejoignez-nous