2012-07-20 37 views
1

我想刪除一張圖片並在更新視圖(yii)中重新顯示上傳的字段。通過AJAX刪除並顯示FileField

  1. 有其上載的圖像。
  2. 當用戶刪除這個圖像。
  3. 當時的圖像將刪除並上傳$form->filefield將出現在圖像的地方。

這是視圖

<div id="forAjaxRefresh"><img src="<?php echo $file; ?>" width="150px" /></div> 

<?php echo CHtml::ajaxLink('clickMe', array('ajax'), array('update'=>'#forAjaxRefresh'));?> 

這是控制器

public function actionAjax() 
    { 
     $model=new CompanyLicense('search'); 
     //$this->render('update', array('model'=>$model,'test'=>'test'), false, true); 
     //echo "$form->labelEx($model,'file_path'); 
     //$form->fileField($model,'file_path', array('class'=>'input-file')); 
     //$form->error($model,'file_path'); "; 
     //echo "$form->labelEx($model,'file_path')"; 

     echo 'OK'; 
    } 

當我試圖喜歡它。它在顯示'OK'。但我想顯示上傳文件字段。我怎麼辦?請幫幫我。

=============== +++++++++++++++++++++++++++++++ ====================================

最新的MVC

模型沒有什麼變化

控制器

public function actionAjax($id) 
    { 
     $model=new CompanyLicense(); 
     //$this->render('uploadfield', array()); 
     //echo "$form->labelEx($model,'file_path'); 
     //$form->fileField($model,'file_path', array('class'=>'input-file')); 
     //$form->error($model,'file_path'); "; 
     //echo "$form->labelEx($model,'file_path')"; 


     echo $this->renderPartial('uploadfield',array('model'=>$model),false,true); 

     /* 
     $model=Company::model()->findByPk($_GET['id']); 

     if($model){ 
      $file = '/images/'. $model->id . '/'. $model->file_path; 
      unlink(dirname(__FILE__) . '/../../..'.$file); 
     } 
     <br /> 
*/ 


    } 

視圖(_form.php這個)

<div class="form"> 

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'company-license-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); ?> 
    <div class="row"> 
     <?php echo $form->labelEx($model,'company_id'); ?> 
     <?php 
      $records = Company::model()->findAll(); 
      $list = CHtml::listData($records, 'id', 'name');    
     ?>  
     <?php echo $form->dropDownList($model,'company_id', $list, array('prompt'=>'Please select a Company')); ?> 

     <?php echo $form->error($model,'company_id'); ?> 
    </div> 
    <div class="row"> 
     <?php echo $form->labelEx($model,'license_no'); ?> 
     <?php echo $form->textField($model,'license_no',array('size'=>50,'maxlength'=>50)); ?> 
     <?php echo $form->error($model,'license_no'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'license_name'); ?> 
     <?php echo $form->textField($model,'license_name',array('size'=>60,'maxlength'=>200)); ?> 
     <?php echo $form->error($model,'license_name'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'annualfee'); ?> 
     <?php echo $form->textField($model,'annualfee',array('size'=>10,'maxlength'=>10)); ?> 
     <?php echo $form->error($model,'annualfee'); ?> 
    </div> 

    <div class="row"> 

     <?php echo $form->labelEx($model,'expire_date'); ?> 
     <?php 
      $this->widget('zii.widgets.jui.CJuiDatePicker', array(
       'name'=>'expire_date',  
       'model'=>$model, 
       'value' => $model->expire_date, 
       'options'=>array(
        'showAnim'=>'fold', 
        'dateFormat' => 'yy-mm-dd', 

       ), 
       'htmlOptions'=>array(
        'style'=>'height:20px;' 
       ), 
      )); 
      ?> 
     <p> Expire Date must be greater than Current Date.</p> 
     <?php echo $form->error($model,'expire_date'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'notification_days'); ?> 
     <?php echo $form->textField($model,'notification_days'); ?><p> Notification Days must be between 7 and 90.</p> 
     <?php echo $form->error($model,'notification_days'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'description'); ?> 
     <?php echo $form->textArea($model,'description',array('rows'=>6, 'cols'=>50)); ?> 
     <?php echo $form->error($model,'description'); ?> 
    </div> 


    <div class="row" id="file_upload"> 
    <?php 
     $file = '/images/'. $model->id . '/'. $model->file_path; 

     if (file_exists(dirname(__FILE__) . '/../../..'.$file)){ 
      echo '<img src="http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . $file.'" width="150px" />' ; 

     }else{ 
     ?> 
      <div class="row"> 
      <?php echo $form->labelEx($model,'file_path'); ?> 
      <?php echo $form->fileField($model,'file_path', array('class'=>'input-file')); ?> 
      <?php echo $form->error($model,'file_path'); ?> 
      </div> 
     <?php 
     } 
    ?> 
    </div>  

    <div id="forAjaxRefresh"><img src="http://<?php echo $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . $file; ?>" width="150px" /></div> 
    <div class="row buttons"> 
     <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?> 
    </div> 

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

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


<?php echo CHtml::ajaxLink('remove', array('ajax'), array('update'=>'#forAjaxRefresh')); ?> 


<?php 
echo CHtml::ajaxLink('delete', array('companylicense/ajax', 'id'=>$model->id), array('type'=> 'GET', 'update' => '#forAjaxRefresh')); 
?> 

<?php echo CHtml::ajaxLink('remove2', array('url'=>array('companylicense/ajax', 'id'=>$model->id), 
), array('update'=>'#forAjaxRefresh')); ?> 

視圖(uploadfield.php)

<?php $form=$this->beginWidget('CActiveForm', array(
     'id'=>'company-license-form', 
     'enableAjaxValidation'=>false, 
     'htmlOptions' => array('enctype' => 'multipart/form-data'), 
    )); ?> 
<?php echo $form->labelEx($model,'file_path'); ?> 
<?php echo $form->fileField($model,'file_path', array('class'=>'input-file')); ?> 
<?php echo $form->error($model,'file_path'); ?> 
<?php $this->endWidget(); ?> 

請幫幫我!

+0

是你能夠使其工作? – 2012-07-24 20:40:21

+0

是的,我的最後一個ans可以做到,我把你的echo CHtml :: Tag換成我的控制器。兩種解決方案都工作正常。 – 2012-07-25 05:04:00

回答

1

儘管它不是健康的心態勺子喂別人,但似乎你有麻煩很大。看到它非常非常簡單,你採取了複雜的方法。

按照步驟,你很好去。

View

<?php echo $form->labelEx($model,'full_version'); ?>     
<?php if($model->full_version == '') 
      echo $form->filefield($model,'full_version',array('style'=>'width:100%;')); 
     else 
     { 
      echo '<div id="file"><b>'.$model->full_version.'</b> '.CHtml::AjaxLink('Delete',CController::createUrl('removeFinalVersion',array('id'=>$model->id)),array('update'=>'#file')).'</div>'; 
     }?> 
<?php echo $form->error($model,'full_version'); ?> 

現在我們要做的是與文件上傳想到更換fileDiv。如果必須上傳比文件字段更多的字段,則可以使用單獨的文件並將其呈現在控制器和回顯中。但對於此演示,我正在考慮只返回一個項目。

所以當Ajax請求是由事物歸結爲actionRemoveFinalVersion,所有的談話需要做和的FileField必須返回

它看起來是這樣的

public function actionRemoveFinalVersion($id) 
    { 
      $user = Products::model()->findByPk($id); 
      if($user === null) 
       yii::app()->end(); 
      $user->full_version = ''; 
      $user->save(); 
      //return CHtml::activeFileField($model,'full_version',array('style'=>'width:100%;')); 
      echo CHtml::Tag('input', 
        array(
         'style'=>"width:100%;", 
         'name'=>"Products[full_version]" , 
         'id'=>"Products_full_version", 
         'type'=>"file")); 
    } 

集中在nameid的退回filefield。它需要精確,以便validation可以發生。 I am using this and it works。如果你做了正確的事情,那麼你應該如此。

還與AJAX玩就在Firefox中使用Firebug工具時,並在Chrome

+0

感謝您的快速回復。是的,你的理解是正確的,我想要的。但是你知道,我是yii的新手。你能告訴我更多細節嗎? thx – 2012-07-20 12:16:26

+0

我告訴你主要的方案,你給它一個嘗試,並告訴我:)如果它的工作與否 – 2012-07-20 12:41:24

+0

Afnan,這是我知道它的主要模式。文件上傳是好的,沒問題。 AjaxLink很好,它從控制器返回'OK'。當點擊ajaxlink時我可以刪除img。但我的問題是我不知道如何返回fileuploadfield來查看。所以請。 – 2012-07-21 09:10:02

0

我能解決它類似。 :d:d

型號沒有變化

視圖(_form.php這個)

<div class="row" id="file_upload"> 
    <?php 
     if ($model->id){ 
      $file = '/images/'. $model->id . '/'. $model->file_path; 
      echo '<div id="forAjaxRefresh">'; 
      echo '<img src="http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . $file.'" width="150px" />' ; 
      echo CHtml::ajaxLink('remove', array('delimg', 'id'=>$model->id), array('update'=>'#forAjaxRefresh')); 
      echo '</div>'; 

     }else{ 
     ?> 
      <div class="row"> 
      <?php echo $form->labelEx($model,'file_path'); ?> 
      <?php echo $form->fileField($model,'file_path', array('class'=>'input-file')); ?> 
      <?php echo $form->error($model,'file_path'); ?> 
      </div> 
     <?php 
     } 
    ?> 
    </div> 

視圖(uploadfield.php)

<?php echo CHtml::label('File', 'Application_word_report'); ?> 
<?php echo CHtml::fileField('CompanyLicense[file_path]', ''); ?> 

控制器

public function actionDelimg() 
{ 
    $model=CompanyLicense::model()->findByPk($_GET['id']); 

    $file = '/images/'. $model->id . '/'. $model->file_path; 
    if(file_exists(dirname(__FILE__) . '/../..'.$file)) 
     unlink(dirname(__FILE__) . '/../..'.$file); 

    $this->renderPartial('uploadfield',array('model'=>$model),false,true); 
} 

public function actionUpdate($id) 
    { 
     $model=$this->loadModel($id); 
     if(isset($_POST['CompanyLicense'])) 
     { 
      $model->attributes=$_POST['CompanyLicense']; 
      $currentTime = date('Y-m-d h:i:s', time());        
      $model->updated = $currentTime; 
      $model->active = 1; 

      $model->file_path=CUploadedFile::getInstance($model,'file_path'); 

      $folder = Yii::getPathOfAlias('webroot').'/images/'; 
         if($model->save()) 
         { 
       $model->file_path->saveAs($folder. $model->id . "/" . $model->file_path); 
       // redirect to success page 

       $this->redirect(array('view','id'=>$model->id)); 
         } 
     } 

     $this->render('update',array(
      'model'=>$model, 
     )); 
    }