2012-08-02 57 views
1

问题1:表单提交不起作用。yii ajax xupload表单提交不起作用

Q2:如何限制上传文件(例如,1 - 5分档只)

状态:创建具有AJAX上传表单xupload

我的模型(fadepreciation.php)

public function afterSave() { 
     $this->addImages(); 
     parent::afterSave(); 
    } 

    public function addImages() { 
     //If we have pending images 
     if(Yii::app()->user->hasState('images')) { 
      $userImages = Yii::app()->user->getState('images'); 
      //Resolve the final path for our images 
      $path = Yii::app()->getBasePath()."/../images/uploads/{$this->id}/"; 
      //Create the folder and give permissions if it doesnt exists 
      if(!is_dir($path)) { 
       mkdir($path); 
       chmod($path, 0777); 
      } 

      //Now lets create the corresponding models and move the files 
      foreach($userImages as $image) { 
       if(is_file($image["path"])) { 
        if(rename($image["path"], $path.$image["filename"])) { 
         chmod($path.$image["filename"], 0777); 
         $img = new Image(); 
         $img->size = $image["size"]; 
         $img->mime = $image["mime"]; 
         $img->name = $image["name"]; 
         $img->source = "/images/uploads/{$this->id}/".$image["filename"]; 
         $img->somemodel_id = $this->id; 
         if(!$img->save()) { 
          //Its always good to log something 
          Yii::log("Could not save Image:\n".CVarDumper::dumpAsString( 
           $img->getErrors()), CLogger::LEVEL_ERROR); 
          //this exception will rollback the transaction 
          throw new Exception('Could not save Image'); 
         } 
        } 
       } else { 
        //You can also throw an execption here to rollback the transaction 
        Yii::log($image["path"]." is not a file", CLogger::LEVEL_WARNING); 
       } 
      } 
      //Clear the user's session 
      Yii::app()->user->setState('images', null); 
     } 
    } 

我的视图(_form.php这个)

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

    <p class="note">Fields with <span class="required">*</span> are required.</p> 

    <?php echo $form->errorSummary($model); ?> 
<!-- Other Fields... --> 
     <div class="row"> 
      <?php echo $form->labelEx($model,'photos'); ?> 
      <?php 
      $this->widget('xupload.XUpload', array(
       'url' => Yii::app()->createUrl("/fadepreciation/upload"), 
       //our XUploadForm 
       'model' => $photos, 
       //We set this for the widget to be able to target our own form 
       'htmlOptions' => array('id'=>'fa-depreciation-form'), 
       'attribute' => 'file', 
       'multiple' => true, 
       //Note that we are using a custom view for our widget 
       //Thats becase the default widget includes the 'form' 
       //which we don't want here 
       //'formView' => 'application.views.faDepreciation._form', 
       )  
      ); 
      ?> 
     </div> 
    <div class="row buttons"> 
     <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?> 
    </div> 

<?php $this->endWidget(); ?> 

</div><!-- form --> 

我的控制器(fadepreciation.php)

public function actionCreate() 
    { 
     $model=new FaDepreciation; 
     Yii::import("xupload.models.XUploadForm"); 
     $photos = new XUploadForm; 
     // Uncomment the following line if AJAX validation is needed 
     // $this->performAjaxValidation($model); 

     if(isset($_POST['FaDepreciation'])) 
     { 
      //Assign our safe attributes 
      $model->attributes=$_POST['FaDepreciation']; 
      //Start a transaction in case something goes wrong 
      $transaction = Yii::app()->db->beginTransaction(); 
      try { 
       //Save the model to the database 
       if($model->save()){ 
        $transaction->commit(); 
        $this->redirect(array('view','id'=>$model->id)); 
       } 
      } catch(Exception $e) { 
       $transaction->rollback(); 
       Yii::app()->handleException($e); 
      } 
      if($model->save()) 
       $this->redirect(array('view','id'=>$model->id)); 
     } 

     Yii::import("xupload.models.XUploadForm"); 
     $photos = new XUploadForm; 
     $this->render('create',array(
      'model'=>$model, 
      'photos'=>$photos, 
     )); 

    } 
public function actionUpload() // From xupload nothing change 

回答

0

提交表单的问题是什么?

是可以完成文件限制。请确保您遵循这些要求http://www.yiiframework.com/wiki/348/xupload-workflow/

+0

我跟着xupload的wiki。文件上传是好的,它正在工作。但是当我点击提交按钮时,没有任何操作,也没有任何显示错误。我认为文件限制是'multiple'=> true,'multiple'=> false,对吧?但我想限制1-5个文件上传。我可以在哪里设置? – 2012-08-02 12:23:18

1

您需要做的是创建一个自定义表单。 复制xupload _form中的内容并粘贴它,删除开始表单 - 结束表单。 在自定义窗体中添加到您的窗口小部件'formView'中。

0

Q1:由于XUpload小部件生成自己的表单标签,表单子表单不起作用。所以你生成的HTML有另一种形式的形式embebed,你应该使用widget的formView选项指向不具有表单标签视图,如xupload workflow wiki

Q2描述:你应该在widget使用maxNumberOfFiles选项配置

这一切都应该是这样的:

<?php 
      $this->widget('xupload.XUpload', array(
       'url' => Yii::app()->createUrl("/fadepreciation/upload"), 
       //our XUploadForm 
       'model' => $photos, 
       //We set this for the widget to be able to target our own form 
       'htmlOptions' => array('id'=>'fa-depreciation-form'), 
       'attribute' => 'file', 
       'multiple' => true, 
       //Note that we are using a custom view for our widget 
       //Thats becase the default widget includes the 'form' 
       //which we don't want here 
       'formView' => 'application.views.faDepreciation._form', 
       'options' => array('maxNumberOfFiles' => 5) 
       )  
      ); 
      ?> 
0

只要使用 'showForm' 参数如下:

<?php 
$this->widget('xupload.XUpload', array(
    ... 
    'showForm' => false, 
    ... 
)); 
?> 

也许,这个选项已经添加到xupload的下一个版本中。

0

我知道这是一个旧帖子,但也许这个答案会帮助别人解决这个问题。

我发现它是由文件/xupload/views/form.php中的最后一行引起的(使用默认设置)。它看起来像if语句在某种程度上正好相反......在挖掘中,为了假值,它正在渲染代码。例如:

<?php 
echo $this->showForm; 
if($this->showForm) echo CHtml::endForm(); 
echo $this->showForm; 
?> 

回报: weirg output

也许我失去了一些东西,但它看起来有点怪不是吗?