Modelisation d'une class avec les design pattern

devcphp12 Messages postés 11 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 29 octobre 2009 - 6 oct. 2009 à 14:19
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 21 oct. 2009 à 17:51
Bonjour à tous,

j'ai crée differents fonctions qui me premettent tout de manipuler des fichiers afin de les transformer en pdf , jpg , tiff.

Après beaucoup de relecture des tutoriels de malaam concernant les design pattern et malgrès que mon code soit dejà fonctionnel, je voulais essayer de m'en inspiré , histoire d'essayer d'evoluer et de progesser ( aille ca va etre dure !!).

Comment modelisé ce que je souhaite faire .
Mon code fonctionnel est le suivant :




function CreationCheminAbsoluPourDosEnregistrementImage($sChemin){
static $sIntermittent,$sCheminProtege;

$sIntermittent=str_replace('\\','""',$sChemin); #1
$sCheminProtege='"'.$sIntermittent.'"';
unset($sIntermittent);
return $sCheminProtege;
}

/** Pour transformer un fichier .doc en fichier . pdf **/
function CreationCheminAbsoluPourDos($sChemin){
static $sIntermittent,$sCheminProtege;

$sIntermittent=str_replace('\\','""',$sChemin);


$sCheminProtege='"'.$sIntermittent.'"';
unset($sIntermittent);
return $sCheminProtege;

function SaveAllDocToPdf ($sPathToStore){


static $aMyArray=array();


if (is_dir($sPathFinal)===TRUE) {
wb_message_box($window, $sPathFinal,"ceci est bien un dossier",WBC_INFO);
**/
if ($pDirectory = opendir($sPathToStore)) { // opendir nous renvoit un pointeur sur le dossier
// on initiliase

while (false !($sFile readdir($pDirectory))){

//je ne dois convertir que les fichiers .doc en .pdf car il se peut qu'il y ait des fichiers .pdf
//$sExtensionFile renvoit une chaine de carctere ie doc ou pdf ou jpg
$sExtensionFile=pathinfo($sFile,PATHINFO_EXTENSION);

if ($sFile != "." && $sFile != "..") {
if ($sExtensionFile =="doc"){

wb_set_text($iStatusBar,'Conversion de '.$sFile.' en pdf');
$aMyArray[]=$sFile;

}

}

}// fin du while
closedir($pDirectory);// je ferme le handle de manipulation du dossier qui contient les cartes ernt

}else{
wb_message_box($window,'Listage des fichiers impossible','Répertoire illisible',WBC_INFO);
}

foreach ($aMyArray as $sValeur){
SaveAsPdf ($sPathToStore.'\\'.$sValeur);
}
unset($aMyArray);


}else{
wb_message_box($window, $sPathFinal.'n\'est pas un dossier ','Dossier invalide',WBC_INFO);
}**/

}

function SaveAsPdf ($sFichierAsauver){

global $sCheminScriptVbConvertToPdf;
static $sFichier;

if(file_exists($sFichierAsauver)===FALSE){
wb_message_box($window,'Le fichier '.$sFichierAsauver.' à transformer en pdf n\'existe pas. ','Transformation en Pdf', WBC_INFO);
return FALSE;
}else{

$sFichier=CreationCheminAbsoluPourDos($sFichierAsauver);
// for debug wb_message_box($window,'Fichier apres conversion Dos '.$sFichier.' ','Transformation en Pdf', WBC_INFO);
exec($sCheminScriptVbConvertToPdf." ".$sFichier);
unset($sFichier);
return TRUE;
}

}

function SaveAsPng ($sFichierAsauver){

global $sCheminScriptVbConvertToPng;
static $sFichier;

$sFichier=CreationCheminAbsoluPourDosEnregistrementImage($sFichierAsauver);
exec($sCheminScriptVbConvertToPng." ".$sFichier);
unset($sFichier);
return TRUE;

}

function SaveAsTiff($sFichierAsauver){

global $sCheminScriptVbConvertToTiff;
static $sFichier;

$sFichier=CreationCheminAbsoluPourDosEnregistrementImage($sFichierAsauver);
exec($sCheminScriptVbConvertToTiff." ".$sFichier);
unset($sFichier);
return TRUE;

}
function SaveAsJpg($sFichierAsauver){

global $sCheminScriptVbConvertToJpg;
static $sFichier;

$sFichier=CreationCheminAbsoluPourDosEnregistrementImage($sFichierAsauver);
exec($sCheminScriptVbConvertToJpg." ".$sFichier);
unset($sFichier);
return TRUE;

}
function SaveAsBmp($sFichierAsauver){

global $sCheminScriptVbConvertToBmp;
static $sFichier;

$sFichier=CreationCheminAbsoluPourDosEnregistrementImage($sFichierAsauver);
exec($sCheminScriptVbConvertToBmp." ".$sFichier);
unset($sFichier);
return TRUE;

}

je pensais utilisé des
interface Sauvegarde{
public function Save($sFichierASauver)
}
class Sauve implements Sauvegarde{
public function Save($sFichierASauver)


}

mais comment definir mes autres fonctions ??

merci d'avance por vos propositions

4 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 oct. 2009 à 00:55
Salut,

J'espère que t'as compris les tutos de Malalam, parce que moi, j'ai pas compris ce que tu veux faire concrètement ;)
Du coup, je ne sais pas trop quoi te répondre à part ça, en espérant que tu pourras donner plus de précisions...

Désolé pour ce message qui ne répond pas au tien, mais tu attends déjà depuis 2 jours, tu risques d'attendre encore plus si personne ne comprend vraiment ce que tu veux faire exactement (parce que les tutos de Malalam sur les motifs de conceptions, ben... on peut en faire des choses avec !)

0
devcphp12 Messages postés 11 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 29 octobre 2009
19 oct. 2009 à 15:59
Alors voici ma classe reecrite completement en suivant pas mal de tuto de malalam :
<?php
/** future fichier de dll pour les operations avec pdf creator
@version 2.0.2: passage en modele objet
la methode CreationCheminAbsoluPourDos devient CreationCheminAbsoluPourDosEnregistrementImage
la methode CreationCheminAbsoluPourDos est maintenant reservé pour la preparation des noms de fichiers des documents word
@todo: mettre ne place un message d'avertissement avec la fonction exec de php
**/

global $sCheminScriptVbConvertToPdf,$sCheminScriptVbConvertToPng,$sCheminScriptVbConvertToTiff,$sCheminScriptVbConvertToJpg,$sCheminScriptVbConvertToBmp;

interface PreparationFichier {
public static function CreationCheminAbsolu ( MainPdfCreator $oMainPdfCreator );
}

if (TRUE === interface_exists('PreparationFichier')){

class CreationCheminAbsoluPourDosEnregistrementImage {
//expication: lorsque le chemin vers le fichier.doc contient des espaces, pdf creator ne trouve pas le chemin
//en effet, nous utilisons pdf creator en mode dos ou com, et dos n'accepte pas les espaces dans les chemins
// le chemin vers le fichier à sauvegarder doit arriver sous la forme D:\\Azura Cd Diagnostic\\Analysimmo\\2009\\aout\\VIGIGNE Dominique 93\\VIGIGNE Dominique 93 18.08.09 ERNT.doc
//on remplace alors les \ par "" voir #1
//solution il faut protéger les espaces tel que $s='"F:""Azura Cd Diagnostic""help.doc"';
public static function CreationCheminAbsolu( MainPdfCreator $oMainPdfCreator ){
static $sIntermittent,$sCheminProtege;

$sIntermittent=str_replace('\\','""',$oMainPdfCreator->sFichierASauver); #1 //permet d'écrire $s sous la forme F:""Azura Cd Diagnostic""help.doc
$sCheminProtege='"'.$sIntermittent.'"';
unset($sIntermittent);
return $sCheminProtege;
}
}

class CreationCheminAbsoluPourDos {
/** Pour transformer un fichier .doc en fichier . pdf avec pdfcreator en mode dos , celui doit etre passé à pdfcreator sous la forme
*
* or le logiciel nous le renvoit sous la forme D:\\Azura Cd Diagnostic\\Analysimmo/2009/aout/VIGIGNE Dominique 93/VIGIGNE Dominique 93 18.08.09 ERNT.doc
* d'ou #1 on transforme en "D:""Azura Cd Diagnostic""Analysimmo/2009/aout/VIGIGNE Dominique 93/VIGIGNE Dominique 93 18.08.09 ERNT.doc
* et en # 2 on transforme en "D:""Azura Cd Diagnostic""Analysimmo""2009""aout""VIGIGNE Dominique 93""VIGIGNE Dominique 93 18.08.09 ERNT.doc
**/
public static function CreationCheminAbsolu( MainPdfCreator $oMainPdfCreator ){
static $sIntermittent,$sCheminProtege;

$sIntermittent = str_replace('\\','""',$oMainPdfCreator->sFichierASauver); #1
//$sIntermittentFinal=str_replace('/','""',$sIntermittent); #2 inutile depuis que que la methode CreationCheminSauvegarde utilise les \\ ce qui permet de directement renvoyer sous D:\\Azura Cd Diagnostic\\Analysimmo\\2009\\aout\\VIGIGNE Dominique 93\\VIGIGNE Dominique 93 18.08.09 ERNT.doc
//$sCheminProtege='"'.$sIntermittentFinal.'"';
//unset($sIntermittent,$sIntermittentFinal);

$sCheminProtege='"'.$sIntermittent.'"';
unset($sIntermittent);
return $sCheminProtege;
}
}

}else{
wb_message_box($window,'L\'interface PreparationFichier n\'existe pas','Erreur Code',WBC_WARNING);
}





interface TransformationFichier {
public static function SaveAs(MainPdfCreator $oMainPdfCreator);
}
if (TRUE === interface_exists('TransformationFichier')){

class SaveAsPdf implements TransformationFichier {

public static function SaveAs(MainPdfCreator $oMainPdfCreator){

exec($sCheminScriptVbConvertToPdf." ".$oMainPdfCreator->sTempFichier);
return TRUE;


}
}

class SaveAsPng implements TransformationFichier {
public static function SaveAs ( MainPdfCreator $oMainPdfCreator ){

exec($sCheminScriptVbConvertToPng." ".$oMainPdfCreator->sTempFichier);
return TRUE;

}
}
class SaveAsTiff implements TransformationFichier{
public static function SaveAs( MainPdfCreator $oMainPdfCreator ){

exec($sCheminScriptVbConvertToTiff." ".$oMainPdfCreator->sTempFichier);
return TRUE;

}
}
class SaveAsJpg implements TransformationFichier {
public static function SaveAs( MainPdfCreator $oMainPdfCreator ){

exec($sCheminScriptVbConvertToJpg." ".$oMainPdfCreator->sTempFichier);
return TRUE;

}
}
class SaveAsBmp implements TransformationFichier {
public static function SaveAs( MainPdfCreator $oMainPdfCreator ){

exec($sCheminScriptVbConvertToBmp." ".$oMainPdfCreator->sTempFichier);
return TRUE;


}
}
}else{// fin de test de notre interface
wb_message_box($window,'L\'interface TransformationFichier n\'existe pas','Erreur de code',WBC_WARNING);
}




class PdfCreator {

/** hack PHP Notice: Undefined index: pFichierASauver
* on definit une valeur par default à $pFichierASauver bien qu'il sera accédé par l'utilisateur avec le biais de la mtehode magique __set
**/



private $aProprietes array ( 'pFichierAsauver'> array('NomVariable'=>'sFichierASauver','Type'=>'is_file','settable'=>TRUE) // file_exists est utilisé uniquement pour savoir si un fichier ou un dossier existe
);

private $aTypeEnregistrementPossible = array ( 'Pdf','Jpg','Tiff','Bmp','Png');
private $sTempFichier;

public function __construct(){
}

/**La méthode magique __set() permet de faire ce que l'on appelle de la surchage de propriétés d'une classe. En effet, lorsque l'on essaie de fixer la valeur d'une propriété inexistante de la classe, PHP appelle automatiquement cette méthode de manière implicite
* @param string $sProp Nom de la propriété
* @param mixed $mVal Valeur à affecter à la propriété
* @return void
*/
public function __set($sProp, $mVal) {
if(!array_key_exists($sProp, $this->aProprietes) || !isset($this->aProprietes[$sProp]['settable']) || false === $this->aProprietes[$sProp]['settable'] || !isset($this->aProprietes[$sProp]['Type'])) {
wb_message_box($window,'Propriétès non disponible à l\'accession','Erreur Code',WBC_WARNING);
}
$sFunc = $this->aProprietes[$sProp]['Type']; // $this->aCor$this->aProprietes[$sProp]['type'] nous renvoit la fonction is_int ou is_string
if(!$sFunc($mVal)) { // equivalent à is_file($mVal)
wb_message_box($window,'Le fichier à transformer n\'existe pas','Erreur Code',WBC_WARNING);
}
$sThisProp = $this->aProprietes[$sProp]['NomVariable'];
$this->$sThisProp $mVal; // equivaleent à $this->sFichierASauver $mVal ou mVal est un chemin vers le fichier à transformer
}


public function EffectueTransformation($sType){

if(!is_string($sType)){
wb_message_box($window,'Le format final souhaitée n\'a pas été défini','Erreur Code',WBC_WARNING);
}
if(!array_key_exists($sType,$this->aTypeEnregistrementPossible)){
wb_message_box($window,'Le format final souhaitée n\'existe pas','Erreur Code',WBC_WARNING);
}
switch($sType){
case 'Tiff':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsTiff::SaveAs($this)){
wb_message_box($window,'Sauvegarde de'.$this->sFichierASauver.' en Tiff','Opération Effectuée',WBC_WARNING);
}
break;
case 'Png':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsPng::SaveAs($this)){
wb_message_box($window,'Sauvegarde de'.$this->sFichierASauver.' en Png','Opération Effectuée',WBC_WARNING);
}
break;
case 'Pdf':
$this->sTempFichier = CreationCheminAbsoluPourDos::CreationCheminAbsolu($this);
if(TRUE === SaveAsPdf::SaveAs($this)){
wb_message_box($window,'Sauvegarde de'.$this->sFichierASauver.' en Pdf','Opération Effectuée',WBC_WARNING);
}
break;
case 'Bmp':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsBmp::SaveAs($this)){
wb_message_box($window,'Sauvegarde de'.$this->sFichierASauver.' en Bmp','Opération Effectuée',WBC_WARNING);
}
break;
case 'Jpg':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsJpg::SaveAs($this)){
wb_message_box($window,'Sauvegarde de'.$this->sFichierASauver.' en Jpg','Opération Effectuée',WBC_WARNING);
}
break;
default : //devrait etre court-circuité par le test du array key exists
wb_message_box($window,'Le format final souhaitée n\'existe pas','Erreur Code',WBC_WARNING);
break;
}// fin du switch
}

function __destruct(){
// on remet à zero le tableau
reset($this->aProprietes);

}
}
?>

pour l'utiliser je fais juste un
$oManipulateurFichier = new PdfCreator;
$oManipulateurFichier->pFichierASauver = (string) $sPdfToTransformImage;

ou $sPdfToTranformImage correspond à C:\Mes Images\ à un chemin vers le fichier à transformer

$oManipulateurFichier->EffectueTransformation('Jpg');

Mais voici les jolies messages que je recois :

PHP Notice: Undefined index: pFichierASauver in D:\Developpement\Winbinder\WinBinder\phpcode\Ernt\Data\Dll\PdfCreator.dll on line 138
[19-Oct-2009 15:44:35] PHP Fatal error: Function name must be a string in D:\Developpement\Winbinder\WinBinder\phpcode\Ernt\Data\Dll\PdfCreator.dll on line 139

1 : j'ai beau essayé de definir un tableau mais toujours undefined index.
La deuxieme je ne comprends pas car j'ai meme forçé avec string mais j'obtiens toujours ce message d'erreur.

Votre aide me serait precieuse .
D'avance merci
0
devcphp12 Messages postés 11 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 29 octobre 2009
21 oct. 2009 à 15:47
Pour terminer , voici ma classe finale qui marche :

class PdfCreator {

/** hack PHP Notice:
* on definit une valeur par default à $sFichierASauver bien qu'il sera accédé par l'utilisateur avec le biais de la mtehode magique __set
**/


public $sFichierASauver = ''; //si on ne definit pas cette variable on obtient l'erreur suivante proprietés non disponible à l'accession
//puis ceci PHP Notice: Undefined index: sFichierASauver in D:\Developpement\Winbinder\WinBinder\phpcode\Ernt\Data\Dll\PdfCreator.dll on line 144
//[20-Oct-2009 22:04:33] PHP Fatal error: Function name must be a string in D:\Developpement\Winbinder\WinBinder\phpcode\Ernt\Data\Dll\PdfCreator.dll on line 145

public $aProprietes array ( 'pFichierASauver'> array('NomVariable'=>'sFichierASauver','Type'=>'is_file','settable'=>TRUE) // file_exists est utilisé uniquement pour savoir si un fichier ou un dossier existe
);

private $aTypeEnregistrementPossible = array ('Pdf'=>'Fichier que l\'on souhaite transformer en pdf',
'Jpg'=>'Fichier que l\'on souhaite transformer en Jpg',
'Tiff'=>'Fichier que l\'on souhaite transformer en Tiff',
'Bmp'=>'Fichier que l\'on souhaite transformer en Bmp',
'Png'=>'Fichier que l\'on souhaite transformer en Png'
); // en effet la methode array_key_exists exige que pur chaque clef correpsonde une valeur
public $sTempFichier;

public function __construct(){
}

/**La méthode magique __set() permet de faire ce que l'on appelle de la surchage de propriétés d'une classe. En effet, lorsque l'on essaie de fixer la valeur d'une propriété inexistante de la classe, PHP appelle automatiquement cette méthode de manière implicite
* @param string $sProp Nom de la propriété
* @param mixed $mVal Valeur à affecter à la propriété
* @return void
*/
public function __set($sProp, $mVal) {
if(!array_key_exists($sProp, $this->aProprietes) || !isset($this->aProprietes[$sProp]['settable']) || false === $this->aProprietes[$sProp]['settable'] || !isset($this->aProprietes[$sProp]['Type'])) {
wb_message_box($window,'Propriétès non disponible à l\'accession','Erreur Code',WBC_WARNING);
}
$sFunc = $this->aProprietes[$sProp]['Type']; // $this->aCor$this->aProprietes[$sProp]['type'] nous renvoit la fonction is_int ou is_string
if(!$sFunc($mVal)) { // equivalent à is_file($mVal)
wb_message_box($window,'Le fichier à transformer n\'existe pas','Erreur Code',WBC_WARNING);
}
$sThisProp = $this->aProprietes[$sProp]['NomVariable'];
$this->$sThisProp $mVal; // equivaleent à $this->sFichierASauver $mVal ou mVal est un chemin vers le fichier à transformer
}


public function EffectueTransformation($sType){

if(!is_string($sType)){
wb_message_box($window,'Le format final souhaitée n\'a pas été défini','Erreur Code',WBC_WARNING);
}
elseif(!array_key_exists($sType,$this->aTypeEnregistrementPossible)){
wb_message_box($window,'Le format final souhaitée n\'existe pas','Erreur Code',WBC_WARNING);
}else{
switch($sType){
case 'Tiff':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsTiff::SaveAs($this)){
wb_message_box($window,'Sauvegarde de '.$this->sFichierASauver.' en Tiff','Opération Effectuée',WBC_WARNING);
}
break;
case 'Png':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsPng::SaveAs($this)){
wb_message_box($window,'Sauvegarde de '.$this->sFichierASauver.' en Png','Opération Effectuée',WBC_WARNING);
}
break;
case 'Pdf':
$this->sTempFichier = CreationCheminAbsoluPourDos::CreationCheminAbsolu($this);
if(TRUE === SaveAsPdf::SaveAs($this)){
wb_message_box($window,'Sauvegarde de '.$this->sFichierASauver.' en Pdf','Opération Effectuée',WBC_WARNING);
}
break;
case 'Bmp':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsBmp::SaveAs($this)){
wb_message_box($window,'Sauvegarde de '.$this->sFichierASauver.' en Bmp','Opération Effectuée',WBC_WARNING);
}
break;
case 'Jpg':
$this->sTempFichier = CreationCheminAbsoluPourDosEnregistrementImage::CreationCheminAbsolu($this);
if(TRUE === SaveAsJpg::SaveAs($this)){
wb_message_box($window,'Sauvegarde de '.$this->sFichierASauver.' en Jpg','Opération Effectuée',WBC_WARNING);
}
break;
default : //devrait etre court-circuité par le test du array key exists
wb_message_box($window,'Le format final souhaitée n\'existe pas','Erreur Code',WBC_WARNING);
break;
}// fin du switch
}//fin du else
}

function __destruct(){
// on remet à zero le tableau
reset($this->aProprietes);

}
}

par contre je suis tres decue de ce code.en effet, il est une replique de la classe PHPDRAW 2 de malalam à ceci pret que j'ai du redefinir mes proprietes en public alors que lui le fait en private.

D'autre part, a partir du moment ou ils sont en private, php genere des erreurs absurdes tel que :
PHP Fatal error: Cannot access private property PdfCreator::$sFichierASauver in D:\Developpement\Winbinder\WinBinder\phpcode\Ernt\Data\Dll\PdfCreator.dll on line 26

PHP Fatal error: Function name must be a string in D:\Developpement\Winbinder\WinBinder\phpcode\Ernt\Data\Dll\PdfCreator.dll on line 145

et des que je remets certaines variables en public plus aucun probleme § c'est vraiment à n'y rien comprendre.

Aidez moi à comprendre le raisonnement ?
Merci
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
21 oct. 2009 à 17:51
Salut,

C'est tout à fait normal : seules les propriétés publiques sont accessibles depuis l'extérieur de la classe.
Les propriétés "protected" sont accessibles depuis la classe et dans n'importe quelle classe qui hérite cette classe.
Quand aux propriétés "private", elles ne sont accessibles que dans la classe qui les définit.
Il n'y a rien à comprendre, à part ça : c'est fait comme ça, pour fonctionner comme ça, et c'est bien ce qui se passe avec ta classe.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
Rejoignez-nous