CJuiDialog и загрузка файла

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
X-Loading
Сообщения: 26
Зарегистрирован: 2011.11.15, 14:55

CJuiDialog и загрузка файла

Сообщение X-Loading »

Всем привет,

использую в своём первом Yii-проекте расширение EUpdateDialog, которое базируется на CJuiDialog, и всё вроде нормально работает кроме одного момента: загрузки файла в create/update экшенах через модальный диалог.
Код формы:

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

<?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'product-form',
        'enableAjaxValidation'=>false,
        'htmlOptions'=>array('enctype'=>'multipart/form-data'),
)); ?>

        .....................................

        <div class="row">
                <?php echo $form->labelEx($model,'uploadedFile'); ?>
                <?php echo CHTML::activeFileField($model,'uploadedFile'); ?>
                <?php echo $form->error($model,'uploadedFile'); ?>
        </div>

        <div class="row buttons">
                <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
        </div>

<?php $this->endWidget(); ?>
Код контроллера:

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

public function actionCreate()
        {
                $model=new Product;

                // Uncomment the following line if AJAX validation is needed
                // $this->performAjaxValidation($model);

                if(isset($_POST['Product']))
                {
                        $model->attributes=$_POST['Product'];
                        
                        // \/ Process image \/
                        $model->uploadedFile=CUploadedFile::getInstance($model,'uploadedFile');
                        $image = Yii::app()->image->load($model->uploadedFile->tempName);
                        $imageName = $model->genImageName();
                        $image->resize(200, 200, IMAGE::AUTO)->quality(75)->sharpen(20);
                        $image->save(CHtml::normalizeUrl(Yii::getPathOfAlias('webroot').'/images/products/large/'.$imageName), False);
                        $image->resize(100, 100, IMAGE::AUTO)->quality(75)->sharpen(20);
                        $image->save(CHtml::normalizeUrl(Yii::getPathOfAlias('webroot').'/images/products/small/'.$imageName), False);
                        $model->largepic = CHtml::normalizeUrl(Yii::getPathOfAlias('webroot').'/images/products/large/'.$imageName);
                        $model->smallpic = CHtml::normalizeUrl(Yii::getPathOfAlias('webroot').'/images/products/small/'.$imageName);
                        // /\ Process image /\
                        
                        if($model->save())      {
                                if( Yii::app()->request->isAjaxRequest )
                                {
                                // Stop jQuery from re-initialization
                                Yii::app()->clientScript->scriptMap['jquery.js'] = false;
                                echo CJSON::encode( array(
                                  'status' => 'success',
                                  'content' => 'ModelName successfully updated',
                                ));
                                exit;
                            }
                            else        {
                                        $this->redirect(array('view','id'=>$model->id));
                            }
                        }
                }

                if( Yii::app()->request->isAjaxRequest )
                {
                  // Stop jQuery from re-initialization
                  Yii::app()->clientScript->scriptMap['jquery.js'] = false;
                
                  echo CJSON::encode( array(
                    'status' => 'failure',
                    'content' => $this->renderPartial( '_form', array(
                    'model' => $model ), true, true ),
                  ));
                  exit;
                }
                else    {
                        $this->render('create',array(
                                'model'=>$model,
                        ));
                }
        }
Не через диалог экшн отлично отрабатывает, картинка загружается и обрабатывается расширением Image, как и требуется.
А через диалог получаю:

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

<p>image file not found (Z:\home\stroyka\www\protected\extensions\image\Image.php:78)</p><pre>#0 Z:\home\stroyka\www\protected\extensions\image\CImageComponent.php(41): Image->__construct(NULL, Array)
#1 Z:\home\stroyka\www\protected\controllers\ProductController.php(75): CImageComponent->load(NULL)
#2 Z:\home\stroyka\www\yii\framework\web\actions\CInlineAction.php(50): ProductController->actionCreate    
Инвестигирование показало, что это происходит по причине того, что $model->uploadedFile в экшене пустой.

Не подскажете, в чём может быть проблема?
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: CJuiDialog и загрузка файла

Сообщение esche »

Загрузка файла через ajax? фрейм?
...
X-Loading
Сообщения: 26
Зарегистрирован: 2011.11.15, 14:55

Re: CJuiDialog и загрузка файла

Сообщение X-Loading »

Привет,

На данный момент у меня в форме просто ActiveFileField, который отлично отрабатывает, когда экшн вызывается не через Ajax. Получается, что использование такого способа просто невозможно при Ajax-запросе?

Я видел, что в контексте CJuiDialog часто говорят о EAjaxUpload, но мне этот вариант не очень нравится, так как слишком усложнит код - в моем случае я просто хочу загружать вместе с моделью продукта картинку и сохранять в атрибутах модели пути к ее resized версиям.

Заранее спасибо за помощь!
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: CJuiDialog и загрузка файла

Сообщение esche »

Загрузка файла через ajax без "хитростей" (пока?) не работает. По сути варианта 2 - фрейм или флэш. Оба обвешиваются плюшками - есть готовые решения/библиотеки.
...
Ответить