Je n'arrive pas à comprendre comment enregistrer correctement les valeurs de case à cocher dans Yii. J'ai une colonne MySQL, active
, définie comme une tinyint
. J'ai le code de création de formulaire suivant, qui affiche correctement la case à cocher cochée si la valeur est 1 et décochée si 0:
<?php echo $form->labelEx($model,'active'); ?>
<?php echo $form->checkBox($model,'active'); ?>
<?php echo $form->error($model,'active'); ?>
Et le code pour enregistrer le formulaire modifie correctement les autres valeurs textuelles:
public function actionUpdate($id)
{
$model=$this->loadModel($id);
if(isset($_POST['Thing']))
{
$model->attributes=$_POST['Thing'];
if($model->save())
$this->redirect(array('thing/index'));
}
$this->render('update',array(
'model'=>$model,
));
}
La valeur de active
n'est pas enregistrée. Où vais-je mal?
Pour chaque entrée que vous acceptez d'utilisateur, vous devez la définir dans model :: rule (). est actif défini ici dans rule ()?
Vous pouvez utiliser le tableau htmlOptions pour spécifier l'attribut value. Voici l'exemple de code:
<?php echo $form->labelEx($model,'active'); ?>
<?php echo $form->checkBox($model,'active', array('value'=>1, 'uncheckValue'=>0)); ?>
<?php echo $form->error($model,'active'); ?>
Depuis la version 1.0.2, une option spéciale nommée 'uncheckValue' est disponible. Peut être utilisée pour spécifier la valeur renvoyée lorsque la case N'est pas cochée. Par défaut, cette valeur est 0. (Ce texte provient de YII Documenration)
En général, si vous rencontrez des problèmes pour sauvegarder dans la base de données, je remplacerais
$model->save();
avec
if($model->save() == false) var_dump($model->errors);
de cette façon, vous pouvez voir exactement pourquoi il n'a pas économisé. c'est généralement une erreur de validation.
Veuillez suivre: 1. dans protected/models/Thing.php add active as numeric
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('active', 'numerical', 'integerOnly'=>true),
//OR optional
array('active', 'safe'),
);
}
Action du contrôleur: ça va
Vue:
<?php echo $form->labelEx($model,'active'); ?>
<?php echo $form->checkBox($model,'active', array('value'=>1, 'uncheckValue'=>0)); ?>
<?php echo $form->error($model,'active'); ?>
J'espère que cela fonctionnera pour vous ...
Article qui peut être utile pour comprendre comment gérer les booléens et les cases à cocher dans Yii
http://www.larryullman.com/2010/07/25/handling-checkboxes-in-yii-with-non-boolean-values/
J'ai utilisé un champ de type de bit dans ma base de données et cela n'a pas fonctionné.
1.- I changed the field type to tinyint
2.- In the rules function added:
array('active','numerical'),
3.-In the form (as D3K said) do:
<?echo $form->checkBox($model,'active',array('value'=>1, 'uncheckValue'=>0));?>
J'ai le même problème auparavant, je change le type de données est int, donc il enregistre
Nous pouvons également ajouter une règle sous la forme safe
dans model
pour transmettre les valeurs de form
à controller
sans manquer.
array('active', 'safe'),
Vous pouvez vérifier en imprimant tous les attributs capturés. Si actif n'est pas capturé, cela ne doit pas être sûr. vous devez déclarer la variable comme étant sûre ou définir une règle autour de cette variable. Cela rendra la variable sûre.