2016-08-08 21 views
1

In diesem Update Aktionscode speichern Daten und upadte Bild auf Ordner aktualisieren, aber nicht ein andere Tabelle tabl4e Bild, wie mehr Bilder zu aktualisieren, die nur in verschiedener Tabelle einzige Aktion in yii2

public function actionUpdate($id) 
{ 
    $model = $this->findModel($id); 

    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
     if ($model->validate()) { 
      $model->save(); 
      $cid = $model->id; 

      if (isset($_FILES['attr_name']['tmp_name'])) { 
       $photos = UploadedFile::getInstancesByName('attr_name'); 
       $imgName = array(); 
       if (isset($photos) && count($photos) > 0) { 
        $DD = 0 ; 

        foreach ($photos as $image => $pic) { 

         $imagepath = Yii::getAlias('@image').'/'; 
         $imageFileName = rand(10, 100).$pic->name; 
         $imageFile = $imagepath.$imageFileName; 
         if ($pic->saveAs($imageFile)) { 
          $imgName[] = $imageFileName; 
         } else { 
          //echo 'Cannot upload!'; 
         } 

         $Image = new Image(); 
         $Image->c_id = $cid; 
         $Image->image = $imageFileName; 
         $img = $Image->image; 

         if (isset($_POST['deletedImg'])) { 
          $pics = $_POST['deletedImg']; 

          foreach ($pics as $img1) { 
           $image = $img1; 
           unlink(Yii::getAlias('@image').'/'.$image); 
          } 
         } else { 
          $Image->image = $img; 
         } 

         if ($Image->validate()) { 
          $Image->save(); 
         } else { 
          print '<pre>'; 
          print_r($Image->errors); 
          exit; 
         } 
         unset($Image); 
        } 
       } 

       return $this->redirect(['view', 'id' => $model->id]); 
      } 
     } else { 
      return $this->render('create', [ 
         'model' => $model, 
        ]); 
     } 
    } else { 
     return $this->render('update', [ 
      'model' => $model, 
     ]); 
    } 
} 

jQuery

Aktualisierung

In diesem Code wird mehrere Dateien Schaltfläche und speichern und löschen mehrere Bilder, ich bekomme Image ID löschen, wie diese ID auf Update-Aktion verwenden, habe ich keine Ahnung.

$(".removeBtn").click(function(event){ 
    var img =$(this).attr("data-id"); 
    var id = $(this).attr('id'); 
    var hiddenfield= '<input type="hidden" value="'+img+'" name="deletedImg[]" id=""/>'; 
    $("#deleted-img").append(hiddenfield); 
    $(this).parent().parent().remove(); 
}); 
$(".btnAddRec").click(function(){ 
    var clonedHTML = $("#fieldsRow").html(); 
    clonedHTML = clonedHTML.replace("<!--BUTTON-->",'<button type="button" class="removeBtn btn btn-xs btn-danger"><i class="glyphicon glyphicon-trash"></i> Delete</button>'); 
    $("#cloned").append('<div class="row" id="fieldsRow">'+clonedHTML+'</div>'); 
    $(".removeBtn").click(function(event){ 
    $(this).parent().parent().remove(); 
}); 
$("#cloned #fieldsRow:last-child input ").val(''); 
}); 

Antwort

1
public function actionUpdate($id) 
{ 
    $model = $this->findModel($id); 

    if ($model->load(Yii::$app->request->post())) { 
     if($model->validate()) 
     { 
      $model->save(); 
      $cid = $model->id; 
      $Image = Image::find()->where(['c_id' => $cid])->asArray()->all(); 

      if(!empty($Image)){ 
       if(isset($_FILES['attr_name']['tmp_name']) > 0){ 
        if(isset($_POST['deletedImg'])) 
         { 
          $pics = $_POST['deletedImg']; 
          // echo "<pre>";print_r($pics);exit; 
          foreach($pics as $img1) 
          { 
           $image = $img1; 
           unlink(Yii::getAlias('@image').'/'.$image); 
          } 

          $connection = \Yii::$app->db; 
          $delRec = $connection->createCommand(" delete image FROM image WHERE image='$image'"); 
          $delRecExec = $delRec->query(); 
         } 
        $photos = UploadedFile::getInstancesByName('attr_name'); 
        $imgName = array(); 
        if(isset($photos) && count($photos) > 0) 
        { 

         foreach ($photos as $image => $pic) { 

         $imagepath = Yii::getAlias('@image').'/'; 
         $imageFileName = rand(10,100).$pic->name; 
         $imageFile = $imagepath.$imageFileName; 
         if ($pic->saveAs($imageFile)) 
         { 
          $imgName[] = $imageFileName; 
         } 
         else 
         { 
          //echo 'Cannot upload!'; 
         } 
          $Image = new Image(); 
          // print_r($Image);exit; 
          $Image->c_id = $cid; 
          $Image->image = $imageFileName; 
          $img = $Image->image; 

          if($Image->validate()){ 
          $Image->save(); 
          }else{ 
           print '<pre>';print_r($Image->errors); 
           exit; 
          } 
          unset($Image); 
         } 
        } 

        return $this->redirect(['view', 'id' => $model->id]); 
       } 


      } 
     } 
     else 
     { 
      return $this->render('create', [ 
         'model' => $model, 
        ]); 
     } 
    } else { 
     return $this->render('update', [ 
      'model' => $model, 
     ]); 
    } 
} 
0

Sie sollten wirklich anfangen, Ihren Code zuerst zu refactoring.

Zum Beispiel versuchen Sie, Bilder in der Schleife zu löschen, in denen Sie jedes Mal über hochgeladene Bilder iterieren; Haben Sie mehrere Zuweisungen für den Bilddateinamen zu Bildmodellattributen und umgekehrt, nicht verwendete Variablen ($DD?) und wahrscheinlich mehr.

Aber ich würde empfehlen, dass Sie zuerst die offizielle Dokumentation betrachten. Es gibt sogar ein Codebeispiel für genau diesen Anwendungsfall:

Uploading Multiple Files

Hohe Ansatz: Erstellen Sie ein dediziertes Mehrere Bilder-Upload-Formular (ein Modell), und fügen Sie alle Upload-Logik hier.

aus dem Beispiel kopiert:

Modell UploadForm

namespace app\models; 

use yii\base\Model; 
use yii\web\UploadedFile; 

class UploadForm extends Model 
{ 
    /** 
    * @var UploadedFile[] 
    */ 
    public $imageFiles; 

    public function rules() 
    { 
     return [ 
      [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4], 
     ]; 
    } 

    public function upload() 
    { 
     if ($this->validate()) { 
      foreach ($this->imageFiles as $file) { 
       $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension); 
      } 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

Ansicht (HTML-Formular) bearbeiten Ad Ihre jQuery-Skripte

<?php 
use yii\widgets\ActiveForm; 
?> 

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> 

    <?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?> 

    <button>Submit</button> 

<?php ActiveForm::end() ?> 

Ihre actionUpload im Controller:

namespace app\controllers; 

use Yii; 
use yii\web\Controller; 
use app\models\UploadForm; 
use yii\web\UploadedFile; 

class SiteController extends Controller 
{ 
    public function actionUpload() 
    { 
     $model = new UploadForm(); 

     if (Yii::$app->request->isPost) { 
      $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles'); 
      if ($model->upload()) { 
       // file is uploaded successfully 
       return; 
      } 
     } 

     return $this->render('upload', ['model' => $model]); 
    } 
} 
+0

Dank aber dieser Code kann es nicht funktionieren‘ –

+0

In diesem Fall sollten Sie wirklich das Debuggen tiefer in Ihrer Anwendung starten; Stellen Sie sicher, dass die veröffentlichten FORM-Daten tatsächlich dem entsprechen, was Sie erwarten. Der Code-Inspektor des Browsers ist ein guter Anfang, ebenso wie die Ausgabe der Ablaufverfolgung in 'runtime/logs.app.log', wobei Ihre Debug-Ebene auf 'Verbose' oder 'Trace' gesetzt ist. – jlapoutre