Как загрузить файл (толстая модель, тонкий контроллер)
- resurtm
- Сообщения: 299
- Зарегистрирован: 2010.12.19, 09:13
- Откуда: Казахстан, Алма-Ата
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Вам спасибо, что приметили такой ляп.agrail писал(а):Оперативно)
Re: Как загрузить файл (толстая модель, тонкий контроллер)
SamDark:"Э, нее. С protected больше не работает. См. описание в master."
Так в чем там причина, можете рассказать?Почему эти методы public сделали?
Так в чем там причина, можете рассказать?Почему эти методы public сделали?
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Если нет желания постоянно следить за моделью и за новыми сценариями
Можно вот так
Можно вот так
Код: Выделить всё
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;
}
Жду Yii 3!
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
И кстати т.к. в FileValidator создается объект CUploadedFile::getInstance, есть ли смысл создавать его еще раз в модели?
Экономия не важная, но все же экономия. может есть смысл перенести в beforeValidate?
Экономия не важная, но все же экономия. может есть смысл перенести в beforeValidate?
Жду Yii 3!
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
agrail
public сделали ради сильно меньшего съедания памяти.
mc-bear
Есть. Он там никуда не присваивается.
public сделали ради сильно меньшего съедания памяти.
mc-bear
Есть. Он там никуда не присваивается.
Нравится Yii? Давайте сделаем его лучше!.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Я знаю что не присваивается, но создается, а если бы до валидации в атрибут модели уже файл то и не создается.Sam Dark писал(а):mc-bear
Есть. Он там никуда не присваивается.
Поэтому я спрашиваю, может в beforeValidate сохранить файл CUploadedFile::getInstance в атрибт модели,
а сохранить в beforeSave
Жду Yii 3!
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Я у себя вот так еще сделал:
Код: Выделить всё
/**
* @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);
}
}
...........................................
- resurtm
- Сообщения: 299
- Зарегистрирован: 2010.12.19, 09:13
- Откуда: Казахстан, Алма-Ата
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Разумно. Можно, наверное, указать в рецепте.mc-bear писал(а):Поэтому я спрашиваю, может в beforeValidate сохранить файл CUploadedFile::getInstance в атрибт модели,
а сохранить в beforeSave
Хотя с другой стороны CUploadedFile и вправду не особо тяжёлый и большой, чтобы накладно было дважды создавать.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Я не вдумывался, я пока в контроллере это делаю, ессно до валидации.resurtm писал(а):Хотя с другой стороны CUploadedFile и вправду не особо тяжёлый и большой, чтобы накладно было дважды создавать.
Не тяжелый, значит не тяжелый
Жду Yii 3!
Re: Как загрузить файл (толстая модель, тонкий контроллер)
а как используя поведение UploadableFileBehavior сделать чтобы при добавлении записи поле с файлом было обязательным?
- MetalGuardian
- Сообщения: 208
- Зарегистрирован: 2011.03.06, 02:42
- Откуда: Киев
Re: Как загрузить файл (толстая модель, тонкий контроллер)
установить allowEmpty в falseraketa писал(а):а как используя поведение UploadableFileBehavior сделать чтобы при добавлении записи поле с файлом было обязательным?
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Тогда поле будет обязательным всегда, к примеру создали модель с файлом (файл обязательный) дальше пользователь его редактирует, но в этом случае не нужно требовать грузить файл еще разMetalGuardian писал(а):установить allowEmpty в falseraketa писал(а):а как используя поведение UploadableFileBehavior сделать чтобы при добавлении записи поле с файлом было обязательным?
Было бы удобнее подключив один раз поведение забыть про него ...
к примеру в rules стандартно писать
Код: Выделить всё
array('image','required','on'=>'insert'),
Как выход передавать в поведение параметр который определяет при каких сценариях атрибут обязательный, чего не хотелось бы,
либо каким то образом в самом поведении удалять правило валидации required и добавлять allowEmpty = false, но пока не нашел такой возможности
Последний раз редактировалось raketa 2012.12.16, 17:22, всего редактировалось 1 раз.
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Так-же рецепт при использовании поведения не рабочий
атрибут $document получается unsafe
и далее в поведении добавляется валидатор file который по умолчанию с недавних пор тоже unsafe
нужно прописать
'safe'=true
Код: Выделить всё
public function rules(){
return array(
array('title','required','on'=>'insert,update'),
// после генерации модели при помощи Gii нужно убрать валидацию
// у атрибута $document — если этого не сделать, то оно будет
// препятствовать правильной работе валидации загружаемого файла
);
}
и далее в поведении добавляется валидатор file который по умолчанию с недавних пор тоже unsafe
нужно прописать
Код: Выделить всё
$fileValidator=CValidator::createValidator('file',$owner,$this->attributeName,
array('types'=>$this->fileTypes,'allowEmpty'=>true, 'safe'=true));
- dignityinside
- Сообщения: 76
- Зарегистрирован: 2013.04.04, 17:57
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Почему при редактировании удаляется старая картинка или как сделать так, чтобы если я не выбрал картинку, старая не удалялась?
UPD нашел сам решение:
array('img','file','types'=>'jpg,jpeg,png,gif', 'allowEmpty'=>true,'on'=>'insert,update', 'maxSize' => 1048576, 'safe'=>false),
UPD нашел сам решение:
array('img','file','types'=>'jpg,jpeg,png,gif', 'allowEmpty'=>true,'on'=>'insert,update', 'maxSize' => 1048576, 'safe'=>false),
Мой блог:
https://protonalex.com
https://protonalex.com
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Скажите, пожалуйста, а как сделать загрузку нескольких файлов, если у поля для загрузки использовать атрибут multiple?