【问题标题】:Yii, set model value without using a hidden fieldYii,设置模型值而不使用隐藏字段
【发布时间】:2013-02-05 18:06:33
【问题描述】:

我想在我的模型中设置字段的值。字段(源)在数据库中,但表单上没有用于捕获数据的字段。我想在不创建隐藏表单字段的情况下设置字段的值。这可能吗?

谢谢!

//in controller
public function actionTest()
                {
        $model=new TestForm();
        $src = 'hello';  
        $model->source($src);
        echo $model->source; // hello
        $this->render('_form',array('model'=>$model));    
                }  

然后提交表单,当然 $source 不在 _POST 中,因为没有字段可以捕获 $source

但是我已经设置了 $model->source 的值,但是这个值似乎没有持久化,因为它没有保存在数据库中。

我发现解决这个问题的唯一方法是使用隐藏字段并将 $source 的值传递给表单。

有没有办法设置 $model->source 并让这个值在不通过表单的情况下进入数据库?

【问题讨论】:

标签: php yii


【解决方案1】:

如果您需要在显示表单时设置$source 的值(因为例如当您手头有所需的数据时),则创建一个隐藏的输入控件。这没有什么问题。你想在你的模型中保留一个非默认值,隐藏的输入元素就是这样做的方法。

【讨论】:

  • 我想我会接受这个答案。我只是觉得不必制作隐藏元素可能会很好......
  • 如果您要使用的值像用户 ID 一样敏感怎么办?而且您不想让用户尝试使用不同的 ID。这仍然是最好的方法吗?
  • @johnsnails:这个问题是在转移注意力。无论您是否输入隐藏字段,客户端提交的数据始终都应该被假定为恶意,除非被证明是恶意的。他们可以添加尽可能多的字段并给他们任何他们想要的值;在服务器端执行安全策略取决于您。
【解决方案2】:

表单必须在某个地方发布,在 Yii 中建议发布回同一页面。

我会这样做:

public function actionUpdate($id)
    {
        $model=$this->loadModel($id);

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

        if(isset($_POST['NotificationLog']))
        {
            $model->attributes=$_POST['NotificationLog'];
            if($model->save())
                $this->redirect(array('admin'));
        } else {
                  // set defaults
                  $model->source = 'hello';
            }

        $this->render('update',array(
            'model'=>$model,
        ));
    }

【讨论】:

    【解决方案3】:

    在模型类的规则函数中做这样的事情:

    public function rules() {
    
        return array(
            .
            .
            .
            array('source', 'default', 'value' => 'hello'),
        );
    }
    

    【讨论】:

    • 如果您希望该值是当前登录的用户 ID,该怎么办?您可以使用此方法使用该值吗?没关系。我认为这会奏效。 ['source', 'default', 'value' => Yii::$app->user->id],
    【解决方案4】:

    【讨论】:

    • 你应该在这里提供完整的答案,不要只是发布链接并认为就是这样。尝试写一些代码示例。
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多