exportation de donnée en Php objet et MVC

Eléphanteau du PHP | 12 Messages

09 janv. 2013, 09:42

Bonjour à tous !
J'ai suivi énormément de tutoriel sur l'exportation de données dans un fichier .csv , cependant mon projet étant en architecture MVC (vu en cour) je suis complètement perdu !
Actuellement mon application est constitué d'une liste déroulante dans laquelle on trouve les différentes actions. Lorsqu'une action est sélectionnée, elle s’exécute sur la même page (Ajax).
Par exemple dans la liste déroulante il y une action "visualiser aliment", je la sélectionne, la liste de mes aliments s'affiche donc. Je voudrais alors extraire ces données dans un fichier csv.

Code du modele
    public function retourneAliment(){
        $maConnexion = new ConnexionBD();
 
        $select = $maConnexion->getConnexion()->query("SELECT * FROM Aliment");
 
        //mode de récupération par défaut
        $select->setFetchMode(PDO::FETCH_OBJ);
        $i=0;
        //traite les résultats en boucle
        $enregistrement = $select->fetch();
 
        $tabElem = NULL;
        while( $enregistrement )
        { 
            $tabElem[$i]["numAliment"] = $enregistrement->numAliment;
            $tabElem[$i]["descFr"] = $enregistrement->nomFrAliment;
            $tabElem[$i]["descAn"] = $enregistrement->nomAnAliment ;
            $enregistrement = $select->fetch();
            $i++;
        }
 
        if ($tabElem == NULL){
            throw new ModeleExceptions (0);
        }
        else{     
            return $tabElem;
        }
 
 
  }
Code de la vue
    public function afficheLesAliments ($tabAliments){
        $this->getDebutPage("Affichage des aliments");
 
        $nb = count ($tabAliments);
 
        for($i=0;$i<$nb;$i++ ){
            echo($tabAliments[$i]["numAliment"]." ". $tabAliments[$i]["descFr"]."<BR/>");
        }
        $this->getRetourAccueil();
        $this->getFinPage();
    }
Code du controleur
       case "visualiserAliments" :
                try {
                    //on va chercher les infos dans le modèle
                    $result = $this->modele->retourneAliment();
                    //on les affiche à la vue
                    $this->vue->afficheLesAliments($result);
                }
                catch(ModeleExceptions $ex){
                    $this->vue->afficheException($ex->getMessageErreur());
                }
                break;
merci d'avance pour votre précieuse aide.

ViPHP
xTG
ViPHP | 7331 Messages

09 janv. 2013, 10:03

Tu peux regarder du côté de fputcsv pour faire ce que tu veux.
Et vu que tu as l'air perdu je te donne une autre directive : c'est dans le contrôleur qu'il faut utiliser ce code. ;)

Eléphanteau du PHP | 12 Messages

10 janv. 2013, 10:02

Merci pour cette réponse, je regarde ça tout de suit !

Eléphanteau du PHP | 12 Messages

10 janv. 2013, 11:25

Pour l'instant voici mon code:

Code : Tout sélectionner

case "visualiserAliments" : try { //on va chercher les infos dans le modèle $result = $this->modele->retourneAliment(); //on les affiche à la vue $this->vue->afficheLesAliments($result); $fp = fopen('test.csv', 'w'); foreach ($result as $fields) { fputcsv($fp, $fields); } fclose($fp); }
Dans la variable $result je stocke le résultat de la requête sql ( en l'occurence ici ma liste d'aliments)
Dans la variable $fp j'utilise la méthode fopen, qui prend en paramètre le nom du fichier et le "mode" (written)
Je boucle sur $result pour écrire chaque ligne dans le fichier, puis je ferme le fichier.

Je ne suis pas certain d'être sur la bonne voie, d'autant plus que rien ne se passe à l'exécution. J'ai également du mal a voir où le fichier va être stocké.

Eléphanteau du PHP | 12 Messages

10 janv. 2013, 11:39

J'ai résolut mon problème ! Merci beaucoup pour ton aide.
J'ai juste une dernière question: est-il possible de rajouter les noms de colonnes dans le fichier csv ?

Code : Tout sélectionner

case "visualiserAliments" : try { //on va chercher les infos dans le modèle $result = $this->modele->retourneAliment(); //on les affiche à la vue $this->vue->afficheLesAliments($result); $fp = fopen('C:\\Users\\*******\\Desktop\\test.csv', 'w'); foreach ($result as $fields) { fputcsv($fp, $fields); } // fclose($fp); }

ViPHP
xTG
ViPHP | 7331 Messages

10 janv. 2013, 12:09

Tu fais un premier fputcsv avec un array rempli des noms de tes colonnes. ;)

Eléphanteau du PHP | 12 Messages

10 janv. 2013, 12:40

Le nouveau fputcsv me met le nom des colonnes dans une même cellule

Code : Tout sélectionner

case "visualiserAliments" : try { //on va chercher les infos dans le modèle $result = $this->modele->retourneAliment(); //on les affiche à la vue $this->vue->afficheLesAliments($result); //nom des colonnes $col= array('numéro','nom'); $fp = fopen('C:\\Users\\stagiaireinfo\\Desktop\\test.csv', 'w'); fputcsv($fp, $col); foreach ($result as $fields) { fputcsv($fp, $fields); } fclose($fp); }
d'ailleurs, j'ai le même souci avec les aliments, le numéro et le nom sont pas séparés.
les champs sont concaténé les uns à la suite des autres séparés par une virgule.
ex: 1000,Pastis,Anis spirit

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 janv. 2013, 13:37

salut,


pour constater la chose, il faudrait un exemple du tableau de base et ensuite le ce qui est généré.

Pour info, on utilise plus facilement le point virgule en délimiteur CSV (simplement parce que moins courant dans la ponctuation histoire d'éviter les soucis ensuite :lol: ).

Dans la même idée, comment est ce que tu "ouvre" le fichier généré ?, avec excel ( par exemple) il faut lui spécifier la chose pour éviter les soucis.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

10 janv. 2013, 14:28

Base de données
Image

Affichage sur ma page :
Image

Excel:
Image

En effet j'ai cru comprendre que l'on utilise le point virgule pour délimiter, mais comment je peux le rajouté dans ma variable $result?
Peut-être dans mon modèle

Code : Tout sélectionner

public function retourneAliment(){ $maConnexion = new ConnexionBD(); $select = $maConnexion->getConnexion()->query("SELECT * FROM Aliment"); //mode de récupération par défaut $select->setFetchMode(PDO::FETCH_OBJ); $i=0; //traite les résultats en boucle $enregistrement = $select->fetch(); $tabElem = NULL; while( $enregistrement ) { $tabElem[$i]["numAliment"] = $enregistrement->numAliment; $tabElem[$i]["descFr"] = $enregistrement->nomFrAliment; $tabElem[$i]["descAn"] = $enregistrement->nomAnAliment ; $enregistrement = $select->fetch(); $i++; } if ($tabElem == NULL){ throw new ModeleExceptions (0); } else{ return $tabElem; } }
Mais dans ce cas là, le point virgule sera également "envoyé" à la vue.

ViPHP
xTG
ViPHP | 7331 Messages

10 janv. 2013, 14:36

int fputcsv ( resource $handle , array $fields [, string $delimiter = ',' [, string $enclosure = '"' ]] )
Sinon ton fichier est correct, c'est juste Excel qui n'a pas reconnu la virgule comme délimiteur.
Il devrait te le formatter sans que tu ais besoin de lui dire si tu utilises le point virgule.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 janv. 2013, 15:38

int fputcsv ( resource $handle , array $fields [, string $delimiter = ',' [, string $enclosure = '"' ]] )
t'es trop sympa ;)
Il en faut peu pour être heureux ......

ViPHP
xTG
ViPHP | 7331 Messages

10 janv. 2013, 16:35

int fputcsv ( resource $handle , array $fields [, string $delimiter = ',' [, string $enclosure = '"' ]] )
t'es trop sympa ;)
Je sais mais j'ai jamai pu me résoudre à sortir un simple RTFM. :(

Eléphanteau du PHP | 12 Messages

10 janv. 2013, 16:53

J'ai bien rajouté la variable $delimiter en paramètre des fputcsv mais cela aucun effet !
effectivement, j'aurai du me référer à la doc

ViPHP
xTG
ViPHP | 7331 Messages

10 janv. 2013, 19:04

Comment l'as-tu rajoutée ? Car moi cela fonctionne à merveille. :)

Eléphanteau du PHP | 12 Messages

11 janv. 2013, 09:20

Comme ceci: fputcsv($fp, $fields, $delimiter=',')