2016-07-30 10 views
1

Ich generierte ein Modell mit Gii aus einer Datenbanktabelle in yii2. Dieses Modell erbt von ActiveRecord. Dann habe ich ein Formular von diesem Model erstellt. Nun möchte ich eine Datei mit diesem Formular hochladen. ist es möglich, eine Datei mit demselben Modell (das von ActiveRecord erbt) hochzuladen?ist es möglich, eine Datei in einem Modell hochzuladen, das von ActiveRecord in yii2 erbt?

wenn ja, wie? wenn nein, was kann ich tun?

+0

aktualisieren Sie Ihre Frage und zeigen Sie Ihr verwandtes Modell, Controller/Aktion und anzeigen – scaisEdge

Antwort

0

Ja, es ist möglich, aber die Verwendung eines separaten Formulars ist eine bessere Vorgehensweise. Es ist gut in der offiziellen Dokumentation in Artikeln beschrieben Uploading files

eigenes Formular erstellen:

namespace app\models; 

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

class UploadForm extends Model 
{ 
    /** 
    * @var UploadedFile 
    */ 
    public $imageFile; 

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

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

Datei Eingang Render:

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

    <?= $form->field($model, 'imageFile')->fileInput() ?> 

    <button>Submit</button> 

<?php ActiveForm::end() ?> 

anpassen Steuerung von Dateiuploads Griff:

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->imageFile = UploadedFile::getInstance($model, 'imageFile'); 
      if ($model->upload()) { 
       // file is uploaded successfully 
       return; 
      } 
     } 

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

Das Hochladen mehrerer Dateien wird ebenfalls in diesem Artikel behandelt.

Siehe auch this related question.

Wenn Sie es mit ActiveRecord verwenden und Dateipfad als Modellattribut speichern möchten, können Sie in upload() Methode des Formulars Modell erstellen und speichern. Ein weiteres gutes Beispiel für Arbeiten mit Formularen ist SignupForm von Advanced Vorlage:

<?php 

namespace frontend\models; 
use yii\base\Model; 
use common\models\User; 

/** 
* Signup form 
*/ 
class SignupForm extends Model 
{ 
    public $username; 
    public $email; 
    public $password; 


    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      ['username', 'trim'], 
      ['username', 'required'], 
      ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'], 
      ['username', 'string', 'min' => 2, 'max' => 255], 
      ['email', 'trim'], 
      ['email', 'required'], 
      ['email', 'email'], 
      ['email', 'string', 'max' => 255], 
      ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'], 
      ['password', 'required'], 
      ['password', 'string', 'min' => 6], 
     ]; 
    } 

    /** 
    * Signs user up. 
    * 
    * @return User|null the saved model or null if saving fails 
    */ 
    public function signup() 
    { 
     if (!$this->validate()) { 
      return null; 
     } 

     $user = new User(); 
     $user->username = $this->username; 
     $user->email = $this->email; 
     $user->setPassword($this->password); 
     $user->generateAuthKey(); 

     return $user->save() ? $user : null; 
    } 
} 

Wie Sie sehen können, Validierung und Erstellung des Modells in getrennte Form isoliert werden, dies eher besser ist es, als es direkt in der Modellverarbeitung (vor allem Datei Uploads). Aber für einfache Zwecke kann die Verwendung nur eines Modells ebenfalls akzeptabel sein.

+1

vielen Dank.Meine Code generiert Fehler und ich denke, es ist vielleicht mit meinem Modell verwandt, die von ActiveRecord erbt. –

Verwandte Themen