Как загрузить файл (толстая модель, тонкий контроллер)

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Аватара пользователя
resurtm
Сообщения: 299
Зарегистрирован: 2010.12.19, 09:13
Откуда: Казахстан, Алма-Ата
Контактная информация:

Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение resurtm »

Новый рецепт: http://yiiframework.ru/doc/cookbook/ru/ ... .fat.model

Тема предназначена для обсуждения рецепта и ссылка на неё указана в рецепте.
Последний раз редактировалось resurtm 2012.07.02, 05:13, всего редактировалось 1 раз.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение slavcodev »

Так не красивее?

Код: Выделить всё

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: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение slavcodev »

// валидируем вручную, потому как изменить метод 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: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение samdark »

Влил на сайт.
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение SpiLLeR »

Фраза: "Так, например, мы не учли ситуацию, когда две разные модели могут иметь два файла с одним и тем-же файлом." кажется взрывает мозг). Наверное два файла с одинаковым именем.

В поведении beforeDelete() не чего не должен возвращать? типа boolean? И я бы удалял файлы в afterDelete(), хотя это уже больше логика приложения.

Еще бы неплохо как-то обозначить момент проверки существования\создания папки где хранятся файлы и на отсутствие кинуть исключение. Я понимаю, что это мб выходит за пределы рецепта, но это по моему неотъемлемая часть.

З.Ы. Странно что есть такой классный метод: getValidatorList(), а для relations такого нет =/
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
resurtm
Сообщения: 299
Зарегистрирован: 2010.12.19, 09:13
Откуда: Казахстан, Алма-Ата
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение resurtm »

Да, спасибо за замечания, на днях поправлю. :-)
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение slavcodev »

SpiLLeR писал(а):З.Ы. Странно что есть такой классный метод: getValidatorList(), а для relations такого нет =/
Почему нет :mrgreen:

Код: Выделить всё

$model = Post::model();
$model->metaData->addRelation('comments', array(
    ActiveRecord::HAS_MANY, 'Comment', 'postId',
)); 
Жду Yii 3!
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение SpiLLeR »

Во спасибо, а я свой велосипед написал.
З.Ы. класса ActiveRecord в ий нет или опять чего не досмотрел...)
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение slavcodev »

нет, извини, это я по привычке у меня свой расширенный ActiveRecord )
Жду Yii 3!
Аватара пользователя
mihan007
Сообщения: 31
Зарегистрирован: 2011.01.28, 11:05
Откуда: Санкт-Петербург
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение mihan007 »

https://github.com/phpnode/YiiBlocks/tr ... /resources - мне вот эта штука по душе, а в частности AResourceful. Идея - внутри модели определяются виртуальные атрибуты - ресурсы. В качестве ресурса может выступать один или несколько файлов. Их загрузка и удаление происходит фактически при массовом присвоении аттрибутов ($model->attributes) и удалении модели соответственно. Кому нужна миграция для создания таблицы под неё - пишите в ЛС.
с уважением,
Куклин Михаил

контакты: +79313601666 | mihan007@ya.ru | https://paradox777.ru
Аватара пользователя
MetalGuardian
Сообщения: 208
Зарегистрирован: 2011.03.06, 02:42
Откуда: Киев

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение MetalGuardian »

нашел небольшой баг в загрузке файла используя поведение:
валидатор вешается только на указанные сценарии, но файлы заливаются в любом случае.
то есть если сценария нет в списке, то можно залить любой файл.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение ElisDN »

MetalGuardian писал(а):если сценария нет в списке, то можно залить любой файл.
Это не совсем уж и баг, а больше специфика работы с файлами в PHP. Просто файлы не через атрибуты передаются и в $_POST отсутствуют. Влиять на элементы массива $_FILES исходя из правил валидации фреймворк не способен. Валидатор CFileValidator - это, можно сказать, некий фиктивный костыль с побочным действием.
Аватара пользователя
MetalGuardian
Сообщения: 208
Зарегистрирован: 2011.03.06, 02:42
Откуда: Киев

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение MetalGuardian »

это проблема не пхп.
тут дело в чем: валидатор навешивается только в случае соответствия сценариев, а сохранение происходит в любом случае.
нужна такая же проверка на нужный сценарий и в методе beforeSave - тогда не будет сохранения.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение ElisDN »

Ну это самому можно в своей модели добавить проверку на сценарий

Код: Выделить всё

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;
    } 
}
 
Просто мне не очень понятно, как при инкапсуляции этой проверки в поведение оно получит список сценариев. Хотя можно либо $this->owner->rules() вручную парсить, либо в параметре поведения список сценариев задавать.
Последний раз редактировалось ElisDN 2012.11.06, 14:43, всего редактировалось 1 раз.
Аватара пользователя
MetalGuardian
Сообщения: 208
Зарегистрирован: 2011.03.06, 02:42
Откуда: Киев

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение MetalGuardian »

в поведение и так передаются сценарии в которых должна быть загрузка.
я говорю лишь что нужна проверка в двух местах
Аватара пользователя
resurtm
Сообщения: 299
Зарегистрирован: 2010.12.19, 09:13
Откуда: Казахстан, Алма-Ата
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение resurtm »

В принципе, поправить может любой, сделав pull request вот тут: https://github.com/samdark/yiiframework_ru_cookbook :)
Сегодня вечером поправлю. Спасибо, что указали на недочёт.
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение agrail »

Не очень понятно, почему beforeSave и beforeDelete в поведении являются public-методами
Аватара пользователя
MetalGuardian
Сообщения: 208
Зарегистрирован: 2011.03.06, 02:42
Откуда: Киев

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение MetalGuardian »

потому что они так объявлены в CActiveRecordBehavior
Аватара пользователя
resurtm
Сообщения: 299
Зарегистрирован: 2010.12.19, 09:13
Откуда: Казахстан, Алма-Ата
Контактная информация:

Re: Как загрузить файл (толстая модель, тонкий контроллер)

Сообщение resurtm »

А вот в модели и вправду неправильно, что public, т.к. в CActiveRecord они protected. Сейчас оформлю всё это в PR. :)

UPD: таки в CActiveRecordBehavior все эти методы тоже protected. :D

UPD2: https://github.com/samdark/yiiframework ... ok/pull/13
Последний раз редактировалось resurtm 2012.12.02, 14:55, всего редактировалось 1 раз.
Ответить