2014-11-27 4 views
-1

Для одного действий мне нужно преобразовать $ album_id, прежде чем сохранить его в БД в функции модели BeforeSave() я делаю:Yii проверка сценарий в 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); 

но для другого действия я не нуждаюсь в этом transform, потому что $ 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; 
    } 
+0

Что такое базовый класс альбома и песни? –

+0

класс Song extends ActiveRecord; класс Album extends ActiveRecord – almix

+1

Вы пытались выполнить var_dump ($ this->)? Где вы выполняете эту проверку? Какой метод вашей модели? –

ответ

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(); 
0

Переустановите заказ: позвоните по номеру parent::beforeSave() после вашего кода для проверки сценария. Унаследованный метод beforeSave() может изменять ваш сценарий.

+0

topher, no effect – almix