-1

对于一项操作,我需要先转换 $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 语句?或者最好不要检查场景,而是制作另一个变量,那么如何为两种不同的情况设置它的值?

我的整个 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 回答