J'ai rencontré un problème avec les boutons radio Twitter bootstrap javascript. Lorsque j'en sélectionne un, puis clique sur le bouton Envoyer, il n'affiche pas la valeur radio sélectionnée.
Mon code:
<form action="" class="form-horizontal" method="post">
<fieldset>
<div class="control-group">
<label class="control-label">Type:</label>
<div class="controls">
<div class="btn-group" data-toggle="buttons-radio">
<button type="button" data-toggle="button" name="option" value="1" class="btn btn-primary">Option One</button>
<button type="button" data-toggle="button" name="option" value="2" class="btn btn-primary">Option Two</button>
</div>
</div>
</div>
<div class="form-actions">
<input class="btn btn-primary" type="submit" value="Go">
<a href="index.php" class="btn">Back</a>
</div>
</fieldset>
</form>
Comme vous pouvez le voir, il y a name="option" value="1"
Et name="option" value="2"
Mais quand je sélectionne une radio et je le fais:
<?php print_r($_POST); ?>
Il n'y a pas de publication option
spécifiée.
Cela se produit uniquement pour les boutons radio Twitter, car lorsque j'ajoute <input type="text" name="test" value="something"/>
, Il apparaîtra dans la variable $_POST
.
Où est le problème?
Le problème est <button>
ne soumet rien lorsque vous cliquez dessus. Vous devrez avoir un champ de saisie caché et déclencher un changement de valeur dans l'entrée en cliquant sur le bouton
<input type="hidden" name="option" value="" id="btn-input" />
<div class="btn-group" data-toggle="buttons-radio">
<button id="btn-one" type="button" data-toggle="button" name="option" value="1" class="btn btn-primary">Option One</button>
<button id="btn-two" type="button" data-toggle="button" name="option" value="2" class="btn btn-primary">Option Two</button>
</div>
<script>
var btns = ['btn-one', 'btn-two'];
var input = document.getElementById('btn-input');
for(var i = 0; i < btns.length; i++) {
document.getElementById(btns[i]).addEventListener('click', function() {
input.value = this.value;
});
}
</script>
Dans le cas du bootstrap la 'radio' n'affecte que l'état et le comportement du bouton. Elle n'affecte pas le comportement du formulaire.
Il s'agit d'une alternative jquery à la pièce ci-dessus.
$("body").find(".btn").each(function(){
$(this).bind('click', function(){
$("input[name=view-opt-bt-group-value]").value = this.value
});
});
Le code HTML de ceci est:
<div class="row pull-right">
<div class="btn-group view-opt-btn-group" data-toggle="buttons-radio">
<button type="button" class="btn" value="0"><i class="icon-th-list"></i></button>
<button type="button" class="btn" value="1"><i class="icon-th-list"></i></button>
<input type="hidden" name="view-opt-bt-group-value" value="0">
</div>
</div>
Vous pouvez ajouter la classe btn
à <label>
s, donc j'ai réalisé ce qui ne nécessite pas d'entrée cachée, se dégrade gracieusement si non bootstrap ou javascript et vous pouvez toujours utiliser les helpers html.
<div class="btn-group" data-toggle="buttons-radio">
<label class="btn">@Html.RadioButton("option", 1) Option 1</label>
<label class="btn">@Html.RadioButton("option", 2) Option 2</label>
</div>
...
<script type="text/javascript">
$(function () {
// Bootstrappable btn-group with checkables inside
// - hide inputs and set bootstrap class
$('.btn-group label.btn input[type=radio]')
.hide()
.filter(':checked').parent('.btn').addClass('active');
});
</script>
Mise à jour: Ils utilisent ce format maintenant dans Bootstrap 3 mais il nécessite un balisage légèrement différent (à savoir data-toggle="buttons"
). Voir http://getbootstrap.com/javascript/#buttons
Le code jQuery le plus simple que j'ai trouvé était:
<div class="btn-group" data-toggle="buttons-radio">
<button type="button" class="btn" onClick="$('#gender').val('f');">♀</button>
<button type="button" class="btn" onClick="$('#gender').val('m');">♂</button>
</div>
<input name="gender" id="gender" type="hidden" value="">
C'est un cas d'utilisation exceptionnel, pour moi, donc il n'a pas besoin d'être robuste ou flexible.
Ma réponse est basée sur https://stackoverflow.com/a/16214643/1111662 par @mcNux
À votre avis (j'utilise HAML mais je convertis en ERB si nécessaire)
.btn-group{data:{toggle: "buttons-radio"}}
%label.btn
= f.radio_button :gender, "Male"
Male
%label.btn
= f.radio_button :gender, "Female"
Female
Dans votre javascript spécifique à la vue, par exemple pages.js.coffee
(encore une fois, j'utilise CoffeeScript mais je le convertis en JS JQuery ordinaire si nécessaire)
$(document).ready ->
$('.btn-group label.btn input[type=radio]')
.hide()
.filter(':checked').parent('.btn').addClass('active')