web-dev-qa-db-fra.com

Enregistrement d'une valeur de case à cocher dans Yii

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?

14
Matt Hampel

Pour chaque entrée que vous acceptez d'utilisateur, vous devez la définir dans model :: rule (). est actif défini ici dans rule ()?

16
Dafeng

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)

20
D3 K

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. 

6
Neil McGuigan

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

6
Php Sofsol

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/

2
Alexei Tenitski

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));?> 
1
Toño

J'ai le même problème auparavant, je change le type de données est int, donc il enregistre

0
trai bui

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'),
0
Mahendran Sakkarai

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.

0
Dhiraj Pandey