0

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

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]

4

2 回答 2

1

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

相反,您需要致电:

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

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

希望这对其他人有帮助..

于 2012-09-21T15:26:51.043 回答
1

当您通过 setAttributes 属性批量分配参数时

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

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

于 2012-09-21T17:08:28.247 回答