在保存之前,Yii设置没有被调用?

时间:2012-09-21 15:26:51

标签: php yii model yii-components

小问题..我有一个表将一些系统变量存储为序列化数组。在我的模型中,我必须使用函数来设置并将此字段变为可读形式。他们是:

public function setoptPramasString($value){
     $this->opt_pramas = '';

     $str1 = explode(',', $value);
     foreach ($str1 as $str2) {
         $myVal = explode('=>', $str2);
         $this->opt_pramas[trim($myVal[0])] = (string)trim($myVal[1]);   
         echo "<BR>".$myVal[0]." => ".$myVal[1];
     }
 }

/**
 * 
 */
 public function getoptPramasString(){
     $str = '';
     $x = 0;
     foreach ($this->opt_pramas as $key => $value) {
         if($x == 0){
            $str .= $key."=>".$value;
             $x++;
         }else{
             $str .= ", ".$key."=>".$value;
         }

     }

我在保存之前和查找后的功能是:

/**
 * 
 */
 public function beforeSave(){

     $this->opt_pramas = serialize($this->opt_pramas);
     return parent::beforeSave();
 }

 /**
  * 
  */
  public function afterFind(){
      $this->opt_pramas = unserialize($this->opt_pramas);
      return parent::afterFind();
  }

我在控制器中的更新操作是:

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

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

    if(isset($_POST['SystemMenuSearch']))
    {
        $model->attributes=$_POST['SystemMenuSearch'];
        if($model->save()){
            $this->redirect(array('view','id'=>$model->search_id));    
        }
    }

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

似乎正在发生的事情是beforeSave函数在setoptPramaString函数之前被调用。这是Yii中的错误还是我错过了什么? 我的逻辑是,当值设置为模型属性时,它将触发setoptPramaString函数,然后当在模型上调用save时,它将触发模型中的beforeSave函数。我检查了表单,名称是正确的,SystemMenuSearch[optPramaString]

2 个答案:

答案 0 :(得分:1)

问题似乎是当您使用$model->attributes = $_POST[SystemMenuSearch]分配一批可变数据时,setoptPramasString函数未被触发。我不确定这是一个错误还是设计。

相反,您需要致电:

$model->attributes = $_POST[SystemMenuSearch];
$model->optPramasString = $_POST[SystemMenuSearch][optPramasString];

这似乎与逻辑相反,但可能是因为框架或PHP中的限制。

希望这有助于其他人......

答案 1 :(得分:1)

通过setAttributes属性

批量分配参数时
$model->attributes = $_POST[SystemMenuSearch];

它们将被忽略,因为它们不在安全属性列表中