Laravel 4

formulaire avec prise de donnée dans BDD

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    bonjour à tous
    voilà , j'ai un petit problème que je n'arrive pas à résoudre
    pour mon projet , j'ai du créer un formulaire avec un type "Select" donc a choix multiples , et j'aimerais qu'il prenne en valeur les valeurs de la base de donnée , jusque là tout va bien
    sauf que j'aimerais qu'il me mette un vide en valeur par défaut et là ça bloque

    <pre class="prettyprint">foreach(Joueur::get() as $joueur)
            {
             $tableauSoc[$joueur->id] = $joueur->nom;
            }
             echo Form::select('nom',$tableauSoc);
       

    Avez vous une idée?
    merci

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2299

    Tu veux la zone vide au départ ? Tu peux prévoir dans ton tableau une première entrée avec un id quelconque et une valeur string vide mais tu as le risque que l'utilisateur choisisse cette entrée...

  • Avatar de caouecs
    Membre depuis :
    12/04/2013
    Messages :
    128

    Rajoute un "disabled" à la première valeur

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    ben en fait , je vais vous expliquer le principe
    c'est une page " feuille de match" qui permet d'enregistrer les statistiques des joueurs ayant joué le match , le tout en une page ( j'trouve ca plus pratique )

    donc on a un tableau avec 10 lignes sauf qu'elles ne seront pas toutes utilisées d'où mon pb , si par exemple vous avec joué avec 8 joueurs , vous remplissez les 8 premieres lignes et apres il en reste deux vides ( c'est ce que je voudrais) sauf que là , elles sont vides sauf pour le choix multiple qui lui a quand meme une valeur

    je sens que j'ai pas ete tres clair :s

  • Avatar de leir
    Membre depuis :
    19/05/2013
    Messages :
    41

    Quand tu génères ton tableau avec 10 lignes, tu peux mettre une checkbox au début des lignes que tu vas utiliser. Celles qui ne sont pas checkboxées ne seront pas prises en compte, du coup, la liste déroulante de la ligne en question non plus. C'est une solution, pas idéale, il en existe d'autres.

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    ah ben oui c'est vrai que ça peut en être une
    merci beaucoup

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    me voilà avec un tout autre probleme mais toujours sur la meme page
    je m'explique
    j'ai donc une page dans laquelle l'utilisateur peut enregistrer son equipe , donc j'ai crée un formulaire sous forme de tableau regroupant toute les données
    une colonne nom , prenom , date de naissance etc
    la génération du tableau se fait comme suit

    <pre class="prettyprint"><form  method="post" action="add-equipe">
    <table class="table table-hover">
    <thead >
     <th style="width: 40px;">rec</th>
     <th style="width: 40px;">nom</th>
     <th style="width: 40px;">prénom</th>
     <th style="width: 60px;">naissance</th>
     <th style="width: 60px;">adresse</th>
     <th style="width: 40px;">ville</th>
     <th style="width: 30px;">code postal</th>
     <th style="width: 40px;">tel</th>
     <th style="width: 40px;">portable</th>
     <th style="width: 50px;">pied</th>
     <th style="width: 50px;">poste</th>    
    </thead>

                             <?
    for ($i=0; $i <2  ; $i++) {
                          ?>
    <tr>
     <td> <input type="checkbox" name="use" id="use" /></td>
     <td> <input type="text" id="nom" name="nom"  style="width: 40px; height: 20px;"></td>
     <td> <input type="text" id="prenom" name="prenom"  style="width: 40px; height: 20px;"></td>
     <td> <input type="date" id="dob" name="dob" style="width: 60px; height: 20px;"></td>
     <td> <input type="text" id="adresse" name="adresse" style="width: 60px; height: 20px;"></td>
     <td> <input type="text" id="ville" name="ville" style="width: 40px; height: 20px;"></td>
     <td> <input type="text" id="cp" name="cp" style="width: 30px; height: 20px;"></td>
     <td> <input type="text" id="tel" name="tel" style="width: 40px; height: 20px;"></td>
     <td> <input type="text" id="port" name="port" style="width: 40px; height: 20px;"></td>
     <td> <select name="pied" id="pied" style="width: 50px; height: 20px;">
     <option value=" "> </option>
     <option value="droit">droit</option>
     <option value="gauche">gauche</option>
     </select></td>
     <td><select name="poste" id="poste" style="width: 50px; height: 20px;">
     <option value=" "> </option>
     <option value="gardien">gardien</option>
     <option value="defenseur">défenseur</option>
     <option value="milieu">milieux</option>
     <option value="attaquant">attaquant</option>
     </select></td>
    </tr>
    <?
         }
    ?>
    </table>
                       <button  type="submit" class="btn">enregistrer équipe</button>
                       </form>

    mais le probleme se passe dans le traitement de celui ci , j'ai voulu mettre une condition pour que des que la chekbox est cochée ,il faut enregistrer les données sauf qu'il ne le fait pas ou alors juste pour la premiere ligne

    <pre class="prettyprint">public function create()
    {

    $max=Input::get('use');
    if (!empty($max)) {
    echo " bien";
     

    /$joueur = new Joueur;
    $joueur->nom = Input::get('nom');
    $joueur->prenom = Input::get('prenom');
    $joueur->telephone = Input::get('tel');
    $joueur->portable = Input::get('port');
    $joueur->dob = Input::get('dob');
    $joueur->adresse = Input::get('adresse');
    $joueur->code_postal = Input::get('cp');
    $joueur->ville = Input::get('ville');
    $joueur->pied = Input::get('pied');
    $joueur->poste = Input::get('poste');
    $joueur->save();
    /
    }
  • Avatar de leir
    Membre depuis :
    19/05/2013
    Messages :
    41

    Concernant la checkbox  name="use", je mettrais  name="use[]", que ce soit un tableau. Ensuite tu parcours le tableau avec un foreach, et pour chaque checkbox cochée, ça te fait l'action demandée. Ou alors j'ai pas tout compris ce que tu voulais.

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    c'est exactement ca , merci beaucoup

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    la checkbox est ok , mais maintenant il ne veut rien savoir quant à l'enregistrement en base de donnée ...
    voilà à quoi ressemble le traitement :

    <pre class="prettyprint"> public function create()
    {

    if(isset($_POST['use'])){
      $max=$_POST['use'];

       foreach($max as $check){
     
           
    $joueur = new Joueur;
    $joueur->nom = Input::get('nom');
    $joueur->prenom = Input::get('prenom');
    $joueur->telephone = Input::get('tel');
    $joueur->portable = Input::get('port');
    $joueur->dob = Input::get('dob');
    $joueur->adresse = Input::get('adresse');
    $joueur->code_postal = Input::get('cp');
    $joueur->ville = Input::get('ville');
    $joueur->pied = Input::get('pied');
    $joueur->poste = Input::get('poste');
    $joueur->save();

    echo "joueur ajoute";
    ?></br><A HREF="index" TITLE="accueil"> revenir à la page d'accueil</A><?
    }
    }
    }

    le probleme ne viendrait il pas du formulaire ? pourtant je ne vois pas où je me suis trompé

    <pre class="prettyprint"><form  method="post" action="add-joueur">
    <table class="table table-hover">
    <thead >
     <th style="width: 40px;">rec</th>
     <th style="width: 40px;">nom</th>
     <th style="width: 40px;">prénom</th>
     <th style="width: 60px;">naissance</th>
     <th style="width: 60px;">adresse</th>
     <th style="width: 40px;">ville</th>
     <th style="width: 30px;">code postal</th>
     <th style="width: 40px;">tel</th>
     <th style="width: 40px;">portable</th>
     <th style="width: 50px;">pied</th>
     <th style="width: 50px;">poste</th>    
    </thead>

                             <?
    for ($i=0; $i <15  ; $i++) {
                          ?>
    <tr>
     <td> <input type="checkbox" name="use[]" id="use" /></td>
     <td> <input type="text" id="nom" name="nom"  style="width: 40px; height: 20px;"></td>
     <td> <input type="text" id="prenom" name="prenom"  style="width: 40px; height: 20px;"></td>
     <td> <input type="date" id="dob" name="dob" style="width: 60px; height: 20px;"></td>
     <td> <input type="text" id="adresse" name="adresse" style="width: 60px; height: 20px;"></td>
     <td> <input type="text" id="ville" name="ville" style="width: 40px; height: 20px;"></td>
     <td> <input type="text" id="cp" name="cp" style="width: 30px; height: 20px;"></td>
     <td> <input type="text" id="tel" name="tel" style="width: 40px; height: 20px;"></td>
     <td> <input type="text" id="port" name="port" style="width: 40px; height: 20px;"></td>
     <td> <select name="pied" id="pied" style="width: 50px; height: 20px;">
     <option value=" "> </option>
     <option value="droit">droit</option>
     <option value="gauche">gauche</option>
     </select></td>
     <td><select name="poste" id="poste" style="width: 50px; height: 20px;">
     <option value=" "> </option>
     <option value="gardien">gardien</option>
     <option value="defenseur">défenseur</option>
     <option value="milieu">milieux</option>
     <option value="attaquant">attaquant</option>
     </select></td>
    </tr>
    <?
         }
    ?>
    </table>
    <button  type="submit" class="btn">enregistrer équipe</button>
    </form>

    encore merci
    Max

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2299

    Dans ton formulaire tu te retrouves avec plusieurs input qui ont le même id et le même nom (15 fois :)) , donc tu peux pas traiter ça... Il faut que tu indexes les id et les noms pour les distinguer par exemple.

    D'autre part tu peux récupérer la valeur de "use" avec :

    <pre class="prettyprint">Input::get('use')

    Pas besoin de passer par $_POST.

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    ah oui effectivement , dis comme ça , ça semble tout de suite logique ...
    mais le problème c'est que je n'ai pas encore vu ça ... :s
    je vais m'y mettre des maintenant , si jamais vous avez du temps ou même juste une piste pour me montrer l’idée , je suis preneur ;)
    encore merci

  • Avatar de papajoker
    Membre depuis :
    31/05/2013
    Messages :
    278

    passe ton $i a chaque champ

    <pre class="prettyprint"><?
    for ($i=0; $i <15  ; $i++) {
                          ?>
    <tr>
     <td> <input type="checkbox" name="use[{{$i}}]" id="use" /></td>
     <td> <input type="text" id="nom" name="nom[{{$i}}]"  style="width: 40px; height: 20px;"></td>
     <td> <input type="text" id="prenom" name="prenom[{{$i}}]"  style="width: 40px; height: 20px;"></td>

    suis pas sur pour reception du post :

    <pre class="prettyprint">
    foreach(Input::get('use') as $key=>$value){
    //if ($value!=='on') continue;
    $joueur = new Joueur();
    $joueur->nom = Input::get('nom['.$key.']') ou ?? Input::get('nom')[$key];
    }

    use pas d'intéret , tu peux test  if trim(nom[$i]) =='' continue;

  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    ça marche pas :(
    je vois bien l'idée mais je n'arrive pas à l'appliquer même avec ton aide ....
    :(

  • Avatar de papajoker
    Membre depuis :
    31/05/2013
    Messages :
    278
    <pre class="prettyprint">
    $noms=Input::get('nom'); // array(0..14)
    foreach($noms as $key=>$nom){
           if (trim($nom)=='') continue; // saute si pas saisie du nom du joueur = meme chose que ton "use" avant
    $joueur = new Joueur();
           $joueur->nom = $nom;
    $joueur->prenom = array_get( Input::get('prenom'), $key );
           // ... $joueur->save();
    }

    il faut bien mettre name="nom[{{$i}}]" pour chaque zone saisie dans formulaire

    La suis sur a 200% de mon code, si erreur alors fait des print_r($joueur)... le probleme vient peut-etre du modele

    autre facon qui permet la validation:

    <pre class="prettyprint">
    $getInput= function ($key){
    $return=array();
    foreach(Input::all() as $name=>$value){
    //yield $name=> $value[$key]; si php5.5 utile les generateurs  byby $return
    $return[$name]=array_get($value, $key);
    }
    return $return;
    };

        $noms=Input::get('nom');
        foreach($noms as $key=>$nom){
    if ($nom=='') continue;

    $input=$getInput($key);
    print_r($input);
                    // if validate ($input)
                    $joueur = new Joueur($input);
       }            
  • Avatar de MaximeGosset
    Membre depuis :
    03/06/2013
    Messages :
    33

    pour le premier code , ca ne fonctionne pas et le print_r ne donne rien ...
    quand je met if (trim($nom)!=='') continue; il me transmet le tableau mais vide ( forcément )
    quant au deuxieme code , j'avoue ne pas trop le comprendre .... mais il ne donne rien non plus :s
    merci pour ton aide et ta patience
    Max

  • Avatar de papajoker
    Membre depuis :
    31/05/2013
    Messages :
    278

    MaximeGosset:pour le premier code , ca ne fonctionne pas et le print_r ne donne rien ...

    et bien dans ce cas tu remontes ton print_r($xxx) jusqu'a avoir des datas
    en tout debut
    un print_r(Input::get('nom')); doit donné : Array ( [0] => pierre [1] => paul  ... [14] => )

    et puis lorsque tu dis "ca ne fonctionne pas", la c'est tres tres dur de t'aider, + parlant de dire variables xxx est nulle, plantage a la ligne ... ;
    "print_r" donne rien ?? il est pas executé ou variable est nulle ?????

    MaximeGosset:quand je met if (trim($nom)!=='') continue; il me transmet le tableau mais vide ( forcément )

    moi je ne vois pas de tableau dans cette ligne, mais bon :)

  • Avatar de H_M
    Membre depuis :
    01/05/2018
    Messages :
    38

    Bonjour,

    J'ai aussi un formulaire sous forme de tableau, avec un input de type 'select' avec prise de données de la base de donnée, jusque là tout fonctionne,

    id]=$autocar->num; } echo Form::select('num',$tableau,['class'=>'form-control']); $tableau = array(); ?>

    Mais le problème c'est au niveau du controller où j'essaye de récupérer la sélection de l'utilisateur comme suit:
    $num = $request->input('num');
    $id_auto = $autocar->select('id')->where('num',$num)->value('id');
    Alors que quand j'essaye d'enregistrer l'id_auto qui correspond au numéro d'autocar que l'utilisateur a sélectionné dans une autre table , on me dit "Field 'id' doesn't have a default value".
    Merci de m'aider, ça fait un bon moment que je suis bloquée dessus et je dois trouvé la solution aujourd'hui avant de demain s'il vous plait

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2299

    Bonjour,

    Quel est le code pour l'enregistrement dans l'autre table ? Comment est défini le champ id ?

  • Avatar de H_M
    Membre depuis :
    01/05/2018
    Messages :
    38

    Bonjour,
    Dans la table autocar, le champ id est la clé primaire, et dans la table planification 'id_autocar' est une clé étrangère qui référence id dans la table autocar

Vous ne pouvez pas répondre à ce sujet.