Cum se programează cu Yii2 Încărcarea fișierelor

Ce veți crea

Dacă vă întrebați: "Ce este Yii?" verificați tutorialul meu anterior: Introducere în Cadrul Yii, care analizează beneficiile Yii și include o prezentare generală a ceea ce este nou în Yii 2.0, lansat în octombrie 2014.

În acest modul de programare cu seria Yii2, îndrumăm cititorii în folosirea cadrului Yii2 pentru PHP. În acest tutorial, vă voi îndruma prin elementele de bază ale încărcării fișierelor și imaginilor în Yii2. 

Pentru aceste exemple, vom continua să ne imaginăm că construim un cadru pentru afișarea actualizărilor de stare simple, de ex. propriul mini-Twitter. Imaginea de mai sus demonstrează scrierea unei scurte actualizări în timp ce încărcăm o fotografie pe care am luat-o de la Taj Mahal.

Doar un memento, eu particip la comentariile de mai jos. Sunt interesat în special dacă aveți abordări diferite, idei suplimentare sau doriți să sugerați subiecte pentru tutoriale viitoare. Dacă aveți o sugestie de întrebare sau subiect, vă rugăm să postați mai jos. Puteți să mă contactați și pe Twitter @reifman direct.

Pluginuri de încărcare a fișierelor

Există două pluginuri pentru încărcarea fișierelor pentru Yii2 care par a fi cele mai robuste:

  1. Widgetul FileInput de către Kartik Visweswaran (prezentat mai sus)
  2. Fișierul 2Amigos Uploader de fișiere BlueImp (un înveliș pentru încărcătorul de fișiere JQuery BlueImp) 

Pentru acest tutorial, am decis să continui cu pluginul lui Kartik. Mi sa părut mai ușor de folosit și mai bine documentat decât pluginul 2Amigos. Cu toate acestea, aplicația Uploader de fișiere BlueImp are câteva caracteristici interesante despre experiența utilizatorului, pe care ați putea dori să le explorați (prezentate mai jos):

Lucrul cu pluginul FileInput

Să începem să instalăm și să folosim fișierul de încărcare a fișierului și să îl integrăm în apletul de creare a stării de tip Twitter. Din nou, vom folosi arborele aplicației Yii2 Hello pe care îl puteți descărca cu butonul de buton GitHub de lângă sau sub.

Instalarea pluginului

În primul rând, putem folosi compozitorul pentru a adăuga Kartik-v / yii2 widget-fileinput la cererea noastră:

$ compozitorul necesită setul de caractere v / yii2-widget-fileinput "*" ./composer.json a fost actualizat Încărcarea depozitelor compozitorului cu informații despre pachete Actualizarea dependențelor (inclusiv necesitatea dev) - Actualizarea tabelului kartik-v / yii2-widget-fileinput -master 36f9f49 => v1.0.4) Check out 36f9f493c2d814529f2a195422a8af2e020fc80c Fișier de blocare de scriere Generarea fișierelor autoload 

Extinderea tabelului de stare

Apoi, trebuie să adăugăm câmpuri pentru fișierul pe care o vom încărca în tabelul nostru de stare. În acest exemplu, vom permite utilizatorului să încarce o imagine pentru a merge împreună cu actualizarea statusului.

Câmpurile pe care le vom adăuga sunt numele fișierului original al fișierelor încărcate, precum și un nume de fișier unic, care va fi stocat pe serverul nostru pentru afișare:

  • image_src_filename
  • image_web_filename

Creați o nouă migrare pentru adăugarea acestor câmpuri în tabelul Stare:

$ ./yii migrați / creați extens_status_table_for_image Instrumentul de migrare Yii (bazat pe Yii v2.0.6) Creați noua migrare '/Users/Jeff/Sites/hello/migrations/m160316_201654_extend_status_table_for_image.php'? (da | nu) [no]: da Migrația nouă a fost creată cu succes.

Iată migrarea personalizată pentru a adăuga cele două câmpuri ca șiruri de caractere:

db-> driverName === 'mysql') $ tableOptions = 'SETAREA CHARACTERULUI utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> addColumn ('% status', 'image_src_filename', Schema :: TYPE_STRING. 'NOT NULL'); $ this-> addColumn ('% status', 'image_web_filename', Schema :: TYPE_STRING. 'NOT NULL');  funcția publică jos () $ this-> dropColumn ('% status', 'image_src_filename'); $ This-> dropColumn ( 'status%' 'image_web_filename'); return false; 

Apoi, rulați migrația:

$ ./yii migrați / up Instrument de migrare Yii (bazat pe Yii v2.0.6) Se aplică o migrare totală de 1: m160316_201654_extend_status_table_for_image Aplicați migrarea de mai sus? (da: nu): da *** aplicând m160316_201654_extend_status_table_for_image> adăugați coloana image_src_filename șir NOT NULL la tabel % status ... adăugat coloană image_web_filename șir NOT NULL la tabel % starea ... făcut (timpul: 0.011s) *** aplicat m160316_201654_extend_status_table_for_image (timpul: 0.071s) Migrate cu succes.

Din moment ce Yii2 este construit cu o arhitectură Model View Controller (MVC), există trei alte zone de codificare pe care trebuie să le implementăm pentru uploaderul de fișiere:

  1. Modelul de stare
  2. Vizualizarea și formularul de stare
  3. Controlorul de stare

Îmbunătățirea funcționalității modelului

Acum, vom face modificări la /models/Status.php fişier. Mai întâi, trebuie să furnizăm atribute și reguli de validare pentru noile câmpuri de imagine, precum și pentru cele temporare $ image variabilă pe care widgetul o va folosi pentru a încărca fișierul.

Mai jos, vom adăuga comentarii pentru cele două noi $ image_xxx_filename variabile și să creeze o variabilă temporară publică numită $ image:

/ ** * Aceasta este clasa de model pentru tabelul "status". * * @property integer $ id * @property string $ message * @property integer $ permisiuni * @property string $ image_src_filename * @property string $ image_web_filename * @property integer $ created_at * @property integer $ updated_at * @property integer $ created_by * * @property User $ createdBy * / starea clasei extinde \ yii \ db \ ActiveRecord const PERMISSIONS_PRIVATE = 10; const PERMISSIONS_PUBLIC = 20; public $ image;

Apoi, vom adăuga reguli de validare pentru imaginea noastră, cum ar fi tipul fișierului și dimensiunea maximă:

reguli de funcționare publică () return [['message'], 'required'], [['message'], 'string'], [['permissions', 'created_at', 'updated_at', 'created_by'] , '[', '' ',' '' ',' '', ' 'fișier', 'maxSize' => '100000'], [['image_src_filename', 'image_web_filename'], 'string', 'max' => 255];]; 

Noile etichete de atribute pentru vizualizări:

 funcția publică funcțiaLabels () return 'id' => Yii :: t ('app', 'ID'), 'message' => Yii :: t ('app', ' > Yii :: t ('app', 'Nume fișier'), 'image_web_filename' => Yii :: t ('app', 'Pathname' '),' created_by '=> Yii :: t (' app ',' Creat de '),' created_at '=> Yii: : t ('app', 'Actualizat la'),]; 

Acum putem trece la modificările de vizualizare din Formularul ActiveModel.

Adăugarea funcției noastre de vizualizare și formular

Integrarea încărcării imaginii în formularul de creare a stării

Pentru a permite integrarea formularului de încărcare a imaginilor în Actualizări de stare (afișate mai sus), trebuie să efectuăm modificări la /views/status/_form.php fişier. 

În primul rând, vom include Kartik \ fișier \ FileInput widget de lângă partea de sus și actualizarea formularului pentru a deveni multipart, care acceptă postarea fișierelor:

 
[ 'Enctype' => 'multipart / form-data']]); // important?>

Apoi, între câmpurile Permisiuni și butoanele Trimiteți, adăugăm widgetul FileInput:

câmpul (modelul $, permisiunile) -> dropDownList ($ model-> getPermissions (), ['prompt' => Yii :: t ('app', '- Choose Your Permissions' 
câmp ($ model, 'imagine') -> widget ('FileFilter' => ['jpg', 'gif', 'png'], 'showUpload' => false,],]); ?>
esteNewRecord? Yii :: t ('app', 'Creare'): Yii :: t ('app', 'Update'), ['class' => $ model-> isNewRecord? 'btn btn-succes': 'btn btn-primary'])?>

În pluginOptions line, restricționăm tipurile de fișiere în formate comune de imagine, cum ar fi jpg.

Când este complet, va arăta așa, așteptând ca utilizatorul să adauge o imagine:

Afișarea imaginii

De asemenea, voi adăuga cod pentru a afișa imaginea încărcată pentru mai târziu (după terminarea suportului controlerului). 

Mai întâi, o voi adăuga în pagina Vizualizare stare (/views/status/view.php), care este foarte de bază. Cu toate acestea, voi afișa imaginea sub detaliile elementului:

 $ model, 'atributele' => ['id', 'createdBy.email', 'message: ntext', 'permissions', 'image_web_filename', 'image_src_filename', 'created_at', 'updated_at',] > image_web_filename! = ") echo '

„; ?>

Va arata cam asa:

De asemenea, vom adăuga o imagine miniaturală în pagina indexului nostru de stare (/views/status/index.php). Am adăugat un atribut coloană personalizată în widget-ul GridView al lui Yii2:

 $ dataProvider, 'filterModel' => $ searchModel, 'coloane' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'message: ntext', 'permissions', 'created_at' ['attribute' => 'Image', 'format' => 'raw', 'value' => function ($ model) if ($ model-> image_web_filename!

Construirea suportului pentru controler

Pentru a face toate cele de mai sus posibile, trebuie să terminăm integrarea controlerului. 

În partea superioară a /controllers/StatusController.php, trebuie să includem Yii \ web \ UploadedFile:

Apoi trebuie să actualizăm actionCreate funcţie:

funcția publică funcțiaCreate () $ model = new Status (); dacă ($ model-> încărcați (Yii :: $ app-> request-> post ())) $ image = ÎncărcatFile :: getInstance ($ model, 'imagine'); dacă (! is_null ($ image)) $ model-> image_src_filename = $ imagine-> nume; $ ext = end ((explode (".", $ image-> nume)); // generează un nume de fișier unic pentru a preveni numele de fișiere duplicat $ model-> image_web_filename = Yii :: $ app-> security-> generateRandomString (). ". $ ext"; // calea de salvare a fișierului, puteți seta un uploadPath // în Yii :: $ app-> params (așa cum este folosit în exemplul de mai jos) Yii :: $ app-> params ['uploadPath'] = Yii :: $ app -> bazaPath. '/ Web / încărcări / starea /'; $ path = Yii :: $ app-> params ['uploadPath']. $ Model-> image_web_filename; $ Image-> SAVEAS (calea $);  dacă ($ model-> save ()) returnează $ this-> redirect (['view', 'id' => $ model-> id]);  altfel var_dump ($ model-> getErrors ()); a muri();  returnați $ this-> render ('create', ['model' => model $,]); 

În esență, aceasta efectuează următoarele operații:

  1. Captem numele fișierului original din informațiile despre formularul fișierului încărcat (image_src_filename).
  2. Generăm un nume de fișier unic pentru serverul nostru (image_web_filename).
  3. Salvăm fișierul în directorul de încărcare (/ Web / încărcări / starea /).
  4. Salvăm modelul.
  5. Redirecționăm pagina de vizualizare îmbunătățită.

Puteți vedea rezultatele finale cu imaginea de mai sus, care include o imagine a Taj Mahal.

Kartik's File Input Widget oferă, de asemenea, mai multe configurații avansate pe care le documentează destul de bine, cum ar fi Drag and Drop:

Verificați mai multe dintre acestea pe următoarele pagini:

  • FileInput Widget Demo
  • Încărcați fișierul în Yii 2 utilizând widgetul FileInput
  • Încărcați avansat utilizând widgetul Yii2 FileInput 

Ce urmeaza?

Sper că acest lucru vă ajută cu elementele de bază ale încărcării fișierelor în aplicația dvs. Yii2. Dacă doriți să vedeți o altă interfață similară a acestui tip de funcționalitate, consultați Construirea sistemului de pornire cu PHP: Setări utilizator, Imagini de profil și Detalii de contact. Acest tutorial oferă o integrare puțin diferită de acest tutorial, utilizând filele, actualizând profilurile utilizatorilor și diminuând imaginile.

Uita-te pentru tutoriale viitoare în modul meu de a programa cu seria Yii2 ca am continua scufundări în diferite aspecte ale cadrului. Ați putea dori, de asemenea, să verificați starea mea Building Your Startup With PHP, care utilizează șablonul avansat al lui Yii2, pe măsură ce construiesc o aplicație în lumea reală.

Dacă doriți să știți când vine următorul tutorial Yii2, urmați-mă @reifman pe Twitter sau verificați pagina de instructor. Pagina mea de instructor va include toate articolele din această serie de îndată ce vor fi publicate. 

Link-uri conexe

Iată o varietate de link-uri pe care le-am folosit pentru a cerceta și a scrie acest tutorial:

  • Yii2 Developer Exchange, site-ul meu de resurse Yii2
  • FileInput Widget Demo de - Kartik
  • Încărcați fișierul în Yii 2 utilizând widgetul FileInput - Kartik
  • Codul pentru kartik-v / yii2-widget-fileinput (GitHub)
  • BlueImp JQuery File Upload Demo
  • Cod pentru 2 amigos/yii2-file-upload-widget: Widget de încărcare a fișierelor BlueImp (Github)
  • Încărcarea fișierelor - Ghidul definitiv pentru Yii 2.0
Cod