Re: Как загрузить файл (толстая модель, тонкий контроллер)
Добавлено: 2012.12.02, 14:50
Оперативно)
Форум Yii-программистов
https://yiiframework.ru/forum/
Вам спасибо, что приметили такой ляп.agrail писал(а):Оперативно)
Код: Выделить всё
protected function beforeSave(){
if(!parent::beforeSave())
return false;
if($this->isAttributeSafe('document')
&& $document=CUploadedFile::getInstance($this,'document')) {
$this->deleteDocument(); // старый документ удалим, потому что загружаем новый
$this->document=$document;
// DS - зачем? в unix всегда '/', а винда понимает
$this->document->saveAs(Yii::getPathOfAlias('webroot.media').'/'.$this->document);
}
return true;
}
Я знаю что не присваивается, но создается, а если бы до валидации в атрибут модели уже файл то и не создается.Sam Dark писал(а):mc-bear
Есть. Он там никуда не присваивается.
Код: Выделить всё
/**
* @var array scenario applies a validation; in case array('*') validatation will be applied to all scenarios
*/
public $scenarios = array('*');
/**
*
* @var boolean
*/
public $allowEmpty = true;
/**
*
* @var int maxSixe of uploaded file. By default 2Mb
*/
public $maxSize = 2048576;
.................................
public function attach($owner) {
parent::attach($owner);
if (in_array($owner->getScenario(), $this->scenarios) OR $this->scenarios == array('*')) {//если сценарии указаны как array('*'), то валидация будет выполнена в любом случае
$fileValidator = CValidator::createValidator(
'file', $owner, $this->attributeName, array(
'types' => $this->fileTypes,
'allowEmpty' => $this->allowEmpty,
'maxSize' => $this->maxSize,
'safe' => false,
)
);
$owner->validatorList->add($fileValidator);
}
}
...........................................
Разумно. Можно, наверное, указать в рецепте.mc-bear писал(а):Поэтому я спрашиваю, может в beforeValidate сохранить файл CUploadedFile::getInstance в атрибт модели,
а сохранить в beforeSave
Я не вдумывался, я пока в контроллере это делаю, ессно до валидации.resurtm писал(а):Хотя с другой стороны CUploadedFile и вправду не особо тяжёлый и большой, чтобы накладно было дважды создавать.
установить allowEmpty в falseraketa писал(а):а как используя поведение UploadableFileBehavior сделать чтобы при добавлении записи поле с файлом было обязательным?
Тогда поле будет обязательным всегда, к примеру создали модель с файлом (файл обязательный) дальше пользователь его редактирует, но в этом случае не нужно требовать грузить файл еще разMetalGuardian писал(а):установить allowEmpty в falseraketa писал(а):а как используя поведение UploadableFileBehavior сделать чтобы при добавлении записи поле с файлом было обязательным?
Код: Выделить всё
array('image','required','on'=>'insert'),
Код: Выделить всё
public function rules(){
return array(
array('title','required','on'=>'insert,update'),
// после генерации модели при помощи Gii нужно убрать валидацию
// у атрибута $document — если этого не сделать, то оно будет
// препятствовать правильной работе валидации загружаемого файла
);
}
Код: Выделить всё
$fileValidator=CValidator::createValidator('file',$owner,$this->attributeName,
array('types'=>$this->fileTypes,'allowEmpty'=>true, 'safe'=true));