[v0.3] File Upload Action

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

[v0.3] File Upload Action

Сообщение slavcodev »

Очень часто в приложении приходиться загружать файлы, это и WYSIWYG-редакторы, фото, аватары. Вообщем примеров много.
Уже писал рецепт что в Yii есть такая замечательная возможность выносить действия контроллера в отдельные классы, чтоб использовать повторно в разных случаях.

В сочетании с несколькими другими прелестями framework'a (Events, Evaluate Expression), было написано действие загрузки файла.
Не раз использовалось в проектах, но уже не давно не менял его, т.к. не нахожу чтобы еще понадобилось для загрузке файла.
Выслушал бы с удовольствием, что еще может понадобиться в будущих проектах.

смотрим или забираем в репозитарии yiiext

Боевой пример используется вместе с EImperaviRedactorWidget и EUploadifyWidget

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

    'upload'=>array(
        'class'=>'ext.yiiext.actions.fileUpload.EFileUploadAction',
        'name'=>'file',
        'path'=>Yii::getPathOfAlias('webroot').'/files/'.Yii::app()->getController()->getId().'/'.date('Y-m-d'),
        'createDirectory'=>true,
        'filenameRule'=>'md5($file->name).".".$file->extensionName',
        'onAfterSave'=>function($event)
        {
            echo $event->sender->path.'/'.$event->sender->filename;
            exit;
        },
    ),
    'uploadify'=>array(
        'class'=>'ext.yiiext.actions.fileUpload.EFileUploadAction',
        'model'=>'UserModel',
        'attribute'=>'photo',
        'path'=>Yii::getPathOfAlias('webroot').'/files/'.Yii::app()->getController()->getId().'/'.date('Y-m-d'),
        'createDirectory'=>true,
        'filenameRule'=>'md5($file->name).".".$file->extensionName',
        'onAfterSave'=>function($event)
        {
            echo $event->sender->path.'/'.$event->sender->filename;
            exit;
        },
    ),
 

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

class UserModel extends CFormModel
{
    public $photo;

    public function rules()
    {
        return array(
            array(
                'photo','file',
                //'maxSize'=>1024*1024*1024,
                'types'=>'jpg,png,gif',
            ),
        );
    }
} 
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: File Upload Action

Сообщение Ekstazi »

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

Re: File Upload Action

Сообщение slavcodev »

не смотрел, сейчас глянул ужаснулся ))) и что это все где-то используется? :D
если ты про это
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

первый сразу же вопрос зачем там сам процесс аплауда сделан если есть уже CUploadFile ?
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: File Upload Action

Сообщение Ekstazi »

Не, я про elrteWidget, а тот бред не мой, а авторов виджета. Но в браузере отлично выглядит и удобно работает ;)
http://code.google.com/p/yiiext/source/ ... .txt?r=332
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

а причем тут твой виджет к этому действию? твой виджет умеет загружать файлы?
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: File Upload Action

Сообщение Ekstazi »

Да + файл браузер + много чего :) Вообщем смотри тут: http://elrte.org/elfinder/demo
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Макс, я знаю что такое elfinder, я не понимаю как виджет, который отвечает за вывод в браузер может грузить файлы.
Загрузкой файлов занимается контроллер и его действие. В твоем расширении это ElFinderAction который является оберткой elFinder.class, так вот там каша.

Мне не нужен "Файловый менеджер" чтоб загрузить файлы во многих случаях.
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: File Upload Action

Сообщение Ekstazi »

Я сделал поле ввода файла, на который цепляется этот виджет и позволяет загрузить файл, отредактировать его и так далее, обычное поле на форме. Но ты прав, для простейших случаев это не нужно и твой вариант удобней. Когда же необходимо допустим отредактировать размеры загруженного файла, то мой способ больше подходит.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Ekstazi писал(а):то мой способ больше подходит.
для тебя ))), для меня же повесить на мой экшн ивент в одну строчку.
манипуляции с файлами которые умеет elfinder мне не к чему.
Жду Yii 3!
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: File Upload Action

Сообщение porcelanosa »

Извините, я, конечно, понимаю, что это наглость, и что Вы все и так уже разжевали. :oops:
Но не могли бы Вы выложить архивчик с полностью работающим примером:
Ну т.е. все файлы (модель, контроллер, вью, возможно конфиг - экстеншен, я сама скачаю), чтобы можно было развернуть и пощупать, а то не могу разобраться...
Заранее огромное спасибо!
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

все файлы чего? как связка работает EUploadifyWidget+EFileUploadAction?
Жду Yii 3!
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: File Upload Action

Сообщение porcelanosa »

mc-bear писал(а):все файлы чего? как связка работает EUploadifyWidget+EFileUploadAction?
Да, Ну то что называется боевой пример - но только чтобы можно было развернуть у себя и пощупать. Если не сложно, конечно :) Сами расширения, конечно не нужны, но если Вам так проще будет, допустим заархивировать сразу все, то, думаю, ничего страшного.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

добавил к первому посту
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Действие обновлено. Исправлено:
- добавлены сетеры для пути и имени файла, теперь их можно менять в beforeSave событии
- убрано свойство exitOnAjax, данную возможность можно добиться через afterSave событие
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

Сорри, но не могу понять, почему в новой версии проверка директории происходит в getPath? Мне кажется это не совсем логично?
Допустим я в своём событии onBeforeSave хочу сначала получить текущую директорию и добавить к ней пару фолдеров.

Выходит следующая логика:

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

 onBeforeSave -> function makePath(){   $event->sender->setPath($event->sender->getPath().'/x/y/z'); } 
далее в коде Действия ещё раз запускается getPath():

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

 $filepath=rtrim($this->getPath(),'/').'/'.$this->getFilename(); 
Выходит двойная проверка. Может стоит всё-таки сделать это (проверка и создание директории) один раз после onBeforeSave?

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

Re: File Upload Action

Сообщение slavcodev »

serzhiio писал(а):Сорри, но не могу понять
Объясню подробнее, для меня событие beforeSave происходит именно до сохранения, т.е. путь и имя файла в этом событие уже должно быть валидным.
Поэтому ставить проверку пути после события мне кажется логичным.
Наши мнения расходятся, ввиду того что у нас разные задачи.

Да и в твоем примере я не понимаю чем плохо что будет две проверки и откуда может появится лишние папки?

ПС: Может еще у кого-то есть мысли?
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

Суть в том, что можно несколько раз запустить getPath(), а при указанном createDirectory=TRUE, можно несколько раз создать разные директории, хотя я, допустим, используя getPath(), хочу только достать её, а сама функция пытается ещё и создать ту, которая уже есть во внутренней переменной?
Выходит, что при любом раскладе, если я вызываю getPath, то она создаёт директорию (проверка фиг с ней, здесь никакой проблемы нет), но создание, как я думаю, должно происходить только один раз, когда уже 100% никто ничего менять не будет.

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

Re: File Upload Action

Сообщение slavcodev »

Ты прав. Вот именно поэтому я сначала и создавал папку в run(), но тогда мы возвращаемся в то место откуда начинали.
Но часто ли приходится вызывать getPath() и вообще если ты вызываешь getPath() значит тебе нужна папка которая в ней указана или нет?
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

Естественно, используя getPath() я хочу получить "дефолтную папку" и потом прикрутить к ней нужные директории, например: /upload -> /upload/event/1/images

P.S.: Мне кажется, что для манипуляций с путём достаточно public переменной path, она элементарно через $event-sender->path правится как хочешь

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

$event-sender->path .= '/event/1/images';
 
а вот проверку и, при необходимости, создание сделать после beforeSave, думаю, это идеальный вариант.
Ответить