formulaire avec prise de donnée dans BDD
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
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...
Rajoute un "disabled" à la première valeur
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
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.
ah ben oui c'est vrai que ça peut en être une
merci beaucoup
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();*/
}
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.
c'est exactement ca , merci beaucoup
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
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.
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
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;
ça marche pas
je vois bien l'idée mais je n'arrive pas à l'appliquer même avec ton aide ....
<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);
}
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
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
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
Bonjour,
Quel est le code pour l'enregistrement dans l'autre table ? Comment est défini le champ id ?
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.