小问题..我有一个表将一些系统变量存储为序列化数组。在我的模型中,我必须使用函数来设置并将此字段变为可读形式。他们是:
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]
。
答案 0 :(得分:1)
问题似乎是当您使用$model->attributes = $_POST[SystemMenuSearch]
分配一批可变数据时,setoptPramasString
函数未被触发。我不确定这是一个错误还是设计。
相反,您需要致电:
$model->attributes = $_POST[SystemMenuSearch];
$model->optPramasString = $_POST[SystemMenuSearch][optPramasString];
这似乎与逻辑相反,但可能是因为框架或PHP中的限制。
希望这有助于其他人......
答案 1 :(得分:1)
通过setAttributes属性
批量分配参数时$model->attributes = $_POST[SystemMenuSearch];
它们将被忽略,因为它们不在安全属性列表中