Сделал по этой теме загрузку файла загрузка файлов yii, использовал вариант с поведением. Но как сделать запись названия файла в бд, если оно генерируется следующим образом:
$sourcePath = pathinfo($file->getName());
$fileName = md5(microtime()) .'.'. $sourcePath['extension']; // имя будущего файла в базе и ФС
Проблема в том, что я не знаю как получить $fileName в коде ниже в мой контроллер, который наследует это поведение.
// имейте ввиду, что методы-обработчики событий в поведениях должны иметь
// public-доступ начиная с 1.1.13RC
public function beforeSave($event){
if(in_array($this->owner->scenario,$this->scenarios) &&
($file=CUploadedFile::getInstance($this->owner,$this->attributeName))){
$this->deleteFile(); // старый файл удалим, потому что загружаем новый
$sourcePath = pathinfo($file->getName());
$fileName = md5(microtime()) .'.'. $sourcePath['extension']; // имя будущего файла в базе и ФС
$this->owner->setAttribute($this->attributeName,$file->name);
$file->saveAs($this->savePath.$fileName);
}
return true;
}
Поведение (behavior) не наследуется, оно подключается. Не путайте пожалуйста ни себя, ни меня.
$this->owner - это собственно объект, к которому прикреплено "поведение". Вы говорите, что это контроллер, но по имени метода beforeSave - есть подозрение, что поведение все же прикрепляется к "модели", или я не понимаю, или вы опять путаете.
CUploadedFile::getInstance - это магия такая, просто используется. Судя по названию там где-то используется паттерн Singleton, но думаю сейчас это не важно.