-1

1 つのアクションでは、モデル関数 beforeSave() で DB に保存する前に $album_id を変換する必要があります。

// преобразовать album -> album_id
$album_id=array();
foreach($this->string2array($this->album, '\|') as $one)
    $album_id[]=Album::model()->findByAttributes(array('album' => $one))->id;

$this->album_id = $this->array2string($album_id);

$album_id はすでに適切な状態にあるため、別のアクションではこの変換は必要ありません。そのため、そのアクションでシナリオ「バッチ作成」を設定しました。

public function actionCreate()
{
    Yii::import('ext.multimodelform.MultiModelForm');

    $model = new Album('create'); 

    $song = new Song();
    $song->setScenario('batchcreate');
    ...
}

モデルでこのシナリオを確認してみてください:

if(!($this->scenario === 'batchcreate')) {
    // преобразовать album -> album_id
    $album_id=array();
    foreach($this->string2array($this->album, '\|') as $one)
        $album_id[]=Album::model()->findByAttributes(array('album' => $one))->id;
    $this->album_id = $this->array2string($album_id);
}

ただし、条件は常に true です。シナリオで if ステートメントが設定されない、またはチェックインされないのはなぜですか? または、シナリオではなくチェックする方が良いかもしれませんが、別の変数を作成して、2つの異なるケースでその値を設定するにはどうすればよいですか?

私の全体の beforeSave():

protected function beforeSave()
    {
        if(parent::beforeSave())
        {

            // преобразовать whoes -> who
            $who=array();
            foreach($this->string2array($this->whoes) as $one) {
                $userrow = User::model()->findByAttributes(array('username' => $one));
                if($userrow) $who[]=CHtml::encode($userrow->id);
                else $who[]=$one;                              
            }
            $this->who = $this->array2string($who); 


            //var_dump( $this->scenario );
            if(!($this->scenario == 'batchcreate')) {
            //if($this->notbatchcreate == 'yes') {
                // преобразовать album -> album_id
                $album_id=array();
                foreach($this->string2array($this->album, '\|') as $one)
                    $album_id[]=Album::model()->findByAttributes(array('album' => $one))->id;
                $this->album_id = $this->array2string($album_id);
            }



            return true;
        }
        else
            return false;
    } 
4

2 に答える 2

1

それ以外の

$song = new Song();
$song->setScenario('batchcreate');

あなたは簡単に行うことができます

$song = new Song('batchcreate');

beforeSave()

if ( $this->scenario != 'batchcreate' ) {
    echo "good - scenario is not batchcreate";
    die();
}
echo 'nope...';
var_dump($this->scenario);
die();
于 2014-11-27T12:21:35.180 に答える
0

順序parent::beforeSave()を入れ替えます。シナリオを確認するために、コードの後に​​呼び出します。継承されたメソッドbeforeSave()がシナリオを変更している可能性があります。

于 2014-11-27T12:39:55.207 に答える