【问题标题】:Yii check scenario in beforeSave()在 beforeSave() 中 Yii 检查场景
【发布时间】:2014-11-27 09:00:07
【问题描述】:

对于一项操作,我需要先转换 $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;
    } 

【问题讨论】:

  • 专辑和歌曲的基类是什么?
  • 类 Song 扩展 ActiveRecord;类专辑扩展 ActiveRecord
  • 你试过 var_dump( $this->scenario ) 吗?您在哪里执行此检查?你的模型是什么方法?
  • 我在受保护的函数 beforeSave() 中执行此检查模型; Valentin,我创建变量而不是场景并检查它 - if($this->notbatchcreate == 'yes'),在一个控制器操作中,我将其设置为 $model->notbatchcreate = 'yes';但在另一个没有。所以它有效。但是为什么场景不起作用我无法理解
  • 'insert' 是在 CActiveRecord 的构造函数中设置的默认场景。很难说在你的问题中看代码的小sn-p有什么问题。

标签: yii behavior scenarios before-save


【解决方案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();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多