Kako stvoriti vlastitu stranicu za registraciju u WordPress Multisite. Pošaljite obrazac bez ponovnog učitavanja koristeći jQuery AJAX Infinite php lang za prijavu

Imam glavnu stranicu za registraciju koja šalje podatke u SQL bazu podataka. Međutim, želio bih da se stranica ne preusmjerava nakon slanja (bilo uspješno ili ne).

Ovo je ono što trenutno imam i ne radi. Ne prikazuje poruke o greškama.

HTML - prijava.html

Prijavite se

JavaScript - signup.js

Submit funkcija () ($ ("obrazac"). Pošalji (funkcija (e) (e.preventDefault (); $. ((Tip: "POST", url: "signup.", podaci: $ ("obrazac")) .serialize (), uspjeh: funkcija () (console.log ("Prijava je uspjela");) pogreška: funkcija () (console.log ("Prijava nije uspjela");)));) $ (dokument). spreman (funkcija () (pošalji ();));

PHP - signup.php

upit ($ addData) === TRUE) (echo "Radi";) else (echo "Ne radi";)?>

Ovdje je JSFiddle.

Nadam se da možete pomoći. Hvala unaprijed 🙂

Ako koristite ajax onda ne morate koristiti vrstu unosa kao gumb za slanje.

$ (dokument) .ready (funkcija () ($ ("# prijava"). kliknite (funkcija (e) (e.preventDefault (); $ .ajax ((tip: "POST", url: "signup.php" , podaci: $ ("obrazac"). serialize () uspjeh: funkcija () (console.log ("Prijava je bila uspješna");) pogreška: funkcija () (console.log ("Prijava je bila neuspješna");)) );));

Također promijenite ovdje

$ post_FirstName = $ _POST ["prvi"]; // ime je `prvo` ne` ime`

Imate više kočnica i kočnica koje su pogrešno zatvorene

Funkcija submit () ($ ("obrazac"). Submit (funkcija (e) (e.preventDefault (); $ .ajax ((tip: "POST), url: "signup.php), podaci: $ ("form ") .serialize (), uspjeh: funkcija () (console.log (" Prijava je uspjela ");), // ovdje pogreška: funkcija () (console.log (" Prijava je bila neuspješna ");))); )); // ovdje) $ (dokument) .spreman (funkcija () (pošalji ();));

Nema potrebe pozvati funkciju submit. Samo ovo će biti učinjeno (propustili ste zarez i završnu oznaku):

Mi stvaramo vlastitu stranicu registracija za multisite umjesto standardnog wp-signup.php.

U tipičnoj instalaciji WordPressa, stranica za registraciju (prijava, poništavanje lozinke) prikazuje datoteku wp-login.php.

  • /wp-login.php - autorizacija
  • /wp-login.php?action=register - registracija
  • /wp-login.php?action=lostpassword - resetirajte lozinku

Postoje zasebni uvjeti za više stranica u wp-login.php. Dakle, kada kliknete na vezu /wp-login.php?action=register na višestranici, WordPress će preusmjeriti na stranicu /wp-signup.php. U mnogim temama stranica ne izgleda baš atraktivno, pa ćemo napraviti svoju.

Glavna stranica mreže

WordPress prema zadanim postavkama otvara stranicu za registraciju (wp-signup.php) na glavnoj domeni (stranici) mreže. Međutim, možete napraviti zasebnu stranicu za registraciju za svaku stranicu na mreži, čak i ako imaju različite teme. Razmotrit ćemo slučaj kada sve stranice na mreži imaju svoju stranicu za registraciju, ali se koristi ista tema i stranice se razlikuju samo po jeziku. Ako koristite različite teme, morat ćete napisati više koda.

funkcije.php?

Ne. Čini se da se naziv ove datoteke spominje u svakom članku o WordPressu. U našem slučaju, s obzirom da je funkcionalnost registracije dizajnirana za nekoliko stranica, ima smisla premjestiti je u MU dodatke koji se učitavaju kada otvorite bilo koju stranicu.

Lirska digresija

Vrijedi napomenuti da se MU dodaci učitavaju ranije od običnih dodataka i prije nego što se WordPress jezgra u potpunosti učita, pa pozivanje nekih funkcija može dovesti do fatalnih pogrešaka u PHP-u. Ovo "rano" punjenje ima i svojih prednosti. Na primjer, unutar bilo koje teme, ne možete se držati nekih radnji koje se pokreću čak i prije nego što se datoteka functions.php učita iz teme. Primjer za to su akcije iz Jetpack dodatka oblika jetpack_module_loaded_related-posts (related-posts - naziv modula) pomoću kojih je moguće pratiti aktivnost modula u Jetpacku. Nemoguće je "prianjati" za ovu radnju iz datoteke teme, jer je akcija već pokrenuta prije učitavanja teme - dodaci se učitavaju prije tema. Možete pogledati opću sliku redoslijeda učitavanja WordPress-a na stranici Referentna radnja u kodeksu.

Redoslijed datoteka

MU dodaci mogu sadržavati bilo koji broj datoteka i bilo koju strukturu koja vam se čini logičnom. Držim se nečega poput ove hijerarhije:

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

Svi potrebni "dodatci" za našu mrežu povezani su u datoteci load.php:

// Učitaj prijevode za sve dodatke load_muplugin_textdomain ("selena_network", "/ selena-network / languages ​​/"); // Mrežna prijava zahtijeva WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Drugi dodaci // zahtijevaju WPMU_PLUGIN_DIR ...

Mape dodataka pohranjene su unutar mape selena-network, svaka ima svoj plugin.php, koji uključujemo u load.php. To vam daje fleksibilnost i mogućnost brzog isključivanja i uključivanja.

Adresa stranice za registraciju

Za određivanje adrese stranice za registraciju koristi se filtar wp_signup_location. Može se pronaći unutar datoteke wp-login.php i odgovoran je za preusmjeravanje na wp-signup.php.

Slučaj "registriraj": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); izlaz;

Dodajmo našu funkciju u mu-plugins / selena-network / signup / plugin.php, koja će vratiti adresu stranice za registraciju na trenutnoj stranici:

Funkcija selena_network_signup_page ($ url) (povratak home_url (). "/ Signup /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network je prefiks koji koristim u nazivima svih funkcija unutar MU dodataka na svojoj stranici kako bih izbjegao kolizije, trebao bi biti zamijenjen mojim vlastitim jedinstvenim prefiksom. Filtar ima prioritet od 99 jer neki dodaci poput bbPress i BuddyPress mogu prebrisati ovaj URL svojim vlastitim (MU dodaci se učitavaju ranije od običnih dodataka, vidi gore). Imajte na umu da se home_url () koristi umjesto network_site_url () kako bi posjetitelj ostao na istoj domeni. Bilo koji URL može se koristiti kao adresa.

Napravite stranicu

Sada napravimo stranicu s adresom site.com/signup/ kroz uobičajeno sučelje, au mapi podređene teme predložak za našu nova stranica- page-signup.php. Umjesto riječi "prijava" može se koristiti jedinstveni ID.

Unutar novog predloška trebate pozvati funkciju selena_network_signup_main () koja će prikazati obrazac za registraciju.

Treba napomenuti da cijeli proces s predlošcima nije potreban i umjesto toga možete kreirati vlastiti kratki kod, koji će također pozvati funkciju selena_network_signup_main ().

wp-signup.php i wp-activate.php

Sada krenimo stvarati funkciju koja će prikazati obrazac za registraciju. Da biste to učinili, kopirajte datoteke wp-signup.php i wp-activate.php iz korijena WordPressa u mu-plugings / selena-network / signup / (i ne zaboravite ih povezati unutar mu-plugins / selena-network / prijava / plugin.php) ... Daljnje manipulacije s datotekama iznimno je teško i dugotrajno opisati, pa ćete ih morati učiniti sami. Samo ću opisati što točno treba učiniti i objaviti izvorne datoteke mog projekta:

  1. Na početku datoteke uklonite sve zahtjeve, pozive funkcija i drugi kod izvan funkcija.
  2. Preimenujte sve funkcije dodavanjem jedinstvenih prefiksa imenima.
  3. Zamotajte donji dio koda wp-signup.php u funkciju selena_network_signup_main i na samom početku napišite globalni $ active_signup; ...
  4. Zamijenite izgled svojim na pravim mjestima.

Unutar wp-activate.php trebate učiniti otprilike isto:

  1. Uklonite sav kod izvan funkcija, omotajte izgled u zasebnu funkciju.
  2. Promijenite izgled gdje je potrebno.

Datoteka wp-activate.php odgovorna je za stranicu za aktivaciju računa. Kao i za stranicu za registraciju, za nju morate stvoriti poseban predložak unutar kojeg pozivate funkciju iz datoteke wp-activate.php.

Šaljemo aktivacijska pisma

Stranica za registraciju šalje posjetitelju e-mail s vezom za aktivaciju računa. Prema zadanim postavkama, to radi funkcija wpmu_signup_user_notification () iz datoteke ms-functions.php. Njegovu funkcionalnost možete posuditi za svoju funkciju. Razlog za prestanak korištenja ove značajke je taj što šalje vezu za aktivaciju računa s wp-activate.php. Ovu funkciju možete "onemogućiti" pomoću filtera wpmu_signup_user_notification, dajući joj false (ako to ne učinite, aktivacijsko pismo će biti poslano dvaput, u redu, zapravo, dva različita slova).

Funkcija armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta = array ()) (// ... // Kod iz funkcije wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ message_headers); vrati false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

Kao rezultat toga, stranica za registraciju u temi Selena izgleda puno čišće i točnije.

Zaključak

Postoji mnogo drugih ne baš ispravnih načina da se isto učini na Internetu - Apache preusmjeravanja, AJAX obrasci koji neće raditi bez Java Script, itd. vlastite web stranice.

Imajte na umu da biste trebali pažljivo uređivati ​​datoteke i pokušati ne odstupati puno od originala, kako bi u budućnosti, ako WordPress promijeni datoteke wp-signup.php i wp-activate.php, bilo lakše usporediti ih kako biste ih pronašli promjene.

Ne zaboravite pogledati unutra izvor sve gore opisane funkcije kako biste u potpunosti razumjeli što se i kako događa unutar koda.

Bonus. Zaštita od spamera

Čak i najmanje WordPress stranice podliježu čestim registracijama neželjene pošte. Možete napisati beskrajne uvjete za filtriranje botova, često više poput pokušaja stvaranja umjetna inteligencija🙂 U slučaju multisitea puno mi je pomoglo uobičajeno preusmjeravanje u Apacheu, s kojim sam prilikom otvaranja /wp-signup.php i /wp-acitvate.php tražio 404 (nisam stručnjak za Apache konfiguraciju, pa moja pravila možda nisu baš točna).

RewriteEngine na RewriteBase / RewriteRule ^ wp-signup \ .php - RewriteRule ^ wp-activate \ .php - # POČNI WordPress # Ne dirajte WordPress pravila prema zadanim postavkama :) # ... # KRAJ WordPress

P. S. Pokušavam što detaljnije opisati neke stvari treće strane, jer kad sam krenuo, ponekad nije imao tko potaknuti i objasniti mnoge stvari. Također vjerujem da će takvi mali savjeti o drugim materijalima nekoga potaknuti da nauči nešto novo i proširi svoje polje znanja. Regularni izrazi se koriste u unosima RewriteRule, nisu nimalo složeni, na primjer, znak ^ znači početak retka.

Oglasi

Velik dio web-mjesta ima obrazac za registraciju na koji se vaši korisnici mogu prijaviti i stoga mogu imati koristi od neke vrste privilegija unutar stranice. U ovom članku ćemo vidjeti kako napraviti obrazac za registraciju u PHP-u i MySQL-u.

Koristit ćemo jednostavne oznake, a također ćemo koristiti tablicu za dizajn web-stranice Sign-Up.html. Počnimo:

Listing 1: sign-up.html

Prijavite se

Upisnica
Ime
E-mail
Korisničko ime
Lozinka
Potvrdi lozinku


Slika 1:

Opis web stranice sing-in.html:

Kao što možete vidjeti na slici 1, postoji obrazac za registraciju i traži malo podataka o korisniku. To su uobičajeni podaci koje bilo koja web stranica traži od svojih korisnika ili posjetitelja da kreiraju i ID i lozinku. Koristili smo oznaku tablice jer da bismo prikazali polja obrasca na web stranici u uređenom obrascu kako ih možete vidjeti na slici 1. Izgleda tako jednostavno jer još nismo koristili CSS stil na njoj, sada koristimo CSS stilove i povežemo CSS stilska datoteka s web-stranicom sing-up.html.

Listing 2: style.css

/ * CSS datoteka za web stranicu za prijavu * / # boja tijela (boja pozadine: # 6699CC;) # Prijava (slika pozadine: url ("sign-up.png"); veličina pozadine: 500px 500px ; background-repeat: ne-repeat; background-attachment: fiksno; background-position: center; margin-top: 150px; margin-bottom: 150px; margin-right: 150px; margin-left: 450px; padding: 9px 35px; ) #gumb (obrubni radijus: 10px; širina: 100px; visina: 40px; pozadina: # FF00FF; težina fonta: podebljano; veličina fonta: 20px;)

Listing 3: Povežite style.css s web-stranicom sign-up.html



Slika 2:

Opis datoteke style.css:

U vanjskoj CSS datoteci koristili smo neke stilove koji bi vam mogli izgledati novi. Kao što smo koristili sliku u pozadini i postavili je u središte web stranice. Što je postalo jednostavno za korištenje uz pomoć html div oznake. Kao što smo koristili tri ID oznake div. #button, # sing-up i # body-color i na njih smo primijenili sve CSS stilove i sada možete vidjeti sliku 2, koliko izgleda lijepo i privlačno. Na njemu možete koristiti mnoge druge CSS stilove poput 2D i 3D CSS stilova. Izgledat će ljepše nego što izgleda sada.

Nakon svih ovih jednostavnih radova sada ćemo napraviti bazu podataka i tablicu za pohranjivanje svih podataka u bazu podataka novih korisnika. Prije nego krenemo stvarati tablicu trebali bismo znati što zahtijevamo od korisnika. Kako smo dizajnirali obrazac kreirat ćemo tablicu prema obrascu za registraciju koji možete vidjeti na slikama 1 i 2.

Listing 3: Upit za tablicu u MySQL-u

CREATE TABLE WebsiteUsers (userID int (9) NOT NULL auto_increment, puni naziv VARCHAR (50) NOT NULL, korisničko ime VARCHAR (40) NOT NULL, email VARCHAR (40) NOT NULL, pass VARCHAR (40) NOT NULL (u PRIMARY) );

Opis Liste 3:

Jedna stvar koju biste trebali znati da ako nemate mogućnost MySQL za korištenje ovog upita, slijedite moj prethodni članak o tome. s ove veze moći ćete razumjeti instalaciju i zahtjeve. I kako to možemo iskoristiti.

U upitu za listing 3 koristili smo sve ono što nam je potrebno za registracijski obrazac. Kao što postoje varijable Email, Puno ime, lozinka i korisničko ime. Ove varijable pohranjuju podatke o korisniku koje će on/ona unijeti u obrazac za registraciju na slici 2 za prijavu.

Nakon svih ovih radova idemo raditi s PHP programiranjem koji je programski jezik na strani poslužitelja. Zato je potrebno stvoriti vezu s bazom podataka.

Listing 4: Veza s bazom podataka

Opis Liste 4:

Stvorili smo vezu između baze podataka i naših web stranica. Ali ako ne znate radi li ili ne, upotrijebite još jednu stvar u zadnjem popisu provjere 5 za to.

Listing 5: provjera povezanosti povezivanja baze podataka

List opisa 5:

U Listingu 5 upravo sam vam pokušao pokazati da možete provjeriti i potvrditi vezu između baze podataka i PHP-a. I još jedna stvar koju nećemo koristiti kod Listinga 5 na našoj web stranici. Jer to je samo da biste razumjeli kako možete provjeriti MySQL vezu.

Sada ćemo napisati PHP programsku aplikaciju da prvo provjerimo dostupnost korisnika, a zatim pohranimo korisnika ako je on/ona novi korisnik na web stranici.

Listing 6: connectivity-sign-up.php

Opis connectivity-sign-up.php

U ovoj PHP aplikaciji koristio sam najjednostavniji način za izradu aplikacije za prijavu za web stranice. Kao što možete vidjeti, prvo kreiramo vezu kao što je listing 4. Zatim smo koristili dvije funkcije, prva funkcija je SignUP () koju poziva if naredba iz posljednje aplikacije, gdje prvo potvrđuje pritisak na prijavu dugme. Ako se pritisne tada će pozvati funkciju SingUp i ova će funkcija koristiti upit SELECT za dohvaćanje podataka i usporedbu s korisničkim imenom i e-poštom koje je korisnik trenutno unio. Ako su korisničko ime i e-mail već prisutni u bazi podataka pa će se reći da ste već registrirani

Ako je korisnik nov jer njegovo trenutno korisničko ime i ID e-pošte nisu prisutni u bazi podataka, naredba If će pozvati NewUser () gdje će pohraniti sve informacije o novom korisniku. I korisnik će postati dio web stranice.



Slika 3

Na slici 3, korisnik upisuje podatke za prijavu ako je korisnik stari korisnik ove web stranice prema evidenciji baze podataka. Tako će web stranica prikazati poruku da je korisnik već registriran ako je korisnik nov pa će web stranica prikazati poruku da je registracija korisnika završena.



Slika 4:

Kako smo unijeli podatke u obrazac za registraciju (slika 4), prema bazi podataka koje smo korisničko ime i e-mail upisali u obrazac za prijavu, već je prisutan u bazi. Stoga bismo trebali isprobati novo korisničko ime i adresu e-pošte da se prijavimo s novim ID-om i lozinkom.



Slika 5

Na slici 5, potvrđuje nam koje je korisničko ime i email id korisnik unio. Oba nisu prisutna u zapisima baze podataka. Dakle, sada je stvoren novi ID i lozinka i korisnik može koristiti svoj novi ID i lozinku za prijavu sljedeći put.

Zaključak:

U ovom članku naučili smo najjednostavniji način izrade web stranice za prijavu. Također smo naučili kako postupa s bazom podataka ako koristimo PHP i MySQL. Pokušao sam vam dati osnovno znanje o funkcionalnosti web stranice za prijavu. Kako radi na stražnjem dijelu i kako možemo promijeniti njegov izgled na prednjem dijelu. Za bilo koji upit ne oklijevajte i komentirajte.

Pozdrav svim čitateljima!

Danas ćemo razmotriti prilično važnu temu koju iznose mnogi poslodavci, a to je višejezičnost.

Što sam mislio kad sam govorio o višejezičnosti. Pa sigurno je svaki od mojih cijenjenih čitatelja više puta vidio strme portale i između čitave hrpe informacija našao dvije male ikone, uglavnom s dobro poznatim zvjezdastim i domaćim bijelo-plavo-crvenim zastavama. Naravno, nakon klika na jedan od njih, naš poznati ruski govor pretvorio se u građanski jezik (), ili obrnuto. Ali jeste li se ikada zapitali kako se to radi. Pa, to je ono o čemu ću pričati.

Moram odmah reći da će vam za rad s materijalom koji će ovdje biti predstavljen trebati PHP podrška od najmanje 4.39.

Dakle, kao što znate, sadržaj naše stranice podijeljen je na dinamički i statički. Statičnim sadržajem ćemo se odnositi na ono što tijekom rada neće promijeniti svoje značenje (ključne riječi, tekst pogrešaka i druge gluposti). Ovdje počinjemo. Ali analizirajmo kako ćemo točno promijeniti jezik zadane tekstualne vrijednosti. Nadam se da nitko nije predložio korištenje izuzetaka, jer je to toliko iracionalno da ne može biti iracionalnije. Umjesto toga, predlažem korištenje konstanti (pročitajte o tipu podataka na php.net). Jednostavno ćemo deklarirati funkcijsku riječ, koja će, ovisno o značenju jezika, sukladno tome promijeniti svoje značenje. Kako ćemo to učiniti? Da, kao i svi ostali, napravit ćemo dvije (na primjer) različite datoteke, čiji će nazivi imati sljedeći uzorak:

Jezik_mapa.php;

Kao što ste već shvatili, umjesto riječi `jezik`, zamijenit ćemo vrijednost koja karakterizira danom jeziku... U našem slučaju koristit ćemo jezični kod od dva znaka (ru, en, ua, pl, itd.).

Pa, otkrili smo teoriju, a sada primijenimo naše znanje u praksi. Izrađujemo dvije datoteke. Napravio sam datoteke s engleskim prijevodom i ruskim, ali način na koji ga kreirate već je po vašem ukusu.

Datoteka: en_map.php

Datoteka: ru_map.php

Dakle, po mom mišljenju, nema ništa komplicirano, a sve napisano podliježe najbanalnijim PHP zakonima. Prvo provjeravamo jesu li konstante već deklarirane, ako jesu, onda ne deklariramo, inače deklariramo.

To je bio lakši dio, a sada prijeđimo na složeniju temu - prevođenje dinamičkog dijela.

Recimo da imate veliki sustav portala ili jednostavnu stranicu, ali vi, talentirani programer koji poznaje sve aspekte PHP-a, ne posjedujete ga, već ste ga napravili po narudžbi. Vlasnik je potpuni dizajner () koji nije fama, nije duh o nekakvim programerskim zavrzlamama, ali ima samo jednu želju da sve funkcionira, a mogao bi sve promijeniti. Što se svega tiče, ovo je druga priča, ali ipak ćemo mu dopustiti da promijeni jezične parametre stranice (ali što je tu je, bez obzira što se dijete zabavlja).

No, opet, vraćajući se na dilemu oko "Dizajnera i programera", potrebno je još jednom spomenuti da takva stranica mora biti u potpunosti, da tako kažem, "Što vidiš to i dobiješ", inače je nemoguće. Stoga ću pokušati učiniti sve kako ne bi izazvalo nervozu kod programera, a zadovoljilo dizajnere (misli se na upotrebljivost).

Dakle, dolje praznih riječi i naprijed u Berlin. Počet ćemo s teorijom. Dakle, kako ćemo razlikovati jezike od dinamičkog sadržaja, koji se, u najboljem slučaju, uklanja, mijenja ili će se čak nešto dobro zataškati. Konstante ovdje nisu dovoljne, što učiniti?

Već čujem misli kako lebde oko tebe.

Osobno, kada sam to pokušao oživjeti, isprva sam to radio na najiracionalniji način, naime, da bih preveo članke, podijelio sam polja u tablici koja su se trebala prevesti na dva (tj. kreirao sam hrv. polje i ru polje) na takav način, i tako su se veliki stolovi pretvorili baš bezobrazno ogromni. Tako sam počeo tražiti alternativu, i vjerujte mi, našao sam je. Već vam je toplije, da, uskoro ćemo doći na najtoplije. Našao sam izlaz iz ove situacije, a sada vam to namjeravam objasniti na prste, a hoćete li razumjeti ili ne, ovisit će o vama. Prvo se dogovorimo oko svih detalja.

Za početak nam je potrebna tablica u kojoj će se nalaziti podaci za prijevod. Recimo da imamo tablicu `articles` u koju će se smjestiti neki članci, a moraju imati recimo dva prijevoda, ali jedan je obavezan. Zanimat će nas samo dva ključna, u našem slučaju, polja: naziv, opis. Tekst ćemo strukturirati na sljedeći način:

<%eng%>Engleska verzija članka <%ru%>Ruska verzija članka

Nakon toga, niz je kombinacija ove dvije strukture i bit će dodan u polja "naslov" i "opis" u tablici "članak".

Ova metoda će se sastojati od pronalaženja prvog pojavljivanja početne ključne riječi (npr<%eng%>), tada ćemo pronaći prvo pojavljivanje ključne riječi za zatvaranje. Ali ne smijemo zaboraviti da nam ne treba točno ulaz, već duljina strukture. U prvom slučaju ćemo prvom pojavljivanju otvorne strukture dodati duljinu konstrukcije, drugi korak će biti pronaći duljinu konstrukcije za zatvaranje. Ali pitaš:<Как же мы получим текст?>.

Korištenje funkcije substr (). Prvi parametar je sam tekst, drugi je duljina početne strukture, a treći (najzanimljiviji) je razlika između prvog pojavljivanja završne strukture i dugog teksta. Da, razumijem da nije tako lako, ali to treba razumjeti. Stoga ćemo to sada učiniti u praksi. Napravio sam funkciju koja će istaknuti tekst između ključne oznake... Trebat će tri parametra: tekst za raščlanjivanje, jezik za raščlanjivanje, niz konstrukcija.

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

Kao što vidite, prilično je dugo i možete se zbuniti, ali ako ovo niste razumjeli, onda to nije veliki problem, jer već postoji funkcija za nabrajanje, a malo dalje ću razmotriti drugu metodu za istu svrhu. Da, i ne zaboravite negdje deklarirati jezičnu konstantu NOT_ENTERED, koja će biti dodijeljena rezultatu rada funkcije ako je duljina teksta jednaka nuli.

Dakle, shvatili smo to grubom silom, ali sada se pojavljuje pred nama novi zadatak, kompilacija običnog teksta u poseban formatirani niz. Ovo je već puno lakše, a ako dovoljno dobro poznajete PHP, onda možete jednostavno napisati takvu funkciju, a ako još plivate, molimo idite u ured.

Algoritam nije kompliciran i sastoji se od zamjene svih jezičnih konstrukcija u jednom retku. Isprva sam, u naletu lijenosti, htio ograničiti skriptu na određeni broj jezika (na ovaj način je lakše implementirati), ali onda sam se predomislio i dobio ovo:

","<%/","%>")) (if (! is_array ($ data)) (die (PARAM_CHECK_ERROR);) $ data =" "; $ temp =" "; $ count = 0; foreach ($ podaci kao $ k => $ v) ( if (! is_string ($ k)) (prekid;) $ count ++; if ($ count> 1 & $ temp = $ k) (die (ERROR_CONSTRUCTION_COUNT);) $ temp = $ k; $ podaci. = $ delimiteri . $ k. $ graničnici. $ v. $ graničnici. $ k. $ graničnici;) vraćanje $ podataka;)?>

Pa, ovdje ću malo objasniti. Funkcija uzima niz kao parametar. Struktura niza trebala bi biti ovakva:

"identifikator jezika" => "tekst";

Nakon toga provjeravamo da ako primljeni parametar nije niz tada<пока Вася!>.

Ako je ovo još uvijek niz, onda ga, naravno, ponavljamo i stavljamo ključ na mjesto jezika u konstrukciji ovog elementa asocijativni niz, a umjesto teksta, naravno, sam tekst, odnosno vrijednost varijable $ v. Zatim spajamo sve podatke u jedan redak. Ali zaboravio sam spomenuti jedan važan detalj, drugim riječima, prilično velik dio teksta. Prvo, prije petlje, deklarirali smo tri varijable: data, temp, count;

Varijabla count je broj iteracija petlje, a sa svakim sljedećim krugom petlje, brojač se povećava. Podatkovna varijabla budući je rezultirajući niz u koji će se spojiti sve jezične konstrukcije. Ali varijable count i temp su zanimljivije. Za što su oni potrebni? Pa, vjerojatno je većina već pogodila čitajući izvor, ali za one koji još nisu<дошло>Objasnit ću. To se radi kako bi se provjerilo da se jezična konstrukcija nije ponovila više od jednom. Zato smo deklarirali varijablu count. Budući da je njezina zadana vrijednost nula, provjeravamo da li je petlja izvršena barem jednom, jer ako to ne učinimo, izaći će nešto poput 2 = 2 ili 0 = 0, jer vrijednost $ k još nije promijenjena .... Budući da će provjera biti zanemarena prvi put, nakon provjere dodjeljujemo vrijednost varijabli $temp. To se također radi s razlogom. U prvoj iteraciji sve će ići u redu, ali ako bismo ipak dodijelili vrijednost prije provjere, tada bi provjera obavila provjeru koja je već spomenuta (2 = 2, 3 = 3, itd.). Zato to radimo na ovaj način.

Sada, kao logičan zaključak, napravit ćemo malu stranicu na kojoj će se primijeniti sve gore navedeno:

","<%/","%>")) ($ data = substr ($ podaci, (strpos ($ podaci, $ delimiteri. $ lang. $ graničnici) + strlen ($ delimiteri. $ lang. $ graničnici)))), (strpos ($ podaci, $ graničnici . $ lang. $ delimiters) -strlen ($ data))); if (trim ($ data) == "") ($ data = NOT_ENTERED;) vrati $ data;) funkcija compilateLanguageString ($ data, $ delimiters = array ( "<%","%>","<%/","%>")) (if (! is_array ($ data)) (die (PARAM_CHECK_ERROR);) $ data =" "; $ temp =" "; $ count = 0; foreach ($ podaci kao $ k => $ v) ( if (! is_string ($ k)) (prekid;) $ count ++; if ($ count> 1 & $ temp = $ k) (die (ERROR_CONSTRUCTION_COUNT);) $ temp = $ k; $ podaci. = $ delimiteri . $ k. $ delimiteri. $ v. $ delimiteri. $ k. $ delimiteri;) return $ data;) // Ne zaboravite na<статике>if (! isset ($ _ GET ["lang"])) (setcookie ("lang", $ _ GET ["lang"]); zaglavlje ("Location: index.php? module = home");) if ( isset ( $ _COOKIE ["lang"])) (uključuje $ _COOKIE ["lang"]. "_ Map.php";) else (uključuje "ru_map.php":) if (isset ($ _ POST ["add" ])) ( $ description = compilateLanguageString (niz ($ _ POST ["description_en"], $ _ POST ["description_ru"])); $ title = compilateLanguageString (niz ($ _ POST ["titlte_eng"], $ _ POST ["title_ru"])); // Proces dodavanja u bazu podataka) echo " "; jeka" "; jeka" "; $ title = ($ _ SERVER [" REMOTE_ADDR "] ==" 127.0.0.1 ")? ADMIN_WELCOM:" Pozdrav, gosti! "; echo $ title; echo""; jeka" "; jeka"": jeka" "; [e-mail zaštićen] _connect ("localhost", "root", ""); @mysql_select_db ("neka baza podataka"); [e-mail zaštićen] _query ("ODABERI naslov, opis IZ LIMIT' članaka 0,1", $ conn_id); if (@mysql_ num_rows ($ q) == 0) (ARTCILES_NOT_FOUNDED;) else ( [e-mail zaštićen] _dohvati_niz ($ q); $ title = subTextByLang ($ red ["naslov"], $ lang); $ description = subTextByLang ($ red ["opis"], $ lang); jeka "

": jeka" "; jeka" "; jeka" "; jeka"
".ARTICLE_TITLE_TEXT."". $ title."
". ARTICLE_DESCRIPTION_TEXT."
". $ opis."
";) @mysql_close ($ conn_id); // Nije tako loše, sada moramo stvoriti obrazac za dodavanje odjeka članka"
"; jeka" "; jeka" "; jeka" "; jeka" "; jeka" "; jeka" "; jeka" "; jeka" "; jeka"
".ARTICLE_TITLE_TEXT." (HR):
".ARTICLE_TITLE_TEXT." (RU):
". ARTICLE_DESCRIPTION_TEXT." (HR):
"; jeka" "; jeka"
". ARTICLE_DESCRIPTION_TEXT." (RU):
"; jeka" "; jeka"
"; jeka"
"; ?>

Pa to je sve. Međutim, postoji jedno "ali" u scenariju, autor ne može dodati više od dvije opcije prijevoda kroz obrazac. Neću, kao i ostatak autora, da sam ovo učinio za tvoj trening, jer da budem iskren, kad sam došao na ovo mjesto, glava mi se skoro nije kuhala, pa to ostavljam na tvojim ramenima. Vjerujte, rješenja ima puno, a nadam se da ćete ih pronaći. Što se tiče funkcija, ne mogu 100% reći da neće uzrokovati kvar, ali ne bi trebalo biti fatalnih grešaka, iako se svašta može dogoditi. Ali sam preko 60% siguran da je sintaksa pokvarena, budući da nisam testirao primjere. I ovdje za tebe stvarno dobar trening uostalom, hvatanje "buha" je vrlo korisna aktivnost!

Pa, vjerujem da ovaj članak može završiti. Ako ne uspijete, nemojte tjerati zlo na svoje jadno računalo, na tipkovnicu, a još više na programere tako divnog jezika kao što je PHP, slobodno se pozabavite svim svojim promašajima u mom smjeru. Ne mislim da će mi zbog toga biti gore, ali imat ćete na koga natjerati svoj bijes.

"Dobro ste započeli, ali naredba switch u userLanguage () jednostavno se ne čini ispravnim iz objektno orijentirane perspektive:

Klasa pod nazivom Jezik trebala bi predstavljati jedan jezik koji je dovoljno generički da stane u sve slučajeve: međutim u ovom trenutku, koji god jezik predstavlja, ima definicije svih njih samo ugurane u tu jednu metodu.

Je li moguće održavati? Ne baš, ne. Trenutno imate dva jezika, za koje pretpostavljam da znate. Međutim, ako ga ikada poželite prevesti na drugi jezik (možda koristeći drugi skup znakova, "naići ćete na probleme s prostorom u datoteci, ispravno spremanje datoteke i spajanje u prijevode koje su drugi ljudi dali za vašu web-lokaciju.

Što se tiče korištenja baza podataka, apstraktnih klasa i tako dalje: možda biste htjeli, iako postoje i druga rješenja.

Rješenje 1: Jednostavna konfiguracijska datoteka

parse_ini_file () je vrlo moćan mali alat koji radi točno ono što očekujete. Koristeći jednostavnu datoteku poput ove koju ćemo nazvati en.ini:

PAGE_TITLE = Naslov stranice moje web stranice HEADER_TITLE = Naslov zaglavlja moje web stranice SITE_NAME = SLOGAN moje web stranice = Moj slogan ovdje HEADING = Naslov MENU_LOGIN = Prijava MENU_SIGNUP = Prijavite se MENU_FIND_RIDE = Pronađite vožnju MENU_ADD_RIDE = Dodajte vožnju MENU_LOGOUT = Odjava

Možete jednostavno koristiti: parse_ini_file ("en.ini") da vratite niz točno kao u vašem switch naredbi, što će drugim (ne-programerima) biti puno lakše čitati i pisati umjesto vas. A ako biste zatim nastavili s imenovanjem datoteka ovim stilom, mogli biste smanjiti userLanguage () na nešto poput:

Javna funkcija userLanguage () ($ datoteka = "/ put / do / jezik / konfiguracija /". $ Ovo-> UserLng. ".Ini"; ako (! File_exists ($ datoteka)) (// Pogreška rukovanja) vrati parse_ini_file ( $ datoteka;)

Rješenje 2: Sažetak razred

Kako vaš niz u osnovi djeluje kao getter metode, klasa apstraktnog jezika trebala bi u sebi imati sve jezične komponente koje su vam potrebne, na primjer:

Jezik sučelja (javna funkcija getPageTitle (); javna funkcija getHeaderTitle (); javna funkcija getSiteName (); javna funkcija getSlogan (); javna funkcija getHeading (); javna funkcija getMenuLogin (); javna funkcija getMenuSignup (); javna funkcija getMenuFindRide () ; javna funkcija getMenuAddRide (); javna funkcija getMenuLogout ();)

Iako je sučelje malo, njegova implementacija može proizvesti veliku datoteku, iako bi vjerojatno bila jasnija od stila niza:

Klasa engleski implementira Jezik (javna funkcija getHeaderTitle () (vraćanje "Naslov zaglavlja moje web stranice";) javna funkcija getHeading () (vraćanje "Naslov";) // itd ...)

Alternativa

Alternativno, možete kombinirati ove stilove i imati singleton Language s metodama dobivanja koje pristupaju tom nizu, tj.:

Jezik klase (privatni $ languageArray; privatni $ userLanguage; javna funkcija __construct ($ jezik) ($ this-> userLanguage = $ jezik; $ this-> languageArray = self :: userLanguage ();) privatna statička funkcija userLanguage () ($ file = "/ path / to / language / config /". $ this-> userLanguage. ".ini"; if (! file_exists ($ datoteka)) (// Handle Error) return parse_ini_file ($ file);) javna funkcija getPageTitle () (vrati $ this-> languageArray ["PAGE_TITLE"];) javna funkcija getHeaderTitle () (vrati $ this-> languageArray ["HEADER_TITLE"];) // itd ...)

Što će pružiti prednosti i jednima i drugima. Osobno, osim ako "ne planirate dodati još jezika u vrlo bliskoj budućnosti, vjerujem da bi vam rješenje broj 2 najbolje odgovaralo.