ProcessWire CMS – Ghid pentru începători

Publicat: 2022-03-10
Rezumat rapid ↬ Sistemele de gestionare a conținutului sunt de cele mai multe ori opinie. De exemplu, cei mai mulți dintre ei se așteaptă la o anumită structură de conținut rigidă pentru introducerea datelor și apoi au un mod specific gravat de accesare și de ieșire a acestor date, indiferent dacă are sens sau nu. În plus, rareori oferă instrumente eficiente pentru a ieși din traseele predefinite dacă un caz o cere.

ProcessWire este un sistem de management al conținutului (CMS) distribuit sub licența publică Mozilla versiunea 2.0 (MPL) și licența MIT. Este conceput de la zero pentru a aborda problemele cauzate de exact acest tip de opinie (care, inevitabil, are ca rezultat frustrarea dezvoltatorilor și utilizatorilor), fiind - ați ghicit - fără opinie. În esență, se bazează pe câteva concepte de bază simple și oferă un API excepțional de ușor de utilizat și puternic pentru a gestiona conținut de orice fel. Să intrăm direct în asta!

Citiți suplimentare despre SmashingMag:

  • Proiectare pentru sisteme de management de conținut
  • De ce generatoarele statice de site-uri web sunt următorul lucru important
  • Set de pictograme Sistem de management al conținutului (CMS) (12 pictograme gratuite)
  • Noțiuni introductive cu sistemele de management al conținutului

GUI de administrare

După instalarea ProcessWire (care necesită PHP 5.3.8+, MySQL 5.0.15+ și Apache), veți vedea pagina de pornire a GUI implicit de administrare:

Mai multe după săritură! Continuați să citiți mai jos ↓

ProcessWire admin GUI.
GUI-ul de administrare are o structură destul de simplă. De asemenea, este complet receptiv, așa că va arăta ușor diferit pe ecranele mari.

Notă: Paginile pe care le vedeți în arborele ierarhic al paginilor (mai multe despre asta mai târziu) sunt acolo deoarece am ales profilul site-ului web „Default (Beginner Edition)” în timpul procesului de instalare. Acest lucru este total opțional. De asemenea, puteți începe cu un profil de site necompletat, care vă permite să construiți totul de la zero.

De fapt, puteți alege dintre multe teme de administrare, deși pentru ProcessWire 2.6+ este recomandată tema implicită sau tema Reno. Deoarece Reno vine pre-ambalat cu fiecare instalare ProcessWire, trecerea la acesta este destul de ușoară: instalați-l și selectați-l în profilul dvs. de utilizator.

Captură de ecran a temei „Reno”.
Instalarea unei noi teme pentru interfața de administrare este ușoară. Acesta se numește Reno. (Vedeți versiunea GIF animată)

Să aruncăm o privire rapidă la navigarea back-end principală:

Captură de ecran a navigației principale în back-end.
  • „Pagini” Acesta este punctul de intrare al GUI de administrare. Prezintă arborele ierarhic al paginii și, prin urmare, tot conținutul site-ului dvs. în back-end.
  • „Configurare” Acesta este locul pentru a configura arhitectura generală a modelului de date a instalației dvs. prin șabloane și câmpuri (mai multe despre asta mai târziu). Aici este și locul în care modulele ProcessWire adaugă adesea o intrare pentru funcționalitatea lor specifică și interfața cu utilizatorul - de exemplu, vizualizarea mesajelor de jurnal direct în GUI-ul de administrare sau gestionarea tuturor limbilor diferite atunci când se ocupă de conținut în mai multe limbi.
  • „Module” Aici gestionați toate modulele site-ului dvs. web. Gândiți-vă la modulele ProcessWire ca la pluginuri WordPress: extind și personalizează sistemul.
  • „Acces” Aici gestionați utilizatorii, rolurile și permisiunile utilizatorilor.

Trei concepte de bază simple

Conceptele de bază care formează arhitectura generală a modelului de date ProcessWire sunt exact trei: pagini, câmpuri și șabloane . Să ne uităm la fiecare pe rând.

Totul este o pagină: sau, arborele cu o pagină pentru a le guverna pe toate

O pagină din ProcessWire poate genera o pagină obișnuită în partea din față a site-ului dvs., gata să fie vizitată de utilizatori (cum ar fi „Acasă” și „Despre” în captura de ecran de mai sus). Dar o pagină poate exista, de asemenea, numai în back-end, fără o contraparte frontală - de exemplu, o pagină de setări ascunse în care stocați sloganul global, sigla și notificarea privind drepturile de autor ale site-ului dvs. web. Când spun „totul este o pagină” în ProcessWire, vreau să spun serios. La naiba, chiar și legăturile principale de navigare din interfața de administrare sunt făcute din pagini ascunse în arborele ierarhic al paginilor!

Captură de ecran care arată că până și navigarea back-end este făcută din pagini.
În ProcessWire, totul este o pagină. Chiar și navigarea principală și sub-navigarea sunt realizate din pagini din arborele ierarhic al paginilor.

Este atât de meta încât îmi amintesc de o anumită meme Xzibit. Dar să lăsăm așa.

Conceptul ca o pagină să fie vizibilă doar în spate este destul de puternic, deoarece deschide o lume întreagă de posibilități cu privire la modul de structurare și accesare a datelor prin alte pagini (imaginația ta fiind singura limită). Puteți construi un catalog masiv de produse sau o aplicație intranet cu sute de mii de articole bazate pe o ierarhie complexă a paginilor sau doar un simplu blog cu categorii și etichete de blog obișnuite (fiecare categorie și etichetă fiind o pagină din arborele paginii) .

Joss Sanglier, un membru distins al comunității ProcessWire, descompune conceptul de pagini astfel:

[Î]n paginile ProcessWire […] nu sunt înghițituri mari de informații, ci lucruri mărunte, nimic mai mult decât un link către lumea mai interesantă a câmpurilor și a șabloanelor; doar un pic de date din uriașa ta fascinantă bază de date.

Paginile din ProcessWire sunt folosite pentru tot felul de lucruri. Ele pot fi folosite ca un marcator în lista de pagini. Ele pot fi folosite ca părinte de grup pentru alte pagini. Ele pot fi folosite ca categorii, etichete sau liste sau utilizatori. Și pot fi folosite chiar și pentru selectări simple derulante - doar pentru a furniza o etichetă și o valoare.

Să interacționăm puțin cu arborele ierarhic al paginii:

Captură de ecran cu drag and drop în arborele paginii.
Puteți muta pagini în arborele ierarhic al paginilor prin glisare și plasare. (Vedeți versiunea GIF animată)

După cum puteți vedea, paginile pot fi editate, mutate sau aruncate la gunoi și pot avea un număr infinit de copii și nepoți.

Să deschidem pagina „Acasă”:

Captură de ecran a paginii de pornire deschise
Pagina „Acasă” a profilului site-ului „Default (Beginner Edition)” conține câteva câmpuri simple, care sunt toate opționale.

Acest lucru ne duce la următorul concept de bază al ProcessWire, câmpurile.

Câmpurile sunt containerele în care puneți datele

Câmpurile sunt practic containerele în care puneți datele. În acest moment, este important să realizați că ProcessWire nu are conceptul de câmpuri personalizate, așa cum are WordPress, deoarece fiecare câmp din ProcessWire este un câmp personalizat . Când creați un câmp, îi puteți da o etichetă, o descriere și câteva note suplimentare care vor apărea sub el.

Să edităm câmpul „Titlu” și să adăugăm o descriere și o notă:

Captură de ecran a câmpului de titlu cu descriere personalizată și notă.
Fiecare câmp poate primi o descriere personalizată și o notă. (Vedeți versiunea GIF animată)

Tipurile de câmp preinstalate acoperă majoritatea nevoilor de bază de introducere a datelor. De exemplu, puteți crea lucruri precum casete de selectare, selecții de date, seturi de câmpuri (un câmp care grupează alte câmpuri în unități logice vizual), încărcătoare de fișiere și imagini și, desigur, câmpuri de text și zone de text (editorul WYSIWYG implicit fiind CKEditor ).

Există, de asemenea, o mulțime de tipuri de câmpuri preambalate și terțe din care să alegeți. Un modul de bază util, care nu este instalat implicit, este câmpul repetitor . Vă permite să creați în mod dinamic rânduri de seturi de date.

Captură de ecran a repetorului.
Repetoarele sunt o modalitate ordonată și ușoară de a crea rânduri de date de același tip. (Vedeți versiunea GIF animată)

ProcessWire este, de asemenea, potrivit pentru manipularea imaginilor . De exemplu, puteți decide ce variante de imagine ar trebui să creeze automat ProcessWire pentru o imagine după încărcarea acesteia (ceea ce permite cazuri de utilizare plăcute pentru imaginile receptive). Și alegerea unei miniaturi pentru o imagine este o briză.

Captură de ecran cu decuparea unei imagini.
ProcessWire este potrivit pentru lucrul cu imagini. (Vedeți versiunea GIF animată)

Un alt tip de câmp util este tipul de câmp de pagină . Puteți lega alte pagini cu pagina pe care o editați în prezent și, astfel, puteți crea o relație între ele. În setările câmpului, puteți decide cum ar trebui să fie aspectul intrării și interacțiunea cu câmpul - de exemplu, dacă o singură pagină sau mai multe pagini ar trebui să fie selectabile sau dacă numai paginile secundare ale unei anumite pagini părinte ar trebui să fie selectabile. Dacă ar fi să scrieți, de exemplu, o postare de blog, ați putea alege să permiteți completarea automată numai a categoriilor de postări de blog.

Captură de ecran a câmpului paginii de completare automată.
Un câmp de pagină poate avea manifestări foarte diferite. Iată una: funcționalitatea de completare automată vă permite să alegeți pagini deja existente (în meniul derulant), dar și să creați pagini noi chiar în câmp. (Vedeți versiunea GIF animată)

O caracteristică bună pe care o puteți activa în setările unui câmp este abilitatea de a edita conținutul câmpului în partea frontală a site-ului dvs. web . Odată ce un utilizator s-a conectat la back-end-ul ProcessWire, acesta poate trece la front-end-ul site-ului web și poate edita și salva conținutul chiar acolo unde va fi redat în cele din urmă.

Captură de ecran cu editarea conținutului pe front-end-ul site-ului dvs.
Ești un fan al editării front-end a conținutului? ProcessWire vă acoperă. (Vedeți versiunea GIF animată)

După ce vă uitați la pagini și câmpuri în ProcessWire, vă puteți întreba: Cum știe o pagină ce câmpuri are? Și unde pot defini cum sunt ordonate și redate câmpurile pe o pagină? Deci, să trecem la ultimul concept de bază, șabloane.

Șabloanele sunt planurile paginilor

De fiecare dată când creați o pagină în arborele ierarhic al paginii, ProcessWire trebuie să știe ce șablon este asociat cu aceasta. Acest lucru se datorează faptului că o pagină trebuie să știe ce câmpuri trebuie să redea, iar acele informații sunt întotdeauna o parte a șablonului respectiv.

Pe scurt: șabloanele conțin toate informațiile pe care pagina trebuie să le cunoască despre conținutul său (ce câmpuri are, cum sunt redate acele câmpuri și cum se comportă).

Să deschidem șablonul „Acasă” din exemplul nostru de instalare.

Captură de ecran a setărilor șablonului
Șabloanele din ProcessWire sunt foarte flexibile și sunt unul dintre motivele pentru care ProcessWire se simte mai mult ca un cadru decât un CMS. (Vezi versiunea mare)

Principalul lucru de observat este numărul de setări. Sunt foarte multe de descoperit aici. De exemplu, puteți limita accesul la paginile create cu acest șablon la anumite roluri de utilizator. Sau puteți decide dacă paginile create cu acest șablon ar trebui să fie stocate în cache pentru o anumită perioadă de timp (pentru a îmbunătăți performanța), plus condițiile în care memoria cache trebuie șters.

O altă setare puternică este ascunsă în fila „Familie”. Aici puteți defini dacă paginile create cu acest șablon pot avea pagini copii și ce șabloane sunt permise pentru pagina părinte sau pentru paginile sale copii. Acest lucru vă permite să creați exact tipul de ierarhie a familiei de șablon pe care îl doriți. Este o modalitate flexibilă și la îndemână (și, de fapt, una dintre cele mai puternice moduri) de a vă structura datele și este una dintre multele moduri prin care ProcessWire își arată flexibilitatea.

Să ne îndreptăm atenția către lista de câmpuri dintr-un șablon. Privind la captura de ecran de mai sus, puteți vedea că ordinea câmpurilor seamănă cu ordinea în care câmpurile vor fi redate pe pagina de pornire. Puteți pur și simplu să glisați și să plasați câmpurile pentru a modifica ordinea în listă, schimbând astfel ordinea apariției la editarea paginii de pornire.

Jumătate din captură de ecran din stânga: trageți și plasați câmpurile în setările șablonului. Captură de ecran din dreapta jumătate: ordinea câmpurilor schimbată pe pagina „Acasă”.
Modificarea ordinii câmpurilor în setările șablonului (stânga) afectează ordinea în care sunt redate câmpurile pe pagină (dreapta). (Vedeți versiunea GIF animată)

De asemenea, puteți modifica lățimea unui câmp de pe pagină. Doar faceți clic pe un câmp și schimbați-l. Să punem una lângă alta câmpurile „Titlu” și „Titlu”.

Captură de ecran a câmpurilor redate unul lângă altul
Dețineți controlul total asupra modului în care sunt redate câmpurile pe pagină. (Vedeți versiunea GIF animată)

Un alt exemplu de modul în care puteți personaliza și personaliza interfața de utilizator a unei pagini și a câmpurilor acesteia sunt dependențele câmpurilor de intrare. Acestea vă permit să specificați condițiile în care un anumit câmp din editorul de pagini este afișat sau necesar. Să facem câmpul „Titlu” vizibil în interfața de utilizare numai dacă utilizatorul introduce ceva în câmpul „Titlu” și să marchem câmpul „Rezumat” ca fiind necesar numai dacă utilizatorul introduce ceva în câmpul „Titlu”:

Captură de ecran a setărilor pentru dependențele câmpurilor de intrare
Câmpul „Titlu” va fi afișat pe pagină numai după ce utilizatorul a introdus ceva în câmpul „Titlu”. (Vedeți versiunea GIF animată)

Iată un videoclip care vă arată cum pot fi folosite dependențele câmpurilor de intrare pentru a îmbunătăți experiența utilizatorului în timp ce lucrați cu ProcessWire:

Cum pot fi utilizate dependențele câmpurilor de intrare pentru a îmbunătăți experiența utilizatorului în timpul lucrului cu ProcessWire

Numărul, ordinea și aspectul câmpurilor de pe o pagină sunt în totalitate sub controlul dvs. Puteți pune doar un câmp într-un șablon, deloc (nu foarte util) sau mai mult de 50 de câmpuri, 100 sau chiar mai mult. Puteți să le comandați în orice mod doriți, să specificați care sunt necesare sau vizibile și care nu și să specificați în ce circumstanțe ar trebui să fie solicitate sau vizibile. Aici strălucește abordarea fără opinie a ProcessWire.

Breviar: pagini, câmpuri, șabloane

Să recapitulăm relația tehnică dintre pagini, câmpuri și șabloane: adăugați câmpuri la șabloane și selectați un șablon atunci când creați o pagină nouă. Câmpurile pe care le vedeți când editați o pagină sunt câmpurile pe care le-ați adăugat la șablonul selectat.

Un alt mod de a privi acest lucru ar fi printr-o analogie din lumea programării:

  • Șabloanele sunt ca clasele.
  • Câmpurile sunt ca proprietățile claselor.
  • Paginile sunt exemple de clase.

Odată ce interiorizați aceste concepte, veți fi echipat cu tot ce trebuie să știți pentru a dezvolta în ProcessWire. Și motivul pentru aceasta este că filosofia ProcessWire se bazează numai pe aceste trei concepte. Destul de misto, nu?

Fișiere șablon și API: un cuplu menit să fie împreună

Locul de unde preluați datele introduse în back-end-ul ProcessWire și le scoateți în front-end este, desigur, sistemul de fișiere - mai precis, folderul /site/templates/ al instalării ProcessWire. Un șablon poate avea asociat un fișier PHP fizic cu același nume; deci, șablonul home ar avea un fișier home.php în folderul /site/templates/ .

Notă: modul în care vă dezvoltați fișierele șablon depinde în totalitate de dvs. Dacă sunteți familiarizat cu stilul WordPress de dezvoltare a lucrurilor, puteți continua așa cum v-ați obișnuit. Sau, dacă aveți o configurație destul de complexă și mare și doriți să creați o arhitectură mai sofisticată, puteți utiliza o abordare inspirată de MVC, care ar funcționa la fel de bine. Ryan Cramer are un tutorial introductiv destul de bun, intitulat „Cum să structurați fișierele șablon”, în care puteți afla diferite abordări ale dezvoltării fișierelor șablon în ProcessWire.

Codul pe care îl scrieți într-un fișier șablon va consta în principal din construcții PHP de bază (condiții if , bucle foreach , declarații echo ), markup HTML și API-ul ProcessWire. API-ul este puternic inspirat de jQuery - așa că este într-adevăr un fel de iterare și de parcurgere a conținutului pe care l-ați introdus în back-end prin metode, selectoare și capabilități de înlănțuire (interfață fluentă). Este ușor de utilizat și foarte expresiv, la fel ca jQuery.

Să începem prin a ne uita la câteva exemple simple pentru a vă ajuta să utilizați API-ul. Dar înainte de a începe, nu uitați să marcați fișa de cheat API ProcessWire, o referință utilă cu o prezentare generală a tuturor metodelor API disponibile.

Captură de ecran a Cheatsheet ProcessWire
Cheat sheet API vă va servi drept un bun însoțitor.

Lucrul pe care vrem să-l facem mai întâi este să accesăm și să scoatem conținutul câmpului unei pagini. API-ul expune o variabilă pentru ca noi să ne ocupăm de asta: $page .

Obținerea paginii curente cu variabila $page

Variabila $page conține toate câmpurile unei singure pagini. Aceasta include câmpuri încorporate (cum ar fi numele șablonului unei pagini), precum și câmpurile pe care le-ați adăugat, în calitate de dezvoltator, la șablonul paginii.

Să deschidem home.php , care este fișierul șablon al șablonului de home și să adăugăm această linie la acesta:

 echo $page->title;

Acest lucru îi spune lui ProcessWire să ia câmpul „Titlu” al paginii pe care ne aflăm în prezent („Acasă”) și să îl scoată. Să presupunem că avem și un câmp „Titlu” pe pagină, pe care dorim să-l folosim în loc de câmpul „Titlu”, dar numai dacă utilizatorul a introdus ceva în el.

 echo $page->get("headline|title");

Am folosit metoda get pentru a accesa câmpul unei pagini (deci, $page->get(“title”) este practic echivalent cu primul exemplu de cod de mai sus) și am scris “headline|title” în metoda get . Acest lucru îi spune ProcessWire să verifice mai întâi câmpul „Titlu” și să scoată conținutul titlului. Dar dacă câmpul „Titlu” este gol, atunci câmpul „Titlu” este folosit ca alternativă.

Utilizarea variabilelor API în șiruri PHP este, de asemenea, posibilă. Următoarele două instrucțiuni echo pentru afișarea numărului de copii ai unei pagini sunt echivalente:

 echo "This page has " . $page->numChildren . " children pages."; echo "This page has {$page->numChildren} children pages.";

Haideți să obținem copiii paginii noastre rădăcină (nu uitați, suntem încă în home.php ) și să le trimitem ca o listă de link-uri:

 echo "<ul>"; foreach ($page->children as $child) { echo "<li><a href='{$child->url}'>{$child->title}</a></li>"; } echo "</ul>";

Un alt exemplu de câmp încorporat (cum ar fi children și url în exemplul de mai sus) este iterarea prin toți părinții unei pagini și crearea de navigare în breadcrumb:

 echo "<ul>"; foreach ($page->parents as $parent) { echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>"; } // output the page itself at the end echo "<li>{$page->title}</li>"; echo "</ul>";

Pe pagina rădăcină („Acasă”), acesta ar scoate doar titlul, deoarece $page->parents ar fi gol.

Mai devreme, v-am arătat cum să creați miniaturi de imagine în interfața de administrare. Crearea miniaturilor se poate face și în mod programatic cu ajutorul API-ului. Să repetăm ​​toate imaginile încărcate în câmpul „Imagini”, să creăm o variantă de imagine mare la 600 de pixeli lățime cu o înălțime proporțională și o miniatură de 150 × 150 de pixeli, cu opțiuni specifice, cum ar fi setările de decupare și calitatea imaginii. În final, dorim să legăm imaginea în miniatură de imaginea mare. Sună complicat? Nu este.

 $options = array( "quality" => 90, "cropping" => "northwest" ); foreach ($page->images as $image) { $large = $image->width(600); $thumbnail = $image->size(150, 150, $options); echo "<a href='{$large->url}'><img src='{$thumbnail->url}' alt='></a>"; }

ProcessWire este destul de inteligent în acest sens, deoarece creează imagini de orice dimensiune din mers și păstrează un cache al acestora, astfel încât trebuie să creeze versiunile o singură dată.

Iată un ultim exemplu de $page pentru a vă arăta că API-ul pare că interacționați cu DOM atunci când utilizați jQuery. Să obținem ultimul copil al paginii părinte pe care ne aflăm în prezent.

 $wantedPage = $page->parent->children()->last();

Pe lângă variabila $page , API-ul expune o alta importantă: $pages .

Obținerea tuturor paginilor cu variabila $pages

Cu $pages , aveți acces la toate paginile din instalarea ProcessWire. Cu alte cuvinte, vă oferă acces la tot conținutul dvs. de oriunde .

De exemplu, ați putea avea o pagină de setări ascunsă (adică nu este accesibilă în partea din față) în instalarea ProcessWire; ați putea adăuga setări globale, cum ar fi titlul și descrierea site-ului dvs. web; și puteți accesa și scoate aceste blob-uri de conținut din orice fișier șablon doriți.

 $settings = $pages->get("template=settings"); echo "<h1>{$settings->global_title}</h1>"; echo "<p>{$settings->global_description}</p>";

Un caz obișnuit de utilizare pentru o singură pagină cu subiect a unui blog este afișarea tuturor postărilor de blog în care se face referire la subiect. Doar scrieți acest lucru în fișierul șablon al subiectului:

 $pages->find("template=blog-post, topics=$page");

Notă: topics este un câmp din șablonul blog-post care ați adăuga toate categoriile de subiecte care sunt specifice postării de blog.

O altă setare puternică este ascunsă în fila „Familie”. Aici puteți defini dacă paginile create cu acest șablon pot avea pagini copii și ce șabloane sunt permise pentru pagina părinte sau pentru paginile sale copii. Acest lucru vă permite să creați exact tipul de ierarhie a familiei de șablon pe care îl doriți. Este o modalitate flexibilă și la îndemână (și, de fapt, una dintre cele mai puternice moduri) de a vă structura datele și este una dintre multele moduri prin care ProcessWire își arată flexibilitatea.

Să ne îndreptăm atenția către lista de câmpuri dintr-un șablon. Privind la captura de ecran de mai sus, puteți vedea că ordinea câmpurilor seamănă cu ordinea în care câmpurile vor fi redate pe pagina de pornire. Puteți pur și simplu să glisați și să plasați câmpurile pentru a modifica ordinea în listă, schimbând astfel ordinea apariției la editarea paginii de pornire.

Jumătate din captură de ecran din stânga: trageți și plasați câmpurile în setările șablonului. Captură de ecran din dreapta jumătate: ordinea câmpurilor schimbată pe pagina „Acasă”.
Modificarea ordinii câmpurilor în setările șablonului (stânga) afectează ordinea în care sunt redate câmpurile pe pagină (dreapta). (Vedeți versiunea GIF animată)

De asemenea, puteți modifica lățimea unui câmp de pe pagină. Doar faceți clic pe un câmp și schimbați-l. Să punem una lângă alta câmpurile „Titlu” și „Titlu”.

Captură de ecran a câmpurilor redate unul lângă altul
Dețineți controlul total asupra modului în care sunt redate câmpurile pe pagină. (Vedeți versiunea GIF animată)

Un alt exemplu de modul în care puteți personaliza și personaliza interfața de utilizator a unei pagini și a câmpurilor acesteia sunt dependențele câmpurilor de intrare. Acestea vă permit să specificați condițiile în care un anumit câmp din editorul de pagini este afișat sau necesar. Să facem câmpul „Titlu” vizibil în interfața de utilizare numai dacă utilizatorul introduce ceva în câmpul „Titlu” și să marchem câmpul „Rezumat” ca fiind necesar numai dacă utilizatorul introduce ceva în câmpul „Titlu”:

Captură de ecran a setărilor pentru dependențele câmpurilor de intrare
Câmpul „Titlu” va fi afișat pe pagină numai după ce utilizatorul a introdus ceva în câmpul „Titlu”. (Vedeți versiunea GIF animată)

Iată un videoclip care vă arată cum pot fi folosite dependențele câmpurilor de intrare pentru a îmbunătăți experiența utilizatorului în timp ce lucrați cu ProcessWire:

Cum pot fi utilizate dependențele câmpurilor de intrare pentru a îmbunătăți experiența utilizatorului în timpul lucrului cu ProcessWire

Numărul, ordinea și aspectul câmpurilor de pe o pagină sunt în totalitate sub controlul dvs. Puteți pune doar un câmp într-un șablon, deloc (nu foarte util) sau mai mult de 50 de câmpuri, 100 sau chiar mai mult. Puteți să le comandați în orice mod doriți, să specificați care sunt necesare sau vizibile și care nu și să specificați în ce circumstanțe ar trebui să fie solicitate sau vizibile. Aici strălucește abordarea fără opinie a ProcessWire.

Breviar: pagini, câmpuri, șabloane

Să recapitulăm relația tehnică dintre pagini, câmpuri și șabloane: adăugați câmpuri la șabloane și selectați un șablon atunci când creați o pagină nouă. Câmpurile pe care le vedeți când editați o pagină sunt câmpurile pe care le-ați adăugat la șablonul selectat.

Un alt mod de a privi acest lucru ar fi printr-o analogie din lumea programării:

  • Șabloanele sunt ca clasele.
  • Câmpurile sunt ca proprietățile claselor.
  • Paginile sunt exemple de clase.

Odată ce interiorizați aceste concepte, veți fi echipat cu tot ce trebuie să știți pentru a dezvolta în ProcessWire. Și motivul pentru aceasta este că filosofia ProcessWire se bazează numai pe aceste trei concepte. Destul de misto, nu?

Fișiere șablon și API: un cuplu menit să fie împreună

Locul de unde preluați datele introduse în back-end-ul ProcessWire și le scoateți în front-end este, desigur, sistemul de fișiere - mai precis, folderul /site/templates/ al instalării ProcessWire. Un șablon poate avea asociat un fișier PHP fizic cu același nume; deci, șablonul home ar avea un fișier home.php în folderul /site/templates/ .

Notă: modul în care vă dezvoltați fișierele șablon depinde în totalitate de dvs. Dacă sunteți familiarizat cu stilul WordPress de dezvoltare a lucrurilor, puteți continua așa cum v-ați obișnuit. Sau, dacă aveți o configurație destul de complexă și mare și doriți să creați o arhitectură mai sofisticată, puteți utiliza o abordare inspirată de MVC, care ar funcționa la fel de bine. Ryan Cramer are un tutorial introductiv destul de bun, intitulat „Cum să structurați fișierele șablon”, în care puteți afla diferite abordări ale dezvoltării fișierelor șablon în ProcessWire.

Codul pe care îl scrieți într-un fișier șablon va consta în principal din construcții PHP de bază (condiții if , bucle foreach , declarații echo ), markup HTML și API-ul ProcessWire. API-ul este puternic inspirat de jQuery - așa că este într-adevăr un fel de iterare și de parcurgere a conținutului pe care l-ați introdus în back-end prin metode, selectoare și capabilități de înlănțuire (interfață fluentă). Este ușor de utilizat și foarte expresiv, la fel ca jQuery.

Să începem prin a ne uita la câteva exemple simple pentru a vă ajuta să utilizați API-ul. Dar înainte de a începe, nu uitați să marcați fișa de cheat API ProcessWire, o referință utilă cu o prezentare generală a tuturor metodelor API disponibile.

Captură de ecran a Cheatsheet ProcessWire
Cheat sheet API vă va servi drept un bun însoțitor.

Lucrul pe care vrem să-l facem mai întâi este să accesăm și să scoatem conținutul câmpului unei pagini. API-ul expune o variabilă pentru ca noi să ne ocupăm de asta: $page .

Obținerea paginii curente cu variabila $page

Variabila $page conține toate câmpurile unei singure pagini. Aceasta include câmpuri încorporate (cum ar fi numele șablonului unei pagini), precum și câmpurile pe care le-ați adăugat, în calitate de dezvoltator, la șablonul paginii.

Să deschidem home.php , care este fișierul șablon al șablonului de home și să adăugăm această linie la acesta:

 echo $page->title;

Acest lucru îi spune lui ProcessWire să ia câmpul „Titlu” al paginii pe care ne aflăm în prezent („Acasă”) și să îl scoată. Să presupunem că avem și un câmp „Titlu” pe pagină, pe care dorim să-l folosim în loc de câmpul „Titlu”, dar numai dacă utilizatorul a introdus ceva în el.

 echo $page->get("headline|title");

Am folosit metoda get pentru a accesa câmpul unei pagini (deci, $page->get(“title”) este practic echivalent cu primul exemplu de cod de mai sus) și am scris “headline|title” în metoda get . Acest lucru îi spune ProcessWire să verifice mai întâi câmpul „Titlu” și să scoată conținutul titlului. Dar dacă câmpul „Titlu” este gol, atunci câmpul „Titlu” este folosit ca alternativă.

Utilizarea variabilelor API în șiruri PHP este, de asemenea, posibilă. Următoarele două instrucțiuni echo pentru afișarea numărului de copii ai unei pagini sunt echivalente:

 echo "This page has " . $page->numChildren . " children pages."; echo "This page has {$page->numChildren} children pages.";

Haideți să obținem copiii paginii noastre rădăcină (nu uitați, suntem încă în home.php ) și să le trimitem ca o listă de link-uri:

 echo "<ul>"; foreach ($page->children as $child) { echo "<li><a href='{$child->url}'>{$child->title}</a></li>"; } echo "</ul>";

Un alt exemplu de câmp încorporat (cum ar fi children și url în exemplul de mai sus) este iterarea prin toți părinții unei pagini și crearea de navigare în breadcrumb:

 echo "<ul>"; foreach ($page->parents as $parent) { echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>"; } // output the page itself at the end echo "<li>{$page->title}</li>"; echo "</ul>";

Pe pagina rădăcină („Acasă”), acesta ar scoate doar titlul, deoarece $page->parents ar fi gol.

Mai devreme, v-am arătat cum să creați miniaturi de imagine în interfața de administrare. Crearea miniaturilor se poate face și în mod programatic cu ajutorul API-ului. Să repetăm ​​toate imaginile încărcate în câmpul „Imagini”, să creăm o variantă de imagine mare la 600 de pixeli lățime cu o înălțime proporțională și o miniatură de 150 × 150 de pixeli, cu opțiuni specifice, cum ar fi setările de decupare și calitatea imaginii. În final, dorim să legăm imaginea în miniatură de imaginea mare. Sună complicat? Nu este.

 $options = array( "quality" => 90, "cropping" => "northwest" ); foreach ($page->images as $image) { $large = $image->width(600); $thumbnail = $image->size(150, 150, $options); echo "<a href='{$large->url}'><img src='{$thumbnail->url}' alt='></a>"; }

ProcessWire este destul de inteligent în acest sens, deoarece creează imagini de orice dimensiune din mers și păstrează un cache al acestora, astfel încât trebuie să creeze versiunile o singură dată.

Iată un ultim exemplu de $page pentru a vă arăta că API-ul pare că interacționați cu DOM atunci când utilizați jQuery. Să obținem ultimul copil al paginii părinte pe care ne aflăm în prezent.

 $wantedPage = $page->parent->children()->last();

Pe lângă variabila $page , API-ul expune o alta importantă: $pages .

Obținerea tuturor paginilor cu variabila $pages

Cu $pages , aveți acces la toate paginile din instalarea ProcessWire. Cu alte cuvinte, vă oferă acces la tot conținutul dvs. de oriunde .

De exemplu, ați putea avea o pagină de setări ascunsă (adică nu este accesibilă în partea din față) în instalarea ProcessWire; ați putea adăuga setări globale, cum ar fi titlul și descrierea site-ului dvs. web; și puteți accesa și scoate aceste blob-uri de conținut din orice fișier șablon doriți.

 $settings = $pages->get("template=settings"); echo "<h1>{$settings->global_title}</h1>"; echo "<p>{$settings->global_description}</p>";

Un caz obișnuit de utilizare pentru o singură pagină cu subiect a unui blog este afișarea tuturor postărilor de blog în care se face referire la subiect. Doar scrieți acest lucru în fișierul șablon al subiectului:

 $pages->find("template=blog-post, topics=$page");

Notă: topics este un câmp din șablonul blog-post care ați adăuga toate categoriile de subiecte care sunt specifice postării de blog.

Să lucrăm puțin mai mult cu motorul de selecție al ProcessWire. Permiteți-mi să vă arăt câteva exemple, trimițându-vă la site-ul web demo al ProcessWire, un director de zgârie-nori din SUA. Site-ul web demo conține multe pagini și are o arhitectură de model de date interesantă (adică lucruri precum arhitecți, orașe, clădiri și locații care se referă unele la altele) și este un caz de utilizare bun pentru a arăta ce puteți face cu selectoare.

Acest exemplu găsește toți zgârie-norii care menționează expresia „Empire State Building” în corpul lor:

 $pages->get("template=cities")->find("template=skyscraper, body*=empire state building");

Notă: Mai întâi obținem pagina cu cities șablon; apoi, obținem toate paginile cu șablonul skyscraper . Motivul pentru care putem înlănțui metodele în acest fel este că toate paginile zgârie-nori sunt sub-copii ai paginii „Orașe”.

Să găsim toate zgârie-norii de la arhitecții Adrian Smith, Eric Kuhne sau William Pereira și să sortăm rezultatele după înălțime în ordine crescătoare:

 $adrian = $pages->get("template=architect, name=adrian-smith"); $eric = $pages->get("template=architect, name=eric-kuhne"); $william = $pages->get("template=architect, name=william-pereira"); $skyscrapers = $pages->find("template=skyscraper, architects=$adrian|$eric|$william, sort=height");

Puteți optimiza codul găsind toți arhitecții solicitați într-un singur pas, în loc de trei:

 $architects = $pages->find("template=architect, name=adrian-smith|eric-kuhne|william-pereira"); $skyscrapers = $pages->find("template=skyscraper, architects=$architects, sort=height");

Notă: metoda get poate returna întotdeauna o pagină; metoda find poate returna întotdeauna mai multe pagini.

Puteți revizui în continuare codul utilizând subselectori (da, puteți avea selectoare în interiorul selectoarelor):

 $skyscrapers = $pages->find("template=skyscraper, architects=[name=adrian-smith|eric-kuhne|william-pereira], sort=height");

Alte variabile API

$page și $pages nu sunt singurele variabile API cu care puteți lucra. Există o mulțime de altele, cum ar fi $session (pentru a conecta și deconecta utilizatorii și pentru a redirecționa către alte pagini), $user (pentru a stabili o conexiune cu utilizatorul care vizualizează pagina în prezent) și $config (care sunt pentru setări specifice instalării ProcessWire). Să ne uităm la două exemple.

Mai întâi, să redirecționăm utilizatorul către pagina de pornire:

 $session->redirect($pages->get("template=home")->url);

Și să facem ceva dacă utilizatorul actual este autentificat:

 if ($user->isLoggedin()) { /* do something */ }

Extinderea funcționalității ProcessWire cu module

ProcessWire este construit pe o arhitectură modulară și ușor de extins și arată: Fiecare instalație constă din nucleul ProcessWire (esența ProcessWire, care permite funcționalitatea de bază) și un set de module preambalate (așa-numitele module de bază) care stau deasupra a miezului și extinde-l.

Module de bază

Unele dintre aceste module preambalate sunt instalate și activate implicit, iar altele sunt dezinstalate implicit. De exemplu, sistemul de comentarii încorporat al ProcessWire este un modul pe care îl puteți porni sau dezactiva în orice moment. De asemenea, lucruri precum câmpul repetitor despre care am vorbit mai devreme și suportul în mai multe limbi pentru conținut sunt practic doar module pe care le puteți instala dacă aveți nevoie de ele în proiectul dvs.

Other examples of neat little core modules are Page Names , which validates text input when you're typing a page name (automatically transforming, say, umlauts like a to ae ), and Page Path History , which keeps track of past URLs where pages have lived and automatically redirects to the new location whenever an old URL is accessed.

Finding and Installing Modules

The official modules repository is the main spot where you can find and download ProcessWire modules. On a module's page, you will find the description and purpose of the module and links to the respective GitHub repository and support forum. Module authors are highly encouraged to post their modules in the official repository because it has the highest visibility and is the place people think of first when they want to find a ProcessWire module.

Installing a module is as easy as dragging the module's files to the /site/modules/ directory and installing it in the admin GUI. There are other ways to install a module, such as by installing the Modules Manager, which enables you to browse (and install) modules without leaving the admin GUI.

Commercial Modules

While most modules are free, there are a few commercial ones, too. The ones being promoted in ProcessWire's store are by the lead developer, Ryan Cramer. There you will find the following modules:

  • ProDrafts enables you to maintain separate draft and live versions of any page. It also provides a comparison and diff tool, as well as automatic saving capabilities.
  • ProFields are a group of ProcessWire modules that help you manage more data with fewer fields, saving you time and energy.
  • ProCache (among other things) provides an impressive performance boost for your website by completely bypassing PHP and MySQL and enabling your web server to deliver pages of your ProcessWire website as if they were static HTML files.

Don't miss the screenshots and videos on the module pages to get a first impression. This is finely executed software.

There are also commercial modules outside of the official website, such as Padloper, an e-commerce platform built on top of ProcessWire. To be fair, what is definitely missing in the ProcessWire cosmos is a way for module authors to easily publish their commercial modules in a centralized spot.

How Do ProcessWire Modules Generally Compare to WordPress Plugins?

The reason why ProcessWire has so fewer modules than WordPress (approximately 400 versus more than 40,000) is not so much because it is less popular (an understatement, of course), but more because the core itself is already so feature-rich that adding a ton of modules to extend it is simply not necessary. For example, you don't need a module to create a gallery slideshow or to get the first child of something or to generate thumbnails. All of that (and much more) is already covered out of the box.

So, whereas in WordPress your typical method of solving a problem would be to search for a plugin, in ProcessWire you would first look to the tools available in core; in 90% of cases, that would provide you with the solution.

What You Can Build With ProcessWire

Because ProcessWire behaves more like a framework than a CMS (the core is actually a framework, and the CMS is an application built on top of it), the use cases for building things with ProcessWire are pretty broad. You may want to check out some websites powered by ProcessWire (especially the most liked websites).

ProcessWire is a good fit if you want to develop a JSON REST API, an image-resizing app for employees, a front end for managing millions of products (scalability is pretty impressive — you can have literally millions of pages on a single installation), a web application for displaying the financial results of companies, a simple blog, a website for a big university, or just a simple one-page informational website.

Where To Go From Here: There's A Lot To Discover

Naturally, a beginner's guide can't talk about everything the tool has to offer. So, here is a short list of other ProcessWire features, facts, links and tools worth mentioning:

  • Check out ProcessWire Weekly and ProcessWire's blog to stay up to date on the latest news.
  • ProcessWire has built-in caching mechanisms (for example, a template and markup cache).
  • Wireshell is a command-line interface for ProcessWire based on the Symphony Console component.
  • Security is a top priority for ProcessWire.
  • Visit grab.pw (isn't that the coolest domain name ever?) to download the latest stable version of ProcessWire (ZIP file, 10MB).
  • ProcessWire has a small and friendly community. The discussion board is the central place to discuss any questions and problems.
  • ProcessWire has good multi-language support. The multi-language modules are part of the prepackaged core modules.
  • ProcessWire has a transparent roadmap, and development is very active. There is a new minor release nearly every week.
  • See what others have to say about ProcessWire in the reviews section and on alternativeTo. There's also an interesting Quora thread titled “How does ProcessWire compare to WordPress.”
  • ProcessWire.tv is a searchable collection of ProcessWire tutorial videos.

rezumat

ProcessWire is a system that rewards you [for] being curious. We aim to show you how to fish so that you can catch the big fish.

This statement by Ryan Cramer, the creator of ProcessWire, encapsulates what ProcessWire is all about.

I think what resonates with a lot of people is that ProcessWire is a system that goes from simple to complex, not the other way around. It doesn't assume what you want to build, but instead lays a strong, non-opinionated foundation by offering you effective, powerful tools and leaving the rest to you. That conceptual aesthetic has, to me, a certain appeal to it.