【问题标题】:Saving a checkbox value in Yii在 Yii 中保存复选框值
【发布时间】:2011-06-02 19:01:33
【问题描述】:

我不知道如何在 Yii 中正确保存复选框值。我有一个 MySQL 列 active,定义为 tinyint。我有以下表单创建代码,如果值为 1,则正确显示复选框为选中,如果值为 0,则未选中:

    <?php echo $form->labelEx($model,'active'); ?>
    <?php echo $form->checkBox($model,'active'); ?>
    <?php echo $form->error($model,'active'); ?>

并且用于正确保存表单的代码会更改其他基于文本的值:

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,
    ));
}

active 的值未保存。我哪里错了?

【问题讨论】:

  • 您看到的错误是什么?在$model-&gt;attributes=$_POST['Thing']; 之后,$model->active 的值是多少?当前与活动字段相关联的验证器是什么(参见 rules() 函数)?你试过用 Gii 自动生成 CRUD 操作,这样你就可以比较代码了吗?
  • 谢谢安东尼,我没有意识到每个输入都需要规则。我加了array('active', 'boolean'),问题解决了。

标签: yii


【解决方案1】:

对于您从用户接受的每个输入,您需要在 model::rule() 中定义它。在 rule() 中定义了 active 吗?

【讨论】:

  • 实际上,如果您只是在规则中将其定义为 integerOnly,yii 足够聪明,知道它必须将 bool 转换为 int,并且复选框代码位足够聪明,可以理解 0而1代表(实际上在PHP中,任何整数都可以用作bool)
【解决方案2】:

请关注: 1. 在 protected/models/Thing.php 中添加 active 作为数字

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'),
    );
}

控制器动作:没问题

查看:

<?php echo $form->labelEx($model,'active'); ?>
<?php echo $form->checkBox($model,'active', array('value'=>1, 'uncheckValue'=>0)); ?>
<?php echo $form->error($model,'active'); ?>

希望这对你有用...

【讨论】:

    【解决方案3】:

    您可以使用 htmlOptions 数组来指定 value 属性。下面是代码示例:

    <?php echo $form->labelEx($model,'active'); ?>
    <?php echo $form->checkBox($model,'active', array('value'=>1, 'uncheckValue'=>0)); ?>
    <?php echo $form->error($model,'active'); ?>
    

    从 1.0.2 版开始,一个名为“uncheckValue”的特殊选项是 可用,可用于指定返回值时 复选框未选中。默认情况下,此值为“0”。 (本文摘自 YII 文档)

    【讨论】:

    • 这也适用于非数值,例如 checkBox($model,'active',array('value' => 'Y', 'uncheckValue' =>'N')); ?>
    【解决方案4】:

    一般来说,如果您在保存到数据库时遇到问题,我会替换

    $model->save();
    

    if($model->save() == false) var_dump($model->errors);
    

    这样,您就可以确切地看到它没有保存的原因。这通常是一个验证错误。

    【讨论】:

      【解决方案5】:

      这篇文章有助于了解如何在 Yii 中处理布尔值和复选框

      http://www.larryullman.com/2010/07/25/handling-checkboxes-in-yii-with-non-boolean-values/

      【讨论】:

        【解决方案6】:

        我在我的数据库中使用了位类型字段,但它不起作用。

        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));?> 
        

        【讨论】:

          【解决方案7】:

          您可以通过打印所有正在捕获的属性来检查。如果 active 没有被捕获,它一定是不安全的。您需要将变量声明为安全的或围绕该变量定义规则。这将使变量安全。

          【讨论】:

            【解决方案8】:

            我之前也有类似的问题,我把数据类型改成int,所以保存了

            【讨论】:

              【解决方案9】:

              我们还可以在model 中添加一条规则为safe 以将值从form 传递到controller 而不会丢失。

              array('active', 'safe'),
              

              【讨论】:

                【解决方案10】:

                好吧,这篇文章太老了,但我找到了一个非常有用的解决方案,特别是为复选框指定一个指定的值而不是数字。新语法是这样的 注意我正在使用 ActiveForm

                field($model3, 'External_Catering')->checkbox(['id' => 'remember-me-ver', 'custom' => true,'value'=>"External_Catering", 'uncheckValue'=>"vide "]) ?>

                1) 我的模型在哪里 =>model3

                2) 名称为 External_Catering

                3) 取值为 External_Catering 并在 uncheckValue 时为空

                4) 在 Controller 中,您只需指定模型及其属性即可获得值 $External_Catering=$model3->External_Catering。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-04-23
                  • 2011-01-10
                  • 1970-01-01
                  • 2021-12-31
                  • 1970-01-01
                  • 2014-07-31
                  • 2016-11-12
                  • 1970-01-01
                  相关资源
                  最近更新 更多