Laravel 4

formulaire avec prise de donnée dans BDD

Avatar de MaximeGosset
MaximeGosset

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

Posté il y a 6 ans
Avatar de bestmomo
bestmomo

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...

Posté il y a 6 ans
Avatar de caouecs
caouecs

Rajoute un "disabled" à la première valeur

Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

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

Posté il y a 6 ans
Avatar de leir
leir

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.

Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

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

Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

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();*/
		 } 
Posté il y a 6 ans
Avatar de leir
leir

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.

Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

c'est exactement ca , merci beaucoup

Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

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

Posté il y a 6 ans
Avatar de bestmomo
bestmomo

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.

Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

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

Posté il y a 6 ans
Avatar de papajoker
papajoker

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;

Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

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

Posté il y a 6 ans
Avatar de papajoker
papajoker
<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);
    }            
Posté il y a 6 ans
Avatar de MaximeGosset
MaximeGosset

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

Posté il y a 6 ans
Avatar de papajoker
papajoker

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 :)

Posté il y a 6 ans
Avatar de H_M
H_M

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,

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

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

Posté il y a 1 an
Avatar de bestmomo
bestmomo

Bonjour,

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

Posté il y a 1 an
Avatar de H_M
H_M

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

Posté il y a 1 an

Vous ne pouvez pas répondre à ce sujet.