Cum să vă creați propria pagină de înregistrare în WordPress Multisite. Trimiteți formularul fără reîncărcare cu jQuery AJAX Infinite signup php lang

Am o pagină principală de înregistrare care trimite date la o bază de date SQL. Cu toate acestea, aș dori ca pagina să nu fie redirecționată la trimitere (fie reușită, fie nu).

Asta am in prezent si nu merge. Nu afișează mesaje de eroare.

HTML – signup.html

Inscrie-te

JavaScript - signup.js

Funcția submit() ( $("form").submit(function(e) ( e.preventDefault(); $. (( tip: "POST", url: "înscriere. ", date: $("form") .serialize(), succes: function() ( console.log("Înscrierea a avut succes"); ) eroare: function() ( console.log("Înscrierea nu a avut succes"); ) )); ) $(document). gata(funcție() (submit(); ));

php-signup.php

query($addData) === TRUE) ( echo „Funcționează”; ) else ( echo „Nu funcționează”; ) ?>

Aici este JSFiddle.

Sper că puteți ajuta. Mulțumesc anticipat 🙂

Dacă utilizați ajax, nu trebuie să utilizați tipul de intrare ca butonul de trimitere.

$(document).ready(function() ( $("#signup").click(function(e) ( e.preventDefault(); $.ajax(( tip: "POST", url: "signup.php") , date: $(„form”).serialize() succes: function() ( console.log(„Înscrierea a avut succes”); ) eroare: function() ( console.log(„Înscrierea nu a avut succes”); ) ) ); ));

Schimbați-vă și aici

$post_FirstName = $_POST["primul"]; // numele este `primul` nu `prenume`

Aveți mai multe frâne și suporturi închise incorect

Funcția submit() ( $("form").submit(function(e) ( e.preventDefault(); $.ajax(( tip: "POST", url: "signup.php", date: $("form") ").serialize(), succes: function() ( console.log("Înscrierea a avut succes"); ),//aici eroare: function() ( console.log("Înscrierea nu a avut succes"); ) )); ));//aici ) $(document).ready(function() ( submit(); ));

Nu este nevoie să apelați funcția de trimitere. Doar acest lucru se va face (ai omis virgula și eticheta de închidere):

Noi creăm pagina proprieînregistrare pentru multisite în locul standardului wp-signup.php .

Într-o instalare tipică WordPress, pagina de înregistrare (autentificare, resetare parolă) este afișată în fișierul wp-login.php.

  • /wp-login.php - autorizare
  • /wp-login.php?action=register - înregistrare
  • /wp-login.php?action=lostpassword - resetarea parolei

Există condiții separate pentru multisite în wp-login.php. Deci, când faceți clic pe /wp-login.php?action=register pe un multisite, WordPress va redirecționa către pagina /wp-signup.php. În multe teme, pagina nu arată foarte atractivă, așa că ne vom crea propria noastră.

Site-ul principal al rețelei

În mod implicit, WordPress deschide pagina de înscriere (wp-signup.php) pe domeniul principal (site-ul web) al web-ului. Cu toate acestea, este posibil să se facă o pagină de înregistrare separată pentru fiecare site din rețea, chiar dacă acestea au teme diferite. Vom lua în considerare cazul în care toate site-urile din rețea au propria lor pagină de înregistrare, dar se folosește aceeași temă, iar site-urile diferă doar prin limbă. Dacă sunt folosite teme diferite, va fi necesar mai mult cod.

functions.php?

Nu. Numele acestui fișier pare să fie menționat în fiecare articol WordPress. În cazul nostru, ținând cont de faptul că funcționalitatea de înregistrare este concepută pentru mai multe site-uri, este logic să o mutam în plugin-uri MU care se încarcă atunci când se deschide orice site.

Digresiune lirică

Este de remarcat faptul că pluginurile MU sunt încărcate înaintea pluginurilor normale și înainte ca nucleul WordPress să fie complet încărcat, astfel încât apelarea unor funcții poate duce la erori fatale în PHP. Această încărcare „devreme” are avantajele ei. Să presupunem că în interiorul oricărei teme nu te poți agăța de unele acțiuni care funcționează chiar înainte ca fișierul functions.php să fie încărcat din temă. Un exemplu în acest sens sunt acțiunile din pluginul Jetpack de forma jetpack_module_loaded_related-posts (related-posts este numele modulului) cu care este posibil să urmăriți activitatea modulelor în Jetpack. Această acțiune nu poate fi „atașată” din fișierul temă deoarece acțiunea a fost deja declanșată înainte ca tema să fie încărcată - pluginurile sunt încărcate înaintea temelor. Puteți arunca o privire la o imagine generală a ordinii de încărcare WordPress pe pagina Action Reference din codex.

Ordinea fișierelor

Pluginurile MU pot conține orice număr de fișiere și orice structură care vi se pare logică. Urmăresc o ierarhie ca aceasta:

|-mu-plugins |-|-load.php |-|-|-selena-network |-|-|-|-signup |-|-|-|-|-plugin.php |-|-|-| -|-... |-|-|-|-jetpack |-|-|-|-|-plugin.php

În fișierul load.php sunt conectate toate „pluginurile” necesare pentru rețeaua noastră:

// Încărcați traduceri pentru toate suplimentele load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // Înregistrarea în rețea necesită WPMU_PLUGIN_DIR . „/selena-network/signup/plugin.php”; // Alte pluginuri // necesită WPMU_PLUGIN_DIR ...

Folderele cu pluginuri sunt stocate în folderul selena-network, fiecare având propriul plugin.php , pe care îl includem în load.php . Acest lucru oferă flexibilitate și capacitatea de a dezactiva și activa rapid anumite lucruri.

Adresa URL a paginii de înregistrare

Filtrul wp_signup_location este utilizat pentru a specifica adresa paginii de înscriere. Poate fi găsit în fișierul wp-login.php și este responsabil pentru redirecționarea către wp-signup.php .

Caz „înregistrare”: if (is_multisite()) ( wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php"))); ieșire;

Să adăugăm funcția noastră la mu-plugins/selena-network/signup/plugin.php , care va da adresa paginii de înregistrare pe site-ul curent:

Funcția selena_network_signup_page ($url) ( return home_url () . "/signup/"; ) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network este un prefix pe care îl folosesc în numele tuturor funcțiilor din interiorul pluginurilor MU de pe site-ul meu pentru a evita coliziunile, ar trebui să fie înlocuit cu propriul prefix unic. Adăugați prioritate de filtru 99 deoarece unele plugin-uri precum bbPress și BuddyPress pot suprascrie această adresă cu propria lor adresă (pluginurile MU sunt încărcate înaintea pluginurilor normale, vezi mai sus). Rețineți că home_url() este folosit în loc de network_site_url() pentru a menține vizitatorul pe același domeniu. Orice adresă URL poate fi folosită ca adresă.

Crearea paginii

Acum vom crea o pagină cu adresa site.com/signup/ prin interfața obișnuită, iar în folderul cu tema copilului un șablon pentru pagina noua- page-signup.php . În loc de cuvântul „înregistrare”, puteți utiliza un ID unic.

În noul șablon, trebuie să apelați funcția selena_network_signup_main(), care va afișa formularul de înscriere.

Este de remarcat faptul că întregul proces cu șabloane este opțional și, în schimb, vă puteți crea propriul cod scurt, care va apela și funcția selena_network_signup_main().

wp-signup.php și wp-activate.php

Acum să creăm o funcție care va afișa formularul de înregistrare. Pentru a face acest lucru, copiați fișierele wp-signup.php și wp-activate.php din rădăcina WordPress în mu-plugings/selena-network/signup/ (și nu uitați să le includeți în mu-plugins/selena-network /signup/plugin.php) . Alte manipulări ale fișierelor sunt extrem de dificile și lungi de descris, așa că va trebui să le faceți singur. Voi descrie exact ce trebuie făcut și voi publica fișierele sursă ale proiectului meu:

  1. La începutul fișierului, eliminați toate require , apelurile de funcție și alt cod din afara funcțiilor.
  2. Redenumiți toate funcțiile adăugând prefixe unice la nume.
  3. Înfășurați partea de jos a codului wp-signup.php în funcția selena_network_signup_main și scrieți global $active_signup la început; .
  4. Înlocuiți aspectul cu al dvs. în locurile potrivite.

În wp-activate.php trebuie să faceți același lucru:

  1. Eliminați tot codul din afara funcțiilor, includeți aspectul într-o funcție separată.
  2. Schimbați aspectul acolo unde este necesar.

Fișierul wp-activate.php este responsabil pentru pagina de activare a contului. Ca și în cazul paginii de înregistrare, trebuie să creați un șablon separat pentru aceasta, în interiorul căruia trebuie să apelați funcția din fișierul wp-activate.php.

Trimiterea de e-mailuri de activare

Pagina de înregistrare trimite un e-mail vizitatorului cu un link pentru activarea contului. În mod implicit, acest lucru este gestionat de funcția wpmu_signup_user_notification() din fișierul ms-functions.php. Funcționalitatea sa poate fi împrumutată pentru funcția sa. Motivul pentru care trebuie să încetați să utilizați această funcție este că trimite un link de activare a contului de la wp-activate.php . Puteți „dezactiva” această funcție folosind filtrul wpmu_signup_user_notification dându-i false (dacă nu se face acest lucru, scrisoarea de activare va fi trimisă de două ori, ok, de fapt două litere diferite).

Funcția armyofselenagomez_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // ... // Cod de la wpmu_signup_user_notification() function wp_mail($user_email, wp_specialchars_decode($subject), $message_headers) ; return false; ) add_filter("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

Drept urmare, pagina de înregistrare în tema Selena a devenit mult mai curată și îngrijită.

Concluzie

Există multe alte modalități nu foarte corecte pe Internet de a face același lucru - redirecționări Apache, formulare AJAX care nu vor funcționa fără Java Script etc. Nu mi-au plăcut foarte mult toate acestea, așa că am încercat să o fac la fel de corect ca posibil pe propriul meu site.

Remarc că ar trebui să editați fișierele cu atenție și să încercați să nu vă abateți prea mult de la cele originale, astfel încât pe viitor, dacă WordPress va modifica fișierele wp-signup.php și wp-activate.php, ar fi mai ușor de comparat ei să găsească schimbări.

Nu uita să te uiți la sursă toate funcțiile descrise mai sus pentru a înțelege pe deplin ce și cum se întâmplă în interiorul codului.

Primă. Protecție împotriva spammerului

Chiar și cele mai mici site-uri WordPress sunt adesea bombardate cu înregistrări spam. Puteți scrie condiții nesfârșite pentru filtrarea roboților, adesea mai degrabă ca încercarea de a crea Inteligență artificială🙂 În cazul unui multisite m-a ajutat foarte mult redirecționarea obișnuită în Apache, cu ajutorul căreia am cerut un 404 la deschiderea /wp-signup.php și /wp-acitvate.php (nu sunt Apache expert în configurare, deci regulile mele pot să nu fie foarte corecte).

RewriteEngine On RewriteBase / RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # ÎNCEPE WordPress # Reguli implicite WordPress :) # ... # END WordPress

P.S. Încerc să descriu câteva lucruri de la terți cât mai detaliat posibil, pentru că când am început, uneori nu era nimeni care să solicite și să explice multe lucruri. De asemenea, cred că astfel de sfaturi mici despre alte materiale vor împinge pe cineva să învețe ceva nou și să-și extindă aria de cunoștințe. Intrările RewriteRule folosesc expresii regulate, nu sunt deloc complicate, de exemplu, caracterul ^ înseamnă începutul unei linii.

Reclame

Multe dintre site-uri web au un formular de înregistrare pentru ca utilizatorii dvs. să se înscrie și, astfel, pot beneficia de un fel de privilegii în cadrul site-ului. În acest articol vom vedea cum să creați un formular de înregistrare în PHP și MySQL.

Vom folosi etichete simple și, de asemenea, vom folosi eticheta table pentru a proiecta pagina web Sign-Up.html. Să începem:

Listarea 1:sign-up.html

Inscrie-te

Formular de înregistrare
Nume
E-mail
nume de utilizator
Parola
Confirmă parola


Figura 1:

Descrierea paginii web sing-in.html:

După cum puteți vedea în Figura 1, există un formular de înregistrare și solicită puține date despre utilizator. Acestea sunt datele comune pe care orice site le solicită utilizatorilor sau vizitatorilor săi să creeze un ID și Parolă. Am folosit eticheta tabel pentru că pentru a afișa câmpurile de formular de pe pagina web într-un formular de aranjare, așa cum le puteți vedea în Figura 1. Pare atât de simplu, deoarece încă nu am folosit stilul CSS pe el, acum haideți să folosim stiluri CSS și să legăm Fișier în stil CSS cu pagina web sing-up.html.

Lista 2:style.css

/*Fișier CSS pentru pagina web de înscriere*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ; background-repeat:no-repeat; background-attachment:fix; background-position:center; margin-top:150px; margin-bottom:150px; margin-right:150px; margin-left:450px; padding:9px 35px; ) #button( chenar-rază:10px; lățime:100px; înălțime:40px; fundal:#FF00FF; font-weight:bold; font-size:20px; )

Lista 3: Conectați style.css cu pagina web sign-up.html



Figura 2:

Descrierea fișierului style.css:

În fișierul CSS extern am folosit câteva stiluri care ar putea arăta noi pentru tine. Cum am folosit o imagine în fundal și am pus-o în centrul paginii web. Care a devenit ușor de utilizat cu ajutorul etichetei html div. Deoarece am folosit trei ID-uri de etichete div. #button, #sing-up și #body-color și le-am aplicat toate stilurile CSS și acum puteți vedea Figura 2, cât de frumos și atractiv arată. Puteți utiliza multe alte stiluri CSS, cum ar fi stilurile CSS 2D și 3D pe el. Va arăta mai frumos decât arată acum.

După toate aceste lucrări simple, acum vom crea o bază de date și un tabel pentru a stoca toate datele în baza de date a noilor utilizatori. Înainte de a crea un tabel, ar trebui să știm ce avem nevoie de la utilizator. Pe măsură ce am conceput formularul, vom crea tabelul conform formularului de înregistrare, pe care îl puteți vedea în Figura 1 și 2.

Lista 3: Interogare pentru tabel în MySQL

CREATE TABLE WebsiteUsers (userID int(9) NOT NULL auto_increment, fullname VARCHAR(50) NOT NULL, userName VARCHAR(40) NOT NULL, email VARCHAR(40) NOT NULL, trece VARCHAR(40) NOT NULL, PRIMARY KEY(userID) );

Descrierea listei 3:

Un lucru ar trebui să știți că, dacă nu aveți facilitate MySQL pentru a utiliza această interogare, ar trebui să urmați articolul meu anterior despre . din acest link veți putea înțelege instalarea și cerințele. Și cum îl putem folosi.

În interogarea listare 3 am folosit toate acele lucruri de care avem nevoie pentru formularul de înregistrare. Deoarece există variabile de e-mail, nume complet, parolă și nume de utilizator. Aceste variabile vor stoca datele utilizatorului, pe care el/ea le va introduce în formularul de înregistrare din Figura 2 pentru înscriere.

După toate aceste lucrări, vom lucra cu programarea PHP, care este un limbaj de programare pe partea de server. De aceea trebuie să creați o conexiune cu baza de date.

Lista 4: Conexiune la baza de date

Descrierea listei 4:

Am creat o conexiune între baza de date și paginile noastre web. Dar dacă nu știți dacă funcționează sau nu, mai folosiți un lucru în ultima lista de verificare 5 pentru el.

Lista 5: verificarea conexiunii conectivității bazei de date

Lista de descriere 5:

În Lista 5 am încercat doar să vă arăt că puteți verifica și confirma conexiunea dintre baza de date și PHP. Și încă un lucru, nu vom folosi codul Listing 5 în pagina noastră web de inscriere. Pentru că este doar pentru a vă face să înțelegeți cum puteți verifica conexiunea MySQL.

Acum vom scrie o aplicație de programare PHP pentru a verifica mai întâi disponibilitatea utilizatorului și apoi a stoca utilizatorul dacă acesta este un utilizator nou pe pagina web.

Lista 6: connectivity-sign-up.php

Descrierea connectivity-sign-up.php

În această aplicație PHP am folosit cel mai simplu mod de a crea o aplicație de înscriere pentru paginile web. După cum puteți vedea, mai întâi creăm o conexiune ca lista 4. Și apoi am folosit două funcții, prima funcție este SignUP(), care este apelată de instrucțiunea if din ultima aplicație, unde prima confirmă apăsarea butonului de înregistrare. buton. Dacă este apăsat, va apela funcția SingUp și această funcție va folosi o interogare de SELECT pentru a prelua datele și a le compara cu userName și e-mailul introdus în prezent de la utilizator. Dacă numele de utilizator și adresa de e-mail sunt deja prezente în baza de date, va spune scuze, sunteți deja înregistrat

Dacă utilizatorul este nou, deoarece numele său de utilizator actual și ID-ul de e-mail nu sunt prezente în baza de date, astfel încât instrucțiunea If va apela NewUser() unde va stoca toate informațiile noului utilizator. Și utilizatorul va deveni parte a paginii web.



Figura 3

În figura 3, utilizatorul introduce date pentru a se înscrie dacă utilizatorul este un utilizator vechi al acestei pagini web, conform înregistrărilor bazei de date. Astfel, pagina web va afișa un mesaj că utilizatorul este deja înregistrat dacă utilizatorul este nou, astfel încât pagina web va afișa un mesaj că înregistrarea utilizatorului este finalizată.



Figura 4:

Pe măsură ce am introdus date în formularul de înregistrare (Figura 4), conform bazei de date, numele de utilizator și e-mailul pe care l-am introdus în formularul de înregistrare pentru înregistrare este deja prezent în baza de date. Prin urmare, ar trebui să încercăm un nou nume de utilizator și o adresă de e-mail pentru a vă înscrie cu un nou ID și o nouă parolă.



Figura 5

În figura 5, ne confirmă ce nume de utilizator și ID-ul de e-mail a introdus utilizatorul. Ambele nu sunt prezente în înregistrările bazei de date. Așadar, acum este creat un nou ID și o parolă, iar utilizatorul poate să-și folosească noul ID și parola pentru a se autentifica data viitoare.

Concluzie:

În acest articol am învățat cel mai simplu mod de a crea o pagină web de înscriere. Am învățat, de asemenea, cum se ocupă cu baza de date dacă folosim PHP și MySQL. Am încercat să vă ofer cunoștințe de bază despre funcționalitatea de înscriere a paginii web. Cum funcționează la partea din spate și cum îi putem schimba aspectul pe partea din față. Pentru orice întrebare nu ezitați și comentați.

Salutare tuturor cititorilor!

Astăzi vom lua în considerare o temă destul de importantă care este prezentată de mulți angajatori și anume multilingvismul.

Ce am vrut să spun prin a vorbi despre multilingvism. Ei bine, cu siguranță, fiecare dintre stimații mei cititori a văzut portaluri mișto de mai multe ori și, între toată grămada de informații, au găsit două mici pictograme, majoritatea cu binecunoscutele steaguri în dungi alb-albastru-roșu autohtone. Desigur, după ce am dat clic pe una dintre ele, vorbirea rusă cunoscută nouă s-a transformat în limba burgheză (), sau invers. Dar ți-ai pus vreodată întrebarea cum se face totul? Ei bine, exact despre asta voi vorbi.

Trebuie să spun imediat că pentru a lucra cu materialul care va fi prezentat aici, veți avea nevoie de suport PHP de cel puțin 4.39.

Deci, după cum știți, conținutul site-ului nostru este împărțit în dinamic și static. Prin conținut static, ne vom referi la ceea ce nu își va schimba valoarea în procesul de lucru (cuvinte cheie, text de eroare și alte gunoaie). Aici vom începe. Dar să analizăm exact cum vom schimba limba acestei valori de text. Sper că nimeni nu a sugerat să folosească excepții, deoarece acest lucru este atât de irațional încât nu poate fi mai irațional. În schimb, vă sugerez să folosiți constante (citiți despre tipul de date pe php.net). Vom declara pur și simplu un cuvânt de serviciu, care, în funcție de sensul limbii, își va schimba sensul în consecință. Cum o vom face? Da, ca toți ceilalți, vom crea două (de exemplu) fișiere diferite, ale căror nume vor avea următorul model:

Language_map.php;

După cum ați înțeles deja, în locul cuvântului „limbă” vom înlocui o valoare care caracterizează limba dată. În cazul nostru, vom folosi un cod de limbă cu două caractere (ru, en, ua, pl etc.).

Ei bine, ne-am dat seama de teoria, acum să ne punem cunoștințele în practică. Creăm două fișiere. Am creat fișiere cu traducere în engleză și rusă, iar modul în care le creați este după gustul dvs.

Fișier: en_map.php

Fișier: en_map.php

Deci, după părerea mea, nu este nimic complicat, iar tot ce este scris se supune celor mai banale legi ale PHP. În primul rând, verificăm dacă constantele au fost deja declarate; dacă da, nu le declarăm, altfel le declarăm.

Aceasta a fost partea ușoară, acum să trecem la un subiect mai dificil - traducerea părții dinamice.

Să presupunem că ai un sistem de portal mare sau un site simplu, dar tu, un programator talentat care cunoaște toate aspectele PHP, nu îl deții, ci l-ai făcut la comandă. Proprietarul este un designer complet (), care nu este un zvon, nu un spirit despre un fel de subtilități de programare, dar are o singură dorință ca totul să funcționeze și poate schimba totul. În ceea ce privește totul, aceasta este o altă poveste, dar îi vom permite totuși să schimbe parametrii de limbă ai site-ului (indiferent cu ce se distrează copilul).

Dar din nou, revenind la dilema despre „Designeri și programatori”, este necesar să menționăm din nou că un astfel de site ar trebui să fie complet, ca să spunem așa, „Ceea ce vezi este ceea ce primești”, altfel este imposibil. Prin urmare, voi încerca să fac totul astfel încât să nu provoace un tic nervos la programatori și să poată satisface designerii (adică uzabilitate).

Deci, jos cu cuvinte goale și înainte spre Berlin. Vom începe cu teorie. Deci, cum vom face distincția între limbi în conținut dinamic, care, în cel mai bun caz, este eliminat, schimbat sau chiar ce bun este în general acoperit. Constantele sunt indispensabile aici, ce să faci?

Deja aud gândurile plutind în jurul tău.

Personal, când am încercat să dau viață acestui lucru, la început am făcut-o în cel mai irațional mod, și anume, pentru a traduce articole, am împărțit câmpurile din tabel care urmau să fie traduse în două (adică am creat câmpul_eng). și câmpul the_ru) în așa fel, și mesele atât de mari s-au transformat în unele obscen uriașe. Așa că am început să caut o alternativă și crede-mă, am găsit-o. Deja te simți mai cald, da, în curând vom ajunge la cea mai tare. Am găsit o cale de ieșire din această situație, iar acum intenționez să ți-o explic pe degete, iar dacă o vei înțelege sau nu va depinde de tine. În primul rând, să cădem de acord asupra tuturor detaliilor.

Pentru început, avem nevoie, va exista un tabel în care vor fi plasate datele pentru traducere. Să presupunem că avem un tabel „articole” care va conține unele articole și trebuie să aibă, să zicem, două traduceri, dar una este necesară. Ne vor interesa doar două câmpuri cheie, în cazul nostru: titlu, descriere. Vom structura textul astfel:

<%eng%>Versiunea în engleză a articolului <%ru%>Versiunea rusă a articolului

După linie ca o combinație a acestor două structuri, aceasta va fi adăugată la câmpurile `titlu` și `descriere` din tabelul `articole`.

Această metodă va consta în căutarea primei apariții a cuvântului cheie de deschidere (să spunem<%eng%>), atunci găsim prima apariție a cuvântului cheie de închidere. Dar nu trebuie să uităm că nu avem nevoie exact de apariție, ci de lungimea structurii. În primul caz, vom adăuga lungimea structurii la prima apariție a structurii de deschidere, al doilea pas va fi găsirea lungimii structurii de închidere. Dar tu intrebi:<Как же мы получим текст?>.

Folosind funcția substr(). Primul parametru va fi textul în sine, al doilea este lungimea structurii de deschidere, iar al treilea (cel mai interesant) este diferența dintre prima apariție a structurii de închidere și lungimea textului. Da, înțeleg că acest lucru nu este atât de ușor, dar trebuie înțeles. Prin urmare, acum vom face acest lucru în practică. Am creat o funcție care va evidenția textul între etichete cheie. Va fi nevoie de trei parametri: textul care trebuie analizat, limba în care să fie analizat și o serie de structuri.

","<%/","%>")) ( $start_tag=strpos($date,$delimiters.$lang.$delimiters)+ strlen($delimiters.$lang.$delimiters); $count=(strpos($data,$delimiters.$lang.$ delimitatori)-strlen($date)) $date=substr($date,$start_tag,$count); if(trim($date)=="")( $date=NOT_ENTERED; ) return $date; ) ?>

După cum puteți vedea, este destul de lung și puteți fi confuz, dar dacă nu înțelegeți acest lucru, atunci aceasta nu este o problemă mare, pentru că există deja o funcție pentru enumerare și puțin mai departe voi lua în considerare o altă metodă pentru acelasi scop. A, și nu uitați să declarați undeva constanta de limbă NOT_ENTERED, care va fi atribuită rezultatului funcției dacă lungimea textului este zero.

Deci, am aflat cu o căutare, dar acum ne confruntăm sarcina noua, compilând text simplu într-un șir special formatat. Acest lucru este deja mult mai ușor, iar dacă cunoașteți suficient de bine PHP, atunci puteți scrie cu ușurință o astfel de funcție, iar dacă încă înoți, atunci vă rog să mergeți la birou.

Algoritmul nu este complicat și constă în substituirea în toate constructele limbajului pe o singură linie. La început, într-o criză de lene, am vrut să limitez scriptul la un anumit număr de limbi (este mai ușor să-l implementez în acest fel), dar apoi m-am răzgândit și am primit asta:

","<%/","%>")) ( if(! is_array($data)) ( die(PARAM_CHECK_ERROR); ) $data=""; $temp=""; $count=0; foreach($date ca $k=>$v) ( if(!este_șir($k)) ( break; ) $număr++; if($număr>1 & $temp=$k) ( die(EROARE_CONSTRUCTION_COUNT); ) $temp=$k; $date.=$delimitatori.$ k.$delimitatori.$v.$delimitatori.$k.$delimitatori; ) returnează $date; ) ?>

Ei bine, aici am să explic puțin. Funcția ia ca parametru o matrice. Structura matricei ar trebui să fie astfel:

„identificator de limbă” => „text”;

După ce facem o verificare, dacă parametrul primit nu este un tablou, atunci<пока Вася!>.

Dacă aceasta este încă o matrice, atunci bineînțeles că o facem și punem cheia în locul limbajului în construcție element dat matrice asociativă, iar în loc de text, textul în sine este necondiționat, adică valoarea variabilei $v. După ce îmbinăm toate datele într-o singură linie. Dar am uitat să menționez un detaliu important, cu alte cuvinte, o bucată destul de mare de text. Mai întâi, înainte de buclă, am declarat trei variabile: data, temp, count;

Numărul de variabile este numărul de iterații ale buclei și cu fiecare rundă următoare a buclei, contorul crește. Variabila de date este șirul rezultat viitor în care vor fi îmbinate toate constructele limbajului. Dar variabilele de numărare și temp sunt mai interesante. Pentru ce sunt necesare? Ei bine, probabil, majoritatea au ghicit deja citind sursa, dar pentru cei care încă nu au ghicit<дошло>Iti voi explica. Acest lucru se face pentru a verifica dacă constructul limbajului nu a fost repetat de mai multe ori. Pentru a face acest lucru, am declarat variabila count. Deoarece valoarea sa implicită este zero, verificăm dacă bucla a fost executată cel puțin o dată, deoarece dacă nu o facem, va ieși ceva de genul 2=2 sau 0=0, deoarece valoarea lui $k nu s-a schimbat încă. Deoarece verificarea va fi ignorată prima dată, atribuim o valoare variabilei $temp după verificare. Nici asta nu se face doar. La prima iterație, totul va merge bine, dar dacă totuși am atribuit o valoare înainte de verificare, atunci verificarea ar face verificarea care a fost deja menționată (2=2, 3=3 etc.). De aceea o facem astfel.

Acum, ca o concluzie logică, vom crea un mic site unde se vor aplica toate cele de mai sus:

","<%/","%>")) ( $data=substr($date, (strpos($date,$delimiters.$lang.$delimiters)+ strlen($delimiters.$lang.$delimiters)), (strpos($data,$delimiters. $lang.$delimitatori)-strlen($date))); if(trim($date)=="") ( $date=NOT_ENTERED; ) return $date; ) function compileLanguageString($date, $delimiters=array( "<%","%>","<%/","%>")) ( if(!is_array($date)) ( die(PARAM_CHECK_ERROR); ) $data=""; $temp=""; $count=0; foreach($date ca $k=>$v) ( if(!este_șir($k)) ( break; ) $număr++; if($număr>1 & $temp=$k) ( die(EROARE_CONSTRUCTION_COUNT); ) $temp=$k; $date.=$delimitatori.$ k.$delimiters.$v.$delimiters.$k.$delimiters; ) returnează $date; ) //Nu uitați de<статике>if(!isset($_GET["lang"])) ( setcookie("lang",$_GET["lang"]); header("Locație: index.php?module=home"); ) if(isset( $_COOKIE["lang"])) ( include $_COOKIE["lang"]."_map.php"; ) else (include "ru_map.php": ) if(isset($_POST["add"])) ( $description=compilateLanguageString(array($_POST["description_en"],$_POST["description_en"])); $title=compilateLanguageString(array($_POST["titlte_eng"],$_POST["title_en"])); //Procesul de adăugare la baza de date ) echo" ";ecou" ";ecou" "; $title=($_SERVER["REMOTE_ADDR"]=="127.0.0.1")? ADMIN_WELCOM: "Bună, oaspeți!"; echo $title; echo"";ecou" ";ecou"":ecou" "; [email protected] _connect("localhost","root",""); @mysql_select_db(„o bază de date”); [email protected] _query("SELECT titlu, descriere FROM `articles` LIMIT 0,1", $conn_id); if(@mysql_ num_rows($q)==0)( ARTICOLE_NEFONDITE; ) else ( [email protected] _fetch_array($q); $title=subTextByLang($row["titlu"],$lang); $description=subTextByLang($row[„descriere”],$lang); ecou"

":ecou" ";ecou" ";ecou" ";ecou"
„.ARTICLE_TITLE_TEXT.”„.$titlu”.
„.ARTICLE_DESCRIPTION_TEXT.”
".$descriere."
"; ) @mysql_close($conn_id); //Acest lucru nu este atât de rău, acum trebuie să creăm un formular pentru a adăuga un ecou articol"
";ecou" ";ecou" ";ecou" ";ecou" ";ecou" ";ecou" ";ecou" ";ecou" ";ecou"
„.ARTICLE_TITLE_TEXT. „(RO):
„.ARTICLE_TITLE_TEXT.” (RU):
„.ARTICLE_DESCRIPTION_TEXT.”(RO):
";ecou" ";ecou"
„.ARTICLE_DESCRIPTION_TEXT.”(RU):
";ecou" ";ecou"
";ecou"
"; ?>

Ei bine, asta-i tot. Cu toate acestea, există un „dar” în scenariu, autorul nu poate adăuga mai mult de două opțiuni de traducere prin formular. Nu voi, ca ceilalți autori, să am făcut asta pentru antrenamentul tău, pentru că sincer să fiu, când am ajuns în acest loc, aproape că nu mi s-a gătit capul, așa că îl las pe umerii tăi. Crede-mă, există o mulțime de soluții și sper cu adevărat că le vei găsi. În ceea ce privește funcțiile, nu pot spune în proporție de 100% că nu vor provoca un accident, dar nu ar trebui să existe erori fatale, deși se poate întâmpla orice. Dar sunt peste 60% sigur că sintaxa este ruptă, deoarece nu am testat exemplele. Și aici pentru tine cu adevărat antrenament bun La urma urmei, prinderea „puricilor” este o activitate foarte utilă!

Ei bine, cred că acest articol se poate termina. Dacă eșuați, nu conduceți răul pe bietul vostru computer, pe tastatură și cu atât mai mult pe dezvoltatorii unui limbaj atât de minunat precum PHP, nu ezitați să vă adresați tuturor eșecurilor în direcția mea. Nu cred că mă va face să mă simt mai rău, dar vei avea pe cineva pe care să-ți înlăture furia.

Ați început bine, dar declarația switch din userLanguage() pur și simplu nu se simte corect dintr-o perspectivă orientată pe obiect:

O clasă numită Limbă ar trebui să reprezinte o singură limbă care este suficient de generică pentru a se potrivi tuturor cazurilor: totuși, în momentul de față, indiferent de limbajul pe care îl reprezintă, are definițiile tuturor pur și simplu blocate în acea singură metodă.

Este întreținut? Nu chiar, nu. În acest moment aveți două limbi, pe care presupun că le cunoașteți. Cu toate acestea, dacă doriți vreodată să îl traduceți într-o altă limbă (poate folosind un alt set de caractere, veți avea probleme de spațiu în fișier, salvarea corectă a fișierului și îmbinarea traducerilor furnizate de alte persoane pentru site-ul dvs.).

În ceea ce privește utilizarea bazelor de date, clase abstracte și altele: poate doriți, deși există și alte soluții.

Soluția 1: fișier de configurare simplă

parse_ini_file() este un instrument mic foarte puternic care face exact ceea ce vă așteptați. Folosind un fișier simplu ca acesta pe care îl vom numi en.ini:

PAGE_TITLE = Titlul paginii site-ului meu HEADER_TITLE = Titlul antetului site-ului meu SITE_NAME = Site-ul meu SLOGAN = Sloganul meu aici HEADING = Titlu MENU_LOGIN = Autentificare MENU_SIGNUP = Înregistrare MENU_FIND_RIDE = Găsiți cursa MENU_ADD_RIDE = Adaugă cursa MENU_LOGOUT = Deconectare

Puteți utiliza pur și simplu: parse_ini_file("en.ini") pentru a returna o matrice exact ca în instrucțiunea dvs. switch, ceea ce va fi mult mai ușor pentru alți (non-programatori) să citească și să scrie pentru dvs. Și dacă ar fi să continuați să denumiți fișierele cu acest stil, ați putea reduce userLanguage() la ceva de genul:

Funcția publică userLanguage() ( $fișier = "/path/to/language/config/" . $this->UserLng . ".ini"; if(!file_exists($file)) ( //Handle Error ) return parse_ini_file( $fisier); )

Soluția 2: Clasa abstracte

Deoarece matricea dvs. acționează practic ca metode getter, o clasă de limbaj abstractă ar trebui să aibă în ea toate componentele de limbaj de care aveți nevoie, astfel:

Limbajul interfeței (funcția publică getPageTitle(); funcție publică getHeaderTitle(); funcție publică getSiteName(); funcție publică getSlogan(); funcție publică getHeading(); funcție publică getMenuLogin(); funcție publică getMenuSignup(); funcție publică getMenuFindRide() ; funcție publică getMenuAddRide(); funcție publică getMenuLogout(); )

Deși interfața este mică, implementarea acesteia poate produce un fișier mare, deși ar fi probabil mai clar decât stilul matricei:

Clasa engleză implementează Language ( funcția publică getHeaderTitle() ( returnează „Titlul antetului site-ului meu”; ) funcția publică getHeading() ( returnează „Titlu”; ) // etc...)

Alternativă

alternativ, puteți combina aceste stiluri și aveți un limbaj singleton cu metode getter care accesează acea matrice, adică:

Limba clasă ( private $languageArray; private $userLanguage; funcția publică __construct($language) ( $this->userLanguage = $language; $this->languageArray = self::userLanguage(); ) funcție statică privată userLanguage() ( $ fișier = "/path/to/language/config/" .$this->userLanguage .".ini"; if(!file_exists($file)) ( //Handle Error ) return parse_ini_file($file); ) funcție publică getPageTitle() ( returnează $this->languageArray["PAGE_TITLE"]; ) funcția publică getHeaderTitle() ( returnează $this->languageArray["HEADER_TITLE"]; ) //etc... )

Care va oferi beneficiile ambelor. Personal, totuși, cu excepția cazului în care intenționați să adăugați mai multe limbi în viitorul foarte apropiat, cred că soluția #2 s-ar potrivi cel mai bine.