Folosind Backbone În cadrul administratorului WordPress Front End

Bine ați venit la partea a doua a Utilizării Backbone în cadrul programului WordPress Admin. În prima parte, am creat plugin-ul "back-end" al plugin-ului nostru și acum, în a doua parte, vom termina adăugând funcționalitatea "client-side" sau "front end". Pentru o prezentare generală a ceea ce construim în acest tutorial, împreună cu structura și fișierele noastre de dosare, vă rugăm să revedeți prima parte.


1. Creați fișierul șablon

În cadrul src folder, creați altul numit Template-uri și un dosar din interiorul acelei persoane metabox.templ.php. Aici vom plasa HTML-ul necesar meta-casei noastre. Este, de asemenea, o mare oportunitate de a transmite datele JSON necesare pentru răspunsurile noastre.

Dosarele și fișierele ar trebui să arate astfel.

Creați șablonul pentru un singur răspuns

Să aruncăm o privire asupra a ceea ce creăm. Vă puteți gândi la fiecare răspuns ca la Model de date și pentru că vom folosi șabloane de pe partea clientului pentru a genera o vedere pentru fiecare, această viziune poate reacționa la modificările din model. Acest lucru ne permite să fim foarte specifici atunci când legăm evenimentele la UI și, firește, duce la un flux de lucru mai ușor - odată ce ți-ai doborât capul în jurul tău,.

În interiorul noului nostru creat metabox.templ.php, acesta este modelul pe care îl vom folosi pentru fiecare dintre modelele noastre. Puteți vedea că în principiu înfășurăm câteva coduri HTML într-o etichetă de script. Dăm tagului scriptul atributul type = "text / șablon" astfel încât browserul să nu fie afișat pe pagină. Această bucată mică de HTML va fi utilizată mai târziu pentru a genera marcajul necesar pentru fiecare vizualizare. Vom folosi capabilitățile șablonului încorporat de Underscore, astfel încât valorile înfășurate astfel vor fi înlocuite ulterior cu datele din modelele noastre.

    

HTML bază

Încă înăuntru src / template-uri / metabox.templ.php - aici punem doar containerele care vor fi populate cu intrările din șablonul de mai sus. Acest lucru se întâmplă după ce Backbone a analizat datele JSON necesare pentru model, așa că deocamdată avem tot ce trebuie să facem aici.

  

Introduceți răspunsurile de mai jos

Răspuns corect:

Ieșiți JSON-ul

Ultimul lucru necesar în interiorul lui src / template-uri / metabox.templ.php fișier, este datele JSON care reprezintă fiecare răspuns. Aici creăm un obiect în Spațiul de nume global și apoi atribuim valorile pe care le-am trimis prin $ videotex matrice. Îmi place, de asemenea, să salvez referințele la containerele pe care le vom folosi mai târziu, astfel încât să nu am identificări în două fișiere separate.

  

2. JavaScript-ul

Ok, dacă ați ajuns atât de departe, ați configurat plugin-ul pentru a permite utilizarea lui Backbone.js și căsuța dvs. meta va afișa datele de marcare și date JSON necesare. Acum este timpul să le aducem laolaltă și să folosim Backbone.js pentru a organiza codul clientului nostru. Este timpul să acoperiți:

  1. Crearea unei colecții de modele din datele JSON
  2. Utilizarea șabloanelor de pe partea clientului pentru a construi o vizualizare pentru fiecare
  3. Vizionați pentru clic, tastați și eliminați evenimentele din fiecare vizualizare
  4. Salvarea unui model înapoi în baza de date

Creați fișierul admin.js și puneți-l în js Pliant

Structura și fișierele dvs. de director final ar trebui să arate așa.

În primul rând, vom înfășura tot ceea ce facem într-o funcție numită imediat și vom trece în jQuery pentru a fi utilizate cu $ semne, nu voi arăta acest pachet în alte fragmente, așa că asigurați-vă că puneți totul în interiorul acestuia.

 / * js / admin.js * / (funcția ($) / ** Codul nostru aici ** / (jQuery));

Apoi trebuie să accesăm datele stocate în spațiul de nume global și, de asemenea, să creăm un obiect nou care să stocheze obiectele Backbone.

 / * js / admin.js * / var Quiz = Vizualizări: ; var wpq = fereastră.wpQuiz;

Modelul

Modelul reprezintă un singur răspuns. În constructorul său facem câteva lucruri.

  1. Setarea unei valori implicite pentru corectarea ca fals
  2. Stabiliți adresa URL pe care o cere Backbone pentru a salva modelul înapoi în baza de date. Putem accesa URL-ul corect datorită WordPress dovedind ajaxurl care este disponibilă pe fiecare pagină de administrare. De asemenea, adăugăm numele metodei noastre care gestionează solicitarea ajax
  3. Apoi vom suprascrie toJSON metoda de adăugare a ID-ului postului curent pentru fiecare model. Acest lucru ar putea fi făcut în partea de server, dar l-am pus aici ca un exemplu de cum puteți suprascrie ceea ce este salvat pe server (Acest lucru poate veni în foarte la îndemână, motiv pentru care l-am inclus aici)
  4. În cele din urmă, în metoda de inițializare, verificăm dacă modelul curent este răspunsul corect prin compararea ID-ului cu ID-ul răspunsului corect. Facem acest lucru astfel încât, ulterior, să știm ce răspuns trebuie selectat în mod implicit
 / * js / admin.js * / Quiz.Model = Backbone.Model.extend (defaults: 'corect': false, url: ajaxurl + '? action = save_answer', toJSON: () if (this.get ('answer_id') === wpq.answers.correct) this.set ('corect', adevărat););

Colecția

O colecție este în esență doar o învelitoare pentru o grămadă de modele și face ca lucrul cu aceste modele să fie o briză. Pentru exemplul nostru mic, nu vom modifica colecția, în afară de specificarea modelului pe care ar trebui să îl folosească.

 / * js / admin.js * / Quiz.Collection = Backbone.Collection.extend (model: Quiz.Model);

Înfășurarea intrărilor

Prima noastră viziune poate fi considerată ca o împachetare pentru câmpurile individuale de intrare. Nu este necesar să declarăm un șablon sau ce element HTML dorim ca Backbone să creeze pentru noi în acest caz, deoarece mai târziu când instanțiăm această vizualizare, îi vom transmite ID-ul unei div pe care am creat-o în fișierul meta-box. Backbone-ul va folosi pur și simplu acel element ca recipient. Această vizualizare va avea o colecție, iar pentru fiecare model din colecția respectivă, va crea o colecție nouă intrare și adăugați-o la sine.

 / * js / admin.js * / Quiz.Views.Inputs = Backbone.View.extend (initialize: function () this.collection.each (this.addInput, this);, addInput: functie ) var intra = nou Quiz.Views.Input (model: model);

O intrare unică

Această vizualizare următoare reprezintă un singur model. În scopul prezentării tipurilor de lucruri pe care le puteți face atunci când codificați JavaScript în acest fel, am încercat să ofer câteva tehnici de interacțiune diferite și să arăt cum să reacționați la cei cu Backbone.

Rețineți că specificăm un "nume etichetaaici, împreună cu un șablon. În cazul nostru, vom lua acest șablon pe care l-am analizat mai devreme, îl vom analiza folosind datele din model și apoi vom împacheta totul într-o p tag (care ne va da un pic frumos de margine în jurul fiecăruia).

De asemenea, rețineți modul în care evenimentele sunt legate de elementele dintr-o vizualizare. Mult mai curat decât apelul mediu JQuery și ceea ce este chiar mai bun este capacitatea de a utiliza un selector jQuery ca acesta acest lucru. $ ( 'intrare') în opinia noastră știind că acestea sunt în mod automat scop în vedere. Acest lucru înseamnă că jQuery nu se uită la întreg DOM atunci când încearcă să se potrivească cu un selector.

În această privință, vom putea:

  1. Aflați când a fost schimbat un câmp de intrare
  2. Actualizați automat modelul asociat acestuia (care va fi utilizat pentru actualizarea automată a câmpului selectat de mai jos)
  3. Activați butonul de salvare din partea de intrare care a fost modificată
  4. Efectuați salvarea înapoi în baza de date
 / * js / admin.js * / Quiz.Views.Input = Backbone.View.extend (tagName: 'p', // Obțineți șablonul din șablonul DOM: _. template ($ (wpq.inputTempl) .html ()), // Când un model este salvat, returnați butonul la starea dezactivată initialize: function () var _this = this; this.model.on ('sync', function () _this. $ '); .text (' Salvează ') .attr (' dezactivat ', adevărat););, // Atașarea evenimentelor de evenimente: ' keyup input ':' blur ' click ':' save ', // Efectuati functia Save save: (e) e.preventDefault (); $ (e.target) .text (' wait '); this.model.save , // Actualizați atributele modelului cu date din zona de intrare blur: funcție () var input = this. $ ('Input') val (); if (input! == this.model.get )) this.model.set ('răspuns', intrare), acest $ ('buton'), attr ('dezactivat', false);, // Render input unic - funcția () this.model.set ('index', acest.model.collection.indexOf (acest.model) + 1); acest $. el.html (this.template (acest model la JSON ())); returnați acest lucru; );

Elementul Selectați

Acest element de selectare este locul în care utilizatorul poate alege răspunsul corect. Când această vizualizare a fost instanțiată, ea va primi aceeași colecție de modele pe care le-a făcut ambalajul intrărilor. Aceasta va fi utilă mai târziu, deoarece vom putea asculta modificările aduse modelului în câmpurile de intrare și vom actualiza automat valorile corespunzătoare în acest element selectat.

 / * js / admin.js * / Quiz.Views.Select = Backbone.View.extend (initialize: function () this.collection.each (this.addOption, this); addOption: var opțiune = noua opțiune Quiz.Views.Option (model: model), acest $ $ el.append (option.render () .el););

O vizualizare cu o singură opțiune

Vederea noastră finală va crea un element de opțiune pentru fiecare model și va fi adăugat la elementul de selecție de mai sus. De data aceasta am arătat cum puteți seta dinamic atributele elementului returnând un hash de la o funcție de apel invers atribuită proprietății atributelor. De asemenea, rețineți că în inițializa () metoda pe care am abonat-o pentru a schimba evenimentele de pe model (mai precis, Răspuns atribut). Acest lucru înseamnă pur și simplu: oricând acest model Răspuns atributul este modificat, apelați face() (care în acest caz va actualiza doar textul). Acest concept de "abonare" sau "ascultare" a evenimentelor care apar în cadrul unui model este într-adevăr ceea ce face Backbone.js și multe alte biblioteci să fie atât de puternice, utile și de o bucurie de a lucra cu.

 / * js / admin.js * / Quiz.Views.Option = Backbone.View.extend (tagName: 'opțiune', // returnarea unui hash ne permite să setăm atributele dinamice: function () return  : this.model.get ('answer_id'), 'selectat': this.model.get ('corect'), // Urmăriți modificările aduse fiecărui model (care se întâmplă în câmpurile de introducere și reîncărcați când există este o schimbare initialize: function () this.model.on ('change: answer', this.render, this);, render: function () this. $ el.text (this.model.get (' răspuns)); retur acest lucru;);

Colecția și vizionările de instanțe

Suntem atat de aproape acum, tot ce trebuie sa facem este sa instantiati o noua colectie si sa o transmiteti JSON-ului de care are nevoie, apoi instantiati ambele vizualizari "wrapper" pentru elementul select si pentru input-uri. Rețineți că și noi treceți el proprietatea noastră. Acestea sunt referiri la elementul div și selectat pe care l-am lăsat necompletat mai devreme în caseta meta.

 / * js / admin.js * / var răspuns = nou Quiz.Collection (wpq.answers); var selectElem = nou Quiz.Views.Select (colecție: răspunsuri, el: wpq.answerSelect); var inputs = noi Quiz.Views.Inputs (colecție: răspunsuri, el: wpq.answerInput);

3. Activați pluginul

Dacă ați reușit până la sfârșit, acum ar trebui să aveți un exemplu pe deplin de lucru în ceea ce privește încorporarea Backbone JS într-un plugin WordPress. Dacă mergeți mai departe și aruncați o privire la fișierele sursă, veți observa că valoarea reală a codului necesar pentru a încorpora Backbone este relativ mică. O mare parte din codul pe care am trecut-o aici a fost PHP-ul necesar pluginului. Lucrul cu Backbone pe o bază zilnică în ultimele 6 săptămâni mi-a dat cu adevărat un respect nou găsit pentru organizarea codului frontal și sper că puteți aprecia beneficiile care vor veni cu siguranță din a lucra în acest mod.

În cadrul comunității WordPress vă pot imagina unele dintre cele mai complexe și de înaltă calitate plug-in-uri acolo beneficiind cu adevărat de utilizarea Backbone și sunt onorat să fi putut să împărtășesc cu dvs. o tehnică pentru a face exact asta.

Cod