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;
         }

     }

my before save と after find 関数は次のとおりです。

/**
 * 
 */
 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

setAttributes プロパティを使用してパラメーターを一括割り当てする場合

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

それらは安全な属性リストにないため無視されます

于 2012-09-21T17:08:28.247 に答える
1

$model->attributes = $_POST[SystemMenuSearch]問題は、関数を使用して変数のバッチを割り当てるときに発生しないことですsetoptPramasString。これがバグなのか仕様によるものなのかはわかりません。

代わりに、次のように呼び出す必要があります。

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

これは論理に反しているように見えますが、フレームワークまたは PHP の制限が原因である可能性があります。

これが他の人に役立つことを願っています..

于 2012-09-21T15:26:51.043 に答える