2012-07-12 107 views
3

我想在我的模型中设置字段的值。该字段(源)位于数据库中,但在表单上没有用于捕获数据的字段。我想设置该字段的值而不创建隐藏的表单字段。那可能吗?Yii,不使用隐藏字段设置模型值

谢谢!

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

的形式遂以当然$源不在彦博,因为没有现场捕捉到$源

但是我已经设置了一个$模型 - 值>源代码,但这个值似乎没有保存,因为它没有保存在数据库中。

解决这个问题的唯一方法就是使用隐藏字段并将$ source的值传递给窗体。

有没有一种方法来设置$ model->源和这个值去在数据库中,而不通过形式?

+1

请参阅http://www.yiiframework.com/doc/guide/1.1/en/form.model _Declaring安全属性_我认为您应该声明源属性为不安全。如果你使用隐藏字段,攻击者可以用萤火虫改变它。 – 2012-07-12 12:33:33

回答

1

我会做这种方式。这没什么错,你想在你的模型中保持一个非默认值,并且隐藏的输入元素就是实现这一点的方法。

+0

我想我会接受这个答案。我只是觉得可能不需要制作一个隐藏的元素...... – rix 2012-07-12 12:02:37

+0

如果你想使用的值是一个敏感的用户id,该怎么办?而且你不想让用户尝试使用不同的ID。这仍然是最好的方式吗? – johnsnails 2016-01-27 11:56:34

+0

@ johnsnails:这个问题是一个红色的鲱鱼。无论您是否将隐藏字段放在隐藏字段中,客户提交的数据都应被认为是恶意行为,直到被证实为止。他们可以添加尽可能多的领域,并给予他们想要的任何价值;您需要在服务器端实施安全策略。 – Jon 2016-01-27 12:51:35

0

那么表单必须发布到某个地方,并且在Yii建议回发到同一页面。如果你需要显示窗体时(因为例如,当你手中有需要的数据的),然后创建一个隐藏的输入控件设置的$source

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

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

public function rules() { 

    return array(
     . 
     . 
     . 
     array('source', 'default', 'value' => 'hello'), 
    ); 
} 
+0

如果您希望该值成为当前登录的用户ID,该怎么办?你能用这个方法使用这个值吗?没关系。我认为这会奏效。 ['source','default','value'=> Yii :: $ app-> user-> id], – johnsnails 2016-01-27 11:54:27