Bonjour,

je suis actuellement en stage dans une agence, et il m'a été demandé de reprendre un site afin d'y faire quelques modifications. Notamment sur un formulaire de saisie d'annonces, le client aimerait ne pas avoir à saisir la marque du bateau mais pouvoir la choisir à partir d'un menu déroulant.

Je possède le fichier csv contenant toutes les marques mais je ne n'arrive pas à l'insérer dans le code.

dans le formulaire il y avait:

$formInfoAnnonce->addElement(new Element\Textbox("Modèle du bateau :", "modele", array("required" => 1)));

que j'ai remplacé par:

$marques = array("marque 1", "marque 2", "marque 3");
$formInfoAnnonce->addElement(new Element\Select("Select:", "test", $marques));

cela affiche bien mes 3 marques "test" mais ce n'est pas la solution j'aimerais que cela m'affiche la liste compléte contenue dans un fichier csv.

j'arrive à afficher dans une page test ce fameux fichier par le biais de ce code.

//fichier csv
$ligne = 1; // compteur de ligne
$fic = fopen("marques.csv", "a+");
while($marques=fgetcsv($fic,1024,';'))
{
$champs = count($marques);//nombre de champ dans la ligne en question
$ligne ++;
//affichage de chaque champ de la ligne en question
for($i=0; $i<$champs; $i ++)
{
echo $marques$i] . "<br />";
}
}

Voila je bloque, car je suis débutant en php, et un site fait avec un framework et un peu hors de ma porté. Mais j'aimerais quand même comprendre afin de progresser.

Merci pour votre aide.

8 réponses


nebjix
Réponse acceptée

Salut,

Que te retourne exactement ton code ?
Peut-tu donner un bout ou la structure du CSV ?
Quel framework est utilisé ?

Code testé chez moi (1h30 de mise au point ;) ):

<?php
if ($handle = fopen("marques.csv", "a+")) {
    // avec un fichier CSV tel que
    /*
        marque1;
        marque2;
        marque3;
        ...
    */
    $marques = array();
    while ($data = fgetcsv($handle, 0, ';')) {
        $champs = count($data);

        for($i = 0; $i < $champs; $i++) {
            if (isset($data$i]) && $data$i] != "") {
                $marques] = $data$i];
            }
        }
    }
    fclose($handle);
    print_r($marques); // doit retourner "Array ( [0] => marque1 [1] => marque2 [2] => marque3 ... ) "
}
$formInfoAnnonce->addElement(new Element\Select("Select:", "test", $marques));
?>

Mais comme le dit @mzkd, "il serait judicieux de transférer le contenu de ton fichier CSV dans la base de données"

nebjix

nebjix
Réponse acceptée

Parce-que le Japon, ou parce-que 42 ?
Essaie de mettre des "point test" un peut partout,
comme des echo "test1"; ou des die(); (ou meme les 2 :D )
dans le while, le for, le if dans le for, ou dans un else après le if

Edit (25/06 15h30)
essaye avec cette ligne à la place de la première

if ($handle = fopen(dirname( __FILE__ ).DIRECTORY_SEPARATOR.'marques.csv', 'r')) {

Salut,

Sans trop savoir quels sont ces objets aux quels tu te réfères (la classe Element), je pense qu'il serait judicieux de transférer le contenu de ton fichier CSV dans la base de données du site, dans une table bien disctincte.
Suivant les possibilités offertes par le framework, soit tu lies directement les id de la marque de bateau directement dans la base ou dynamiquement via PHP. Je pense que si tu as cette possibilité, ça permettra ensuite d'ajouter, corriger ou effacer une marque, plutôt que de ré-écrire ton tableau en CSV chaque fois...
Qu'en penses-tu ?
Je sais : c'est pas du code tout prêt, fournis clé en main, mais là, je vois pas trop le framework utilisé...
Bon courage pour le stage.

Noblus
Auteur

Petit up fil rouge:
j'ai intégré le code de nebjix dans une page test depuis mon csv et cela fonctionne:

voici maintenant la page complète du code comme vous le voyez il s'agit d'un formulaire avec différentes étapes. J'essaye de décortiquer le code avec des commentaires, il est possible que certains ne soient pas bons...:

<?php
use \PFBC\Form;
use \PFBC\Element;
if(isConnected()){
    include(CHEMIN_LIB."PFBC/Form.php");
    spl_autoload_register(function($classe) {
        include CHEMIN_MODELE.$classe.".php";
    });
    //On teste si dans l'url, il y à bien step et que dataform existe
    if(isset($_GET'step']) && isset($_SESSION'datasForm'])) {
        $etapeCourante = $_GET'step'];
        //Appel du manager pour les libelles :
        $manager = new XmlManager(CHEMIN_XML);
        //On regarde l'etape :
        switch($etapeCourante){
            //Si l'etape est la première, on redirige vers index.php?ajoutBateau
            case 1: header("Location: index.php?action=ajoutBateau");
                break;
            case 2:
                //On teste si l'etape une est faite, sinon on redirige vers la première etape :
                if(!isset($_SESSION'datasForm']"info_annonce"])) {
                    header("location: index.php?action=ajoutBateau");
                }else {
                    //Validation de la deuxième étape (dimensions) :
                    if(isset($_POST"dimensions"])){
                        if(FORM::isValid("dimensions")){
                            $_SESSION"datasForm"]"dimensions"] = $_POST;
                            header("location: index.php?action=ajoutBateau&step=3");
                        }else {
                            header("location: index.php?action=ajoutBateau&step=2");
                        }
                    }else {
                        //Formulaire pour les dimensions :----------------------------------------------------------------------------------
                        $formDimensions = new Form("dimensions");
                        $formDimensions->configure(array("prevent" => array("bootstrap", "jQuery"), "action" =>"index.php?action=ajoutBateau&step=2"));
                        $formDimensions->addElement(new Element\HTML("<legend>Etape 2 -Dimensions du bateau :</legend>"));
                        $formDimensions->addElement(new Element\Number("Largeur :", "largeur", array("min" => "0",
                            "step" => "any",
                            "placeholder" => "En mètres",
                            "required" => 1)));
                        $formDimensions->addElement(new Element\Number("Longueur :", "longueur", array("min" => "0",
                            "step" => "any",
                            "placeholder" => "En mètres",
                            "required" => 1)));
                        $formDimensions->addElement(new Element\Button('Valider et passer a la prochaine etape',"", array("class" => "btn-success btn-block",
                            "name" => "dimensions")));
                        $formDimensions->render();
                    }
                }
                break;
            case 3:
                //On teste si l'etape deux à bien été faite, sinon on redirige :
                if(!isset($_SESSION'datasForm']"dimensions"])) {
                    header("location: index.php?action=ajoutBateau&step=2");
                }else{
                    if(isset($_POST"construction"])){
                        if(FORM::isValid("construction")){
                            $_SESSION"datasForm"]"construction"] = $_POST;
                            header("location: index.php?action=ajoutBateau&step=4");
                        }else {
                            header("location: index.php?action=ajoutBateau&step=3");
                        }
                    }else {
                        //Formulaire pour les infos constructions :-------------------------------------------------------------------------
                        $formConstruction = new Form("construction");
                        $formConstruction->configure(array("prevent" => array("bootstrap", "jQuery"), "action" =>"index.php?action=ajoutBateau&step=3"));
                        $formConstruction->addElement(new Element\HTML("<legend>Etape 3 - Informations construction du bateau :</legend>"));
                        $formConstruction->addElement(new Element\Number("Année de fabrication :", "annee", array("min" => "1900")));
                        $formConstruction->addElement(new Element\Textbox("Catégorie :", "categorie", array("required" => 1)));
                        $formConstruction->addElement(new Element\Textbox("Sous catégorie :", "sous_categorie"));
                        $formConstruction->addElement(new Element\Button('Valider et passer a la prochaine etape',"", array("class" => "btn-success btn-block",
                            "name" => "construction")));
                        $formConstruction->render();
                    }
                    break;
                }
            case 4:
                //On verifie que l'etape 3 à été faite et que l'on a bien coché "le bateau a un moteur"
                if(!isset($_SESSION'datasForm']"construction"])) {
                    header("location: index.php?action=ajoutBateau&step=3");
                }else{
                    if(isset($_POST"moteur"])){
                        if(FORM::isValid("moteur")){
                            $_SESSION"datasForm"]"moteur"] = $_POST;
                            header("location: index.php?action=ajoutBateau&step=5");
                        }else {
                            header("location: index.php?action=ajoutBateau&step=4");
                        }
                    }else {
                        //Formulaire pour le moteur :---------------------------------------------------------------------------------------
                        $formMoteur = new Form("moteur");
                        $formMoteur->configure(array("prevent" => array("bootstrap", "jQuery"), "action" =>"index.php?action=ajoutBateau&step=4"));
                        $formMoteur->addElement(new Element\HTML("<legend>Etape 4 - Moteur :</legend>"));
                        $formMoteur->addElement(new Element\Number("Nombre :", "nombre", array("min" => "0", "required" => 1)));
                        $formMoteur->addElement(new Element\Textbox("Essence :", "fuel", array("required" => 1)));
                        $formMoteur->addElement(new Element\Number("Nombre d'heures :", "heures", array("min" => "0")));
                        $formMoteur->addElement(new Element\Number("Puissance :", "puissance", array("min" => "0", "placeholder" => "En Chevaux", "required" => 1)));
                        $formMoteur->addElement(new Element\Textbox("Marque :", "marque_moteur", array("required" => 1)));
                        $formMoteur->addElement(new Element\Textbox("Propulsion :", "propulsion"));
                        $formMoteur->addElement(new Element\Textarea("Infos :", "info"));
                        $formMoteur->addElement(new Element\Button('Valider et passer a la prochaine etape',"", array("class" => "btn-success btn-block",
                            "name" => "moteur")));
                        $formMoteur->render();
                    }
                }
                break;
            case 5:
                if(!isset($_SESSION'datasForm']"moteur"])) {
                    header("location: index.php?action=ajoutBateau&step=3");
                }else{
                    //Validation de la cinquième étape (accomodations) :
                    if(isset($_POST"accomodations"])){
                        if(FORM::isValid("accomodations")){
                            $_SESSION"datasForm"]"accomodations"] = $_POST;
                            header("location: index.php?action=ajoutBateau&step=6");
                        }else {
                            header("location: index.php?action=ajoutBateau&step=5");
                        }
                    }else {
                        //Formulaire pour les accomodations :-------------------------------------------------------------------------------
                        $formAccomodations = new Form("accomodations");
                        $formAccomodations->configure(array("prevent" => array("bootstrap", "jQuery"), "action" =>"index.php?action=ajoutBateau&step=5"));
                        $formAccomodations->addElement(new Element\HTML("<legend>Etape 5 - Accomodations du bateau :</legend>"));
                        $formAccomodations->addElement(new Element\Number("Nombre de cabines :", "nombre_cabine", array("min" => "0")));
                        $formAccomodations->addElement(new Element\Number("Nombre de couchette :", "nombre_couchette", array("min" => "0")));
                        $formAccomodations->addElement(new Element\Number("Nombre de salle de bain :", "nombre_sdb", array("min" => "0")));
                        $formAccomodations->addElement(new Element\Button('Valider et passer a la prochaine etape',"", array("class" => "btn-success btn-block",
                            "name" => "accomodations")));
                        $formAccomodations->render();
                    }
                }
                break;
            case 6:
                if(!isset($_SESSION'datasForm']"accomodations"])){
                    header("location: index.php?action=ajoutBateau&step=5");
                }else {
                    //Validation de la sixième étape (equipement Electroniques) :
                    if(isset($_POST"electronique"])){
                        if(FORM::isValid("electronique")){
                            if(isset($_POST"electroniques"])) {
                                $_SESSION"datasForm"]"electronique"] = $_POST;
                            }else {
                                $_SESSION"datasForm"]"electronique"] = "";
                            }
                            header("location: index.php?action=ajoutBateau&step=7");
                        }else {
                            header("location: index.php?action=ajoutBateau&step=6");
                        }
                    }else {
                        //Formulaire pour les equipements electroniques :-------------------------------------------------------------------
                        $formEquipElec = new Form("electronique");
                        $formEquipElec->configure(array("prevent" => array("bootstrap", "jQuery"), "action" =>"index.php?action=ajoutBateau&step=6"));
                        $formEquipElec->addElement(new Element\HTML("<legend>Etape 6 - Equipement electronique du bateau :</legend>"));
                        $formEquipElec->addElement(new Element\Checkbox("Equipements electroniques :", "electroniques", $manager->getLibelle("electronique")));
                        $formEquipElec->addElement(new Element\Button('Valider et passer a la prochaine etape',"", array("class" => "btn-success btn-block",
                            "name" => "electronique")));
                        $formEquipElec->render();
                    }
                }
                break;
            case 7:
                if(!isset($_SESSION'datasForm']"electronique"])){
                    header("location: index.php?action=ajoutBateau&step=6");
                }else {
                    //Validation de la sixième étape (equipement Electroniques) :
                    if(isset($_POST"equipement"])){
                        if(FORM::isValid("equipement")){
                            if(isset($_POST"equipements"])) {
                                $_SESSION"datasForm"]"equipement"] = $_POST;
                            }else {
                                $_SESSION"datasForm"]"equipement"] = "";
                            }
                            header("location: index.php?action=ajoutBateau&step=8");
                        }else {
                            header("location: index.php?action=ajoutBateau&step=7");
                        }
                    }else {
                        //Formulaire pour les equipements :---------------------------------------------------------------------------------
                        $formEquipements = new Form("equipement");
                        $formEquipements->configure(array("prevent" => array("bootstrap", "jQuery"), "action" =>"index.php?action=ajoutBateau&step=7"));
                        $formEquipements->addElement(new Element\HTML("<legend>Etape 7 - Equipement du bateau </legend>"));
                        $formEquipements->addElement(new Element\Checkbox("Equipements :", "equipements", $manager->getLibelle("equipement")));
                        $formEquipements->addElement(new Element\Button('Valider et passer a la prochaine etape',"", array("class" => "btn-success btn-block",
                            "name" => "equipement")));
                        $formEquipements->render();
                    }
                }
                break;
            case 8:
                if(!isset($_SESSION'datasForm']"equipement"])){
                    header("location: index.php?action=ajoutBateau&step=7");
                }else {
                    var_dump(isset($_FILES"images"]));
                    if(isset($_FILES"images"])){
                        foreach($_FILES"images"]"error"] as $erreure){
                            if($erreure == 0){
                                $noError = true;
                            }else {
                                $noError = false;
                                $error = $erreure;
                                break;
                            }
                        }
                        if($noError){
                            $ref = $manager->getLastRef() + 1;
                            //On créé le dossier de ref $ref :
                            mkdir(CHEMIN_UPLOADED_IMAGES.$ref);
                            $iNames = 0;
                            foreach($_FILES"images"]"name"] as $uneImage){
                                $tmpName = $_FILES"images"]"tmp_name"]$iNames];
                                $name = preg_replace("# #", "-", strtolower($_SESSION'datasForm']"info_annonce"]"marque"])).preg_replace("# #", "-", strtolower($_SESSION'datasForm']"info_annonce"]"modele"])).$iNames.'.jpg';
                                move_uploaded_file($tmpName, CHEMIN_UPLOADED_IMAGES.$ref."/".$name);
                                $_SESSION"datasForm"]"images"]$iNames] = CHEMIN_UPLOADED_IMAGES.$ref."/".$name;
                                $iNames++;
                            }
                            header("location: index.php?action=ajoutBateau&step=9");
                        }else {
                            if($erreure != 4){
                                include(CHEMIN_VUE."errors/files_error.php");
                                include(CHEMIN_VUE."forms/formulaire_images.php");
                            }else {
                                header("location: index.php?action=ajoutBateau&step=9");
                            }
                        }
                    }else {
                        include(CHEMIN_VUE."forms/formulaire_images.php");
                    }
                }
                break;
            case "9" :
                    if(!isset($_POST"validerAnnonce"])) {
                        $infoAnnonce = $_SESSION'datasForm']"info_annonce"];
                        $dimensions = $_SESSION'datasForm']"dimensions"];
                        $construction = $_SESSION'datasForm']"construction"];
                        $moteur = isset($_SESSION'datasForm']"moteur"]) ? $_SESSION'datasForm']"moteur"] : null;
                        $accomodations = $_SESSION'datasForm']"accomodations"];
                        $electronique = !empty($_SESSION'datasForm']"electronique"]"electroniques"]) ? $_SESSION'datasForm']"electronique"] : null ;
                        $equipement = !empty($_SESSION'datasForm']"equipement"]"equipements"]) ? $_SESSION'datasForm']"equipement"] : null ;
                        $images = isset($_SESSION'datasForm']"images"])? $_SESSION'datasForm']"images"] : null ;
                        include(CHEMIN_VUE.'previsualisation_bateau.php');
                    }else {
                        //On affiche la notif comme quoi l'annonce a bien été publiée
                        include(CHEMIN_VUE."notifs/bateau_created.html");
                        $manager->createAnnonce($_SESSION"datasForm"], $manager->getLastRef() + 1);
                        //On supprime la variable de session
                        unset($_SESSION'datasForm']);
                    }
                break;
            default:header("Location: index.php?action=ajoutBateau");
            break;
        }
    }
    //S'il n'y a pas le parametre step on affiche la première etape (Info sur l'annonce)
    else {
        //Si le formulaire à été posté :
        if(isset($_POST'info_annonce'])){
            if(FORM::isValid("info_annonce")) {
                $_SESSION"datasForm"]"info_annonce"] = $_POST;
                header("location: index.php?action=ajoutBateau&step=2");
            }else {
                header("location: index.php?action=ajoutBateau");
            }
        }else {
            //Formulaire d'info sur les annonces :------------------------------------------------------------------------------
            $formInfoAnnonce = new Form("info_annonce");
            $formInfoAnnonce->configure(array("prevent" => array("bootstrap", "jQuery"), "action" => "index.php?action=ajoutBateau"));
            $formInfoAnnonce->addElement(new Element\HTML("<legend>Etape 1 - Informations de l'annonce : </legend>"));
            $formInfoAnnonce->addElement(new Element\Textbox("Type de bateau :", "type", array("placeholder" => "Bateau moteur, voilier, pneumatique,...",
                "required" => 1)));
            $formInfoAnnonce->addElement(new Element\Number("Prix du bateau :", "prix_public", array("min" => "0",
                "placeholder" => "En euros",
                "required" => 1)));
            $opt = array("marque 1", "marque 2", "marque 3");
            //$opti = array( $marques );

            $formInfoAnnonce->addElement(new Element\Radio("Tva :", "tva", array("ht" => "Hors Taxes", "ttc" => "Toutes taxes comprises") , array("required" => 1)));
            //debut code CSV
            if ($handle = fopen("marques.csv", "a+")); {
             // avec un fichier CSV tel que
                         /*
                    marque1;
                    marque2;
                    marque3;
                    ...
                         */
                $marques = array();
                while ($data = fgetcsv($handle, 0, ';')) {
                    $champs = count($data);

                    for($i = 0; $i < $champs; $i++) {
                        if (isset($data$i]) && $data$i] != "") {
                            $marques] = $data$i];
                        }
                    }
                }
                fclose($handle);
                print_r($marques); // doit retourner "Array ( [0] => marque1 [1] => marque2 [2] => marque3 ... ) "
            }

            $formInfoAnnonce->addElement(new Element\Select("Marques CSV :", "test", $marques));
            // Fin code CSV
            $formInfoAnnonce->addElement(new Element\Textarea("Description du bateau :", "descriptifs"));
            $formInfoAnnonce->addElement(new Element\Textbox("Marque du bateau :", "marque", array("required" => 1)));
            $formInfoAnnonce->addElement(new Element\Textbox("Modèle du bateau :", "modele", array("required" => 1)));
            $formInfoAnnonce->addElement(new Element\Textbox("Lieu du bateau :", "visibilite"));
            // Test de l'ajout d'un élément SELECT
            $formInfoAnnonce->addElement(new Element\Select("Marque TEST :", "marque", array ("option 1","option 2","option 4","option 5","option 6","option 7","option 8","option 9"), array("class" => "btn-success btn-block",
                "name" => "info_annonce")));
            $formInfoAnnonce->addElement(new Element\YesNo("Vendu avec la place ?", "venduavecplaceport", array("required" => 1) ));
            $formInfoAnnonce->addElement(new Element\Button('Valider et passer a la prochaine etape',"", array("class" => "btn-success btn-block",
                "name" => "info_annonce")));
            $formInfoAnnonce->render();
        }
    }
}else {
    //Si non connecté, on affiche le formulaire de connexion :
    include CHEMIN_VUE."forms/formulaire_connexion.html";
}

Cependant je dois avoir mal fait quelque chose car ici ce même code ne trouve plus rien à afficher du fichier csv. cela donne en résultat:

Le code en question se trouve dans les lignes 300, je test un peu plus bas l'ajout d'un élément select en remplissant manuellement, les options cela donne.

Voila je vais essayer de nouveau de trouver le pourquoi du comment. Et par la même occasion essayer de voir si il n'y a pas un moyen de mettre en place des bases de données car j'ai plusieurs modifications de ce type à faire.

Noblus
Auteur

@ Mise à jour: toujours pas de solutions:

  • j'ai commencé la création d'une table mais il faut que je comprenne comment aller m'y connecter et comment récupérer les données afin de les mettre en objet dans ce fameux formulaire.

  • Ce que nebjix à fait fonctionne sur une page indépendante, mais pas ici. J'ai fais de nombreux test en déplaçant le code, et même sur d'autres pages et le résultat est toujours le même = vide.

j'ai fais un petit test pour voir si cette variable été vide ou inexistante:

$marques = array();
                while ($data = fgetcsv($handle, 0, ';')) {
                    $champs = count($data);

                    for($i = 0; $i < $champs; $i++) {
                        if (isset($data$i]) && $data$i] != "") {
                            $marques] = $data$i];
                        }
                    }
                }
                fclose($handle);
                print_r($marques); // doit retourner "Array ( [0] => marque1 [1] => marque2 [2] => marque3 ... ) "
                    //test de la variable $marques
                    if (empty($marques)) {
                    echo '$marques vaut soit 0, vide, ou pas définie du tout';
                    }
                // Evalué à vrai car $marque est définie
                    if (isset($marques)) {
                      echo '$marques est définie même si elle est vide';
                    }
            }

ce qui me renvoi :

Donc elle existe, mais elle est vide. La question du jour Pourquoi...?

Noblus
Auteur

Bonjour, et pardon d'avoir mis du temps à répondre, hier fu une journée de fou...
pour en revenir au sujet:
nebjix tu es au top, ta dernière ligne fonctionne parfaitement. Un grand merci à toi en tout cas, mais pourrais tu me dire ce qui change concrètement par rapport à la précédente, ou bien ce qui empêchait le csv d’être lu normalement?

Car je ne comprends pas trop cette instruction... et pourtant elle change tout.

if ($handle = fopen(dirname( __FILE__ ).DIRECTORY_SEPARATOR.'marques.csv', 'r')); {

Merci en tout cas je vais pouvoir avancer grâce à vous.

De rien, ça a été un plaisir, voici le tout expliqué ;) :

__FILE__ permet de récupérer Le chemin complet et le nom du fichier courant,
donc dirname(__FILE__) récupére juste le chemin sans le nom du fichier
(ex : sous windows avec wamp et un alias localhost/bureau ca retournerai C:\Users\username\Desktop)
(depuis PHP 5.3 __DIR__ a été ajouté et est pareille que dirname(__FILE__))

DIRECTORY_SEPARATOR est une constantes de PHP qui contien généralement '/' ou '\' (suivant le serveur)
donc tous ça va dire d'aller cherché le fichier 'marques.csv' dans le meme dossier que le script courant.

Et l'option 'r' Ouvre en lecture seule, et place le pointeur de fichier au début du fichier.
alors que 'a+' Ouvre en lecture et écriture ; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer.

Noblus
Auteur

Me voila de retour, Grâce à votre aide j'ai pu bien avancer :)
cependant j'ai un petit soucis (encore..)

dans le formulaire j'utilise donc l’élément Select permettant d'afficher ces fameuses liste csv. Cela marche très bien encore merci à nebjix :)

mais cela s'affiche de cette façon:

ce n'est pas aussi pratique, ni même la façon correcte dont devrait s'afficher ce style d’élément car dans la doc officielle cela indique cet affichage:

Aurez vous une idée d'où cela pourrait bien provenir ?

j'ai regardé les styles css: je n'ai rien trouvé
j'ai testé les autres style d’éléments genre Radio Buttons: / Checkboxes et cela s'affiche correctement.
Il n'y a vraiment que cet élément select qui fait des siennes.

merci