Bonjour à tous,
Voilà je seche un peu et j'aimerais avoir votre avis sur sa :
J'ai un formulaire contenant des champs normaux. Et dans se formulaire j'aimerais faire l'ajout de 3 champs précis plusieurs fois.
(Précision sur Cakephp)
Schéma :
input - name
input - content
....
(bloc multiple)
input - ville
input - temps
input - notes
J'ai donc une première table pour le formulaire normal et une deuxième table contenant les infos du bloc multiple
id, post_id, ville, notes, temps etc...
Mes questions sont donc :
Existe t'il un nom pour se type de manip ?
Ajout de champs multiple dans un formulaire?
Comment ajouter le bloc multiple plusieurs fois dans le formulaire ?
Je pense en ajax avec un petit plus par exemple sous les 3 champs qui ajouter quand ses champs sont rempli
Comment et ou récupérer se bloc pour l'enregistrer en BDD ?
Dans la function de mon controller avant l'enregistrement de ma table non?
Dans mon model une function aftersave ?
Après pour les récupérer je parcours le tableau du bloc multiple ?
J'ai encore jamais u a faire a se cas de figure et je vois pas trop comment faire.
Je ne cherche pas à que vous me donniez la solution mais plutôt de m'aiguiller sur le chemin à suivre Merci.
J'espère être compris dans mon problème.
A+
Pour faire ce que tu souhaite, il faut que ton formulaire génère un tableau pour ta table associé à posts.
Pour le helper Form, ça passe par la convention de nommage des champs.
Du coup ton formulaire ressemblera à ça à peu prés
<?php echo $this->Form->create('Post', array(...)); ?>
<?php echo $this->Form->input('name', array(...)); ?>
<?php echo $this->Form->input('content', array(...)); ?>
<div id="block-0">
<?php echo $this->Form->input('Bloc.0.ville', array(...)); ?>
<?php echo $this->Form->input('Bloc.0.temps', array(...)); ?>
...
</div>
<div id="block-1">
<?php echo $this->Form->input('Bloc.1.ville', array(...)); ?>
<?php echo $this->Form->input('Bloc.1.temps', array(...)); ?>
...
</div>
etc...
Ensuite, dans ton controller Post, lorsque tu vas récupérer les données de ton formulaire, le $this->request->data vas ressembler à cela
array('Post' => array(
'name' => 'blabla',
'content' => 'blabla'
),
'Bloc' => array(
array(
'ville' => 'blabla',
'note' => '10'),
array(
'ville' => 'blabla',
'note' => '10'),
array(
'ville' => 'blabla',
'note' => '10')
));
Enfin, tu fais un saveAssociated
$this->Post->saveAssociated($this->request->data)
et ça devrait passé !
pour ajouter un bloc, fait une petite fonction js qui appel un element correspondant au code d'un bloc et passe lui en paramètre une variable $i incrémentée à chaque ajout d'un bloc. La variable te servira à numéroter les tableaux dans le tableau Bloc ;) !
Alors coté php sa semble bon mais je bloque encore sur le jquery.
Je peux cloner le block et changer la valeur de l'id de la div en auto incrément.
Il me reste pas mal de truc a faire pour que sa marche.
Après je vais devoir code en html les input je pense pour pouvoir changer la valeur non?
Voila le point sur l'avancé je continue de chercher. Merci en tout cas pour les pistes j'ai déjà bien avancée.
J'arrête pour se soir on verra demain.
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
var i = 1;
$('body').on('click', '.new_champs', function() {
var clone = $('#block'+i).clone();
$(this).after(clone);
ChangeIdBlock(i);
return false;
});
function ChangeIdBlock(nb) {
$('div[id^=block]').each(function() {
$(this).attr('id','block'+nb)
.find('.block').attr('id','block'+nb)
nb++;
});
}
</script>
<div id="block1" class="block">
<?php echo $this->Form->input('Bloc.1.ville', array('label'=>"Ville")); ?>
<?php echo $this->Form->input('Bloc.1.temps', array('label'=>"Temps de séjour")); ?>
<?php echo $this->Form->input('Bloc.1.notes', array('label'=>"Notes")); ?>
<hr />
</div>
<button class="new_champs">Click</button>
Bonjour, voila sa marche coté js. mais vu que je suis un peu une quiche en jquery.
Est-ce se code est bien fait ou pas ? Ou y a t'il un autre moyen plus simple et plus propre ?
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
var i = 1;
$('body').on('click', '.new_champs', function() {
var clone = $('#block'+i).clone();
$(this).after(clone);
ChangeIdBlock(i);
return false;
});
function ChangeIdBlock(nb) {
$('div[id^=block]').each(function() {
$(this).attr('id','block'+nb)
.find('.block').attr('id','block'+nb)
$(this).replaceWith('<div id="block'+nb+'" class="block"><div class="input text"><label for="Bloc'+nb+'Ville">Ville</label><input name="data[Bloc]'+nb+'][ville]" type="text" id="Bloc'+nb+'Ville"></div><div class="input text"><label for="Bloc'+nb+'Temps">Temps de séjour</label><input name="data[Bloc]'+nb+'][temps]" type="text" id="Bloc'+nb+'Temps"></div><div class="input text"><label for="Bloc'+nb+'Notes">Notes</label><input name="data[Bloc]'+nb+'][notes]" type="text" id="Bloc'+nb+'Notes"></div><hr /></div>');
nb++;
});
}
</script>
<button class="new_champs">Ajouter un bloc</button>
<div id="block1" class="block">
<div class="input text"><label for="Bloc1Ville">Ville</label><input name="data[Bloc][1][ville]" type="text" id="Bloc1Ville"></div>
<div class="input text"><label for="Bloc1Temps">Temps de séjour</label><input name="data[Bloc][1][temps]" type="text" id="Bloc1Temps"></div>
<div class="input text"><label for="Bloc1Notes">Notes</label><input name="data[Bloc][1][notes]" type="text" id="Bloc1Notes"></div>
<hr />
</div>