Yii检查beforeSave()中的场景

时间:2014-11-27 09:00:07

标签: yii behavior scenarios before-save

对于一个动作,我需要在保存到DB之前转换$ album_id 在模型函数beforeSave()中我做:

// преобразовать 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已经处于正常状态。所以我设置了方案' batchcreate'在那个行动中:

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

但条件总是如此。为什么我的场景没有设置或者没有在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;
    } 

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

切换顺序:在代码后面调用parent::beforeSave()以检查方案。继承的方法beforeSave()可能正在改变您的方案。