Как загрузить файл (толстая модель, тонкий контроллер)
- resurtm
- Сообщения: 299
- Зарегистрирован: 2010.12.19, 09:13
- Откуда: Казахстан, Алма-Ата
- Контактная информация:
Как загрузить файл (толстая модель, тонкий контроллер)
Новый рецепт: http://yiiframework.ru/doc/cookbook/ru/ ... .fat.model
Тема предназначена для обсуждения рецепта и ссылка на неё указана в рецепте.
Тема предназначена для обсуждения рецепта и ссылка на неё указана в рецепте.
Последний раз редактировалось resurtm 2012.07.02, 05:13, всего редактировалось 1 раз.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Так не красивее?
Код: Выделить всё
public function rules()
{
return array(
array('title','required'),
array('document','file','types'=>'doc,docx,xls,xlsx,odt,pdf','allowEmpty'=>true, 'safe' => false),
);
}
Жду Yii 3!
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
почему не можим?// валидируем вручную, потому как изменить метод rules() у $owner мы не можем и правил всего два
Код: Выделить всё
public function attach($owner)
{
$fileValidator = CValidator::create('file', $this->attributeName, $params);
$owner->validatorList->add($fileValidator);
}
Жду Yii 3!
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Влил на сайт.
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 350
- Зарегистрирован: 2009.09.17, 16:47
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Фраза: "Так, например, мы не учли ситуацию, когда две разные модели могут иметь два файла с одним и тем-же файлом." кажется взрывает мозг). Наверное два файла с одинаковым именем.
В поведении beforeDelete() не чего не должен возвращать? типа boolean? И я бы удалял файлы в afterDelete(), хотя это уже больше логика приложения.
Еще бы неплохо как-то обозначить момент проверки существования\создания папки где хранятся файлы и на отсутствие кинуть исключение. Я понимаю, что это мб выходит за пределы рецепта, но это по моему неотъемлемая часть.
З.Ы. Странно что есть такой классный метод: getValidatorList(), а для relations такого нет =/
В поведении beforeDelete() не чего не должен возвращать? типа boolean? И я бы удалял файлы в afterDelete(), хотя это уже больше логика приложения.
Еще бы неплохо как-то обозначить момент проверки существования\создания папки где хранятся файлы и на отсутствие кинуть исключение. Я понимаю, что это мб выходит за пределы рецепта, но это по моему неотъемлемая часть.
З.Ы. Странно что есть такой классный метод: getValidatorList(), а для relations такого нет =/
Предупрежден - значит вооружен.
devKP.ru
devKP.ru
- resurtm
- Сообщения: 299
- Зарегистрирован: 2010.12.19, 09:13
- Откуда: Казахстан, Алма-Ата
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Да, спасибо за замечания, на днях поправлю.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Почему нетSpiLLeR писал(а):З.Ы. Странно что есть такой классный метод: getValidatorList(), а для relations такого нет =/
Код: Выделить всё
$model = Post::model();
$model->metaData->addRelation('comments', array(
ActiveRecord::HAS_MANY, 'Comment', 'postId',
));
Жду Yii 3!
-
- Сообщения: 350
- Зарегистрирован: 2009.09.17, 16:47
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Во спасибо, а я свой велосипед написал.
З.Ы. класса ActiveRecord в ий нет или опять чего не досмотрел...)
З.Ы. класса ActiveRecord в ий нет или опять чего не досмотрел...)
Предупрежден - значит вооружен.
devKP.ru
devKP.ru
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
нет, извини, это я по привычке у меня свой расширенный ActiveRecord )
Жду Yii 3!
- mihan007
- Сообщения: 31
- Зарегистрирован: 2011.01.28, 11:05
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
https://github.com/phpnode/YiiBlocks/tr ... /resources - мне вот эта штука по душе, а в частности AResourceful. Идея - внутри модели определяются виртуальные атрибуты - ресурсы. В качестве ресурса может выступать один или несколько файлов. Их загрузка и удаление происходит фактически при массовом присвоении аттрибутов ($model->attributes) и удалении модели соответственно. Кому нужна миграция для создания таблицы под неё - пишите в ЛС.
- MetalGuardian
- Сообщения: 208
- Зарегистрирован: 2011.03.06, 02:42
- Откуда: Киев
Re: Как загрузить файл (толстая модель, тонкий контроллер)
нашел небольшой баг в загрузке файла используя поведение:
валидатор вешается только на указанные сценарии, но файлы заливаются в любом случае.
то есть если сценария нет в списке, то можно залить любой файл.
валидатор вешается только на указанные сценарии, но файлы заливаются в любом случае.
то есть если сценария нет в списке, то можно залить любой файл.
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Это не совсем уж и баг, а больше специфика работы с файлами в PHP. Просто файлы не через атрибуты передаются и в $_POST отсутствуют. Влиять на элементы массива $_FILES исходя из правил валидации фреймворк не способен. Валидатор CFileValidator - это, можно сказать, некий фиктивный костыль с побочным действием.MetalGuardian писал(а):если сценария нет в списке, то можно залить любой файл.
- MetalGuardian
- Сообщения: 208
- Зарегистрирован: 2011.03.06, 02:42
- Откуда: Киев
Re: Как загрузить файл (толстая модель, тонкий контроллер)
это проблема не пхп.
тут дело в чем: валидатор навешивается только в случае соответствия сценариев, а сохранение происходит в любом случае.
нужна такая же проверка на нужный сценарий и в методе beforeSave - тогда не будет сохранения.
тут дело в чем: валидатор навешивается только в случае соответствия сценариев, а сохранение происходит в любом случае.
нужна такая же проверка на нужный сценарий и в методе beforeSave - тогда не будет сохранения.
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Ну это самому можно в своей модели добавить проверку на сценарий
Просто мне не очень понятно, как при инкапсуляции этой проверки в поведение оно получит список сценариев. Хотя можно либо $this->owner->rules() вручную парсить, либо в параметре поведения список сценариев задавать.
Код: Выделить всё
class Post extends CActiveRecord
{
protected function beforeValidate()
{
if (parent::beforeValidate())
{
if(!in_array($this->scenario, array('qwert', 'asdf')){
unset($_FILES['Post']['file']);
}
return true;
} else
return false;
}
}
Последний раз редактировалось ElisDN 2012.11.06, 14:43, всего редактировалось 1 раз.
- MetalGuardian
- Сообщения: 208
- Зарегистрирован: 2011.03.06, 02:42
- Откуда: Киев
Re: Как загрузить файл (толстая модель, тонкий контроллер)
в поведение и так передаются сценарии в которых должна быть загрузка.
я говорю лишь что нужна проверка в двух местах
я говорю лишь что нужна проверка в двух местах
- resurtm
- Сообщения: 299
- Зарегистрирован: 2010.12.19, 09:13
- Откуда: Казахстан, Алма-Ата
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
В принципе, поправить может любой, сделав pull request вот тут: https://github.com/samdark/yiiframework_ru_cookbook
Сегодня вечером поправлю. Спасибо, что указали на недочёт.
Сегодня вечером поправлю. Спасибо, что указали на недочёт.
Re: Как загрузить файл (толстая модель, тонкий контроллер)
Не очень понятно, почему beforeSave и beforeDelete в поведении являются public-методами
- MetalGuardian
- Сообщения: 208
- Зарегистрирован: 2011.03.06, 02:42
- Откуда: Киев
Re: Как загрузить файл (толстая модель, тонкий контроллер)
потому что они так объявлены в CActiveRecordBehavior
- resurtm
- Сообщения: 299
- Зарегистрирован: 2010.12.19, 09:13
- Откуда: Казахстан, Алма-Ата
- Контактная информация:
Re: Как загрузить файл (толстая модель, тонкий контроллер)
А вот в модели и вправду неправильно, что public, т.к. в CActiveRecord они protected. Сейчас оформлю всё это в PR.
UPD: таки в CActiveRecordBehavior все эти методы тоже protected.
UPD2: https://github.com/samdark/yiiframework ... ok/pull/13
UPD: таки в CActiveRecordBehavior все эти методы тоже protected.
UPD2: https://github.com/samdark/yiiframework ... ok/pull/13
Последний раз редактировалось resurtm 2012.12.02, 14:55, всего редактировалось 1 раз.