Prikazivanje poruka korisniku u web aplikacijama. PHP AJAX CRUD: kreiranje, brisanje, uređivanje zapisa u MySQL bazi podataka PHP skripta za CRUD operacije

Pregled

Ugrađeni sistem obavještenja, prvi ikada u Joomli, omogućava vašoj aplikaciji da obavještava korisnika (ili grupu korisnika) o raznim različitim događajima. Razmišljajte o obavijestima kao o važnim upozorenjima koja bi korisnik želio pročitati i pratiti.
Obavještenja se mogu generirati svuda. U vašoj komponenti ili dodacima i kasnije prikazano unutar JomSocial sistema obavještenja.
Ovaj vodič će vam pokazati kako, ali pošto nemamo ideju o bilo kojoj komponenti treće strane koju bismo mogli koristiti:) primjeri će se raditi na dodatku zajednice koji će se pokrenuti na onAfterProfileUpdate događaju
Ako ne znate kako da kreirate dodatak koji će se aktivirati na ovom događaju, predlažemo da pogledate ovaj vodič

Ipak, implementirajte ga u svoju komponentu

Kao što je navedeno u pregledu ovog vodiča, generirat ćemo obavijesti pomoću dodatka zajednice.
Najvjerovatnije ćete htjeti kreirati obavijesti unutar svoje komponente ili dodatka. Sljedeći vodič će raditi u svakom od ovih slučajeva. Vi samo trebate odrediti u kom trenutku u vašem kodu će biti kreirano obavještenje i samo učitati datoteku JomSocial Core Libraries.

zahtijevaju_jednom JPATH_ROOT . "/components/com_community/libraries/core.php" ;

Slijedeći tutorijal objašnjen u nastavku također će dobro funkcionirati i za vaše proširenje

Priprema razvojnog okruženja

1. Pretpostavit ćemo da ste već kreirali dodatak za primjer tipa zajednice koji će se pokrenuti kada korisnik promijeni svoj profil
Ako ne, možete preuzeti prazan primjer dodatka sa , instalirati ga u Joomla i omogućiti dodatak. Imenovan je Zajednica - Primjer obavijesti
2. Idite do svoje baze podataka i ispraznite ove dvije tabele, tako da nemaju nikakve zapise

A) prefiks_community_notification
b) prefix_community_mailq

3. Imajte najmanje dva (2) korisnika na svojim lokacijama za testiranje i znajte njihove ID-ove

U ranijim verzijama Joomle, korisnički ID-ovi su uvijek počinjali od određenog broja (62, 42) U Joomli 3, ovaj broj će biti nasumičan, dakle, slika našeg okruženja za testiranje jer će definitivno biti drugačija na vašem kraju.

Prvo obavještenje

Otvorite php datoteku dodatka koja će se nalaziti u ROOT/plugins/community/example
Unutar funkcije onAfterProfileUpdate() zamijenite

CNotificationLibrary::add ( $cmd, $actor, $target, $subject, $body, $template, $params) ;

Kao što je prikazano na primjeru, notification add API ima 7 parametara

  • $cmd - je tip obavještenja. U ovoj datoteci možete vidjeti sve vrste obavještenja. ROOT/components/com_community/libraries/notificationtypes.php počevši od, ili oko reda 53. Preporučujemo korištenje tipa obavijesti system_messaging.
  • $actor - je osoba koja izvodi radnju
  • $target - je osoba ili grupa ljudi koja će primiti obavijest
  • $subject - je predmet obavještenja, u oba, iskačućem prozoru obavijesti i naslovu e-pošte
  • $body - je tijelo obavijesti putem e-pošte
  • $template - ako vam je potreban određeni šablon za korištenje, možete ga definirati ovdje. Inače, ovaj parametar može biti prazan
  • $params - prilagođeni definirani parametri
  • Znajući sve ovo, hajde da definišemo varijable koje ćemo koristiti
    Promijenite svoj plugin kod u:

    $user = CFactory::getUser(); $cmd = "system_messaging" ; // prvi param, tip aktivnosti $actor = $user -> id ; //drugi parametar - dobiti id $actor $target = "965" ; // treći param. Ko prima obavještenje? U našem dev okruženju, njegov administrator administrator sa ID-om 965. U vašem okruženju ćete najvjerovatnije htjeti da dobijete ID od vašeg objekta ili od niza korisnika. $subject = "Predmet obavještenja" ; // Predmet obavještenja, e-pošte i popup obavještenja $body = ; //Tijelo poruke u e-mailovima. $template = "" ; // Ako trebate koristiti određenu datoteku jomsocial šablona, ​​možete je definirati ovdje. $params = novi Cparameter("" ) ; // Želimo kreirati dodatni objekt params i dodijeliti mu podatke, bez potrebe da formalno definiramo klasu CNotificationLibrary:: add ( $cmd, $actor, $target, $subject, $body, $template, $params) ;

    Sada se prijavite sa bilo kojim korisnikom i promijenite informacije o profilu. Idemo u bazu podataka da vidimo šta se dogodilo.
    Idite do tabele prefix_community_notifications i pogledajte novi zapis

    Idite na tabelu prefix_community_mailq i pogledajte novi zapis

    Čestitamo! - Uspješno ste kreirali svoje prvo vlastito obavještenje koje je poslano putem e-pošte i internog JomSocial sistema obavještenja


    Potencijalna naduvanost koda

    Gornji primjer je u redu i radi, ali generalno se ne preporučuje da ga tako koristite. Umjesto toga, moglo bi se napisati ovako

    $actor = CFactory::getUser(); $params = novi Cparameter("" ) ; CNotificationLibrary:: add ( "system_messaging" , $actor -> "Ovo je poruka tijela notifikacije" , "" , $params ) ;

    Ovo je mnogo čišće i lakše za pratiti dok u osnovi radi apsolutno istu stvar kao kod prikazan iznad.

    Prilagođeni parametri obavještenja

    API za obavijesti može se proširiti bilo kojim paramom koji želite da dodate.
    Ovi parametri se mogu proslijediti bilo predlošku e-pošte, obavijesti i, naravno, jezičkom fajlu.

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = novi Cparameter("" ) ; $params -> set ("actor" , $actor -> getDisplayName () ) ; // može se koristiti kao (actor) oznaka $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Veza za oznaku (glumac) $params -> set ("url" , $link ) ; //url cijele aktivnosti. Koristi se kada pređete mišem preko avatara u prozoru s obavijestima. Može se koristiti i kao (url) oznaka u odlaznoj e-poruci. Uvjerite se da ste definirali varijablu $link:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Tema obavijesti" , "Ovo je poruka tijela obavijesti" , "" , $params ) ;

    • $params = novi Cparametar( ); - Želimo da kreiramo novi objekat params, i da mu dodelimo podatke, bez potrebe da formalno definišemo klasu.
    • $params->set("actor", $actor->getDisplayName()); - Vaše obavještenje uvijek treba da ima glumca. Ovaj parametar se može proslijediti šablonu kao (actor) tag. U prozoru za obavještenje definira korisnika koji izvodi radnju.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - URL glumca je obično url glumca. U iskačućem prozoru za obavještenje dodaje vezu na (glumac) element
    • $params->set("url", $link); - Ovo je najvažniji parametar koji uvijek morate pravilno postaviti. U prozoru za obavještenje, ovaj parametar se koristi preko slike avatara. U obavještenju e-poštom prikazuje lokaciju na kojoj se aktivnost dogodila.

    Za ovaj primjer, postavit ćemo varijablu $link da slijeće na www.google.com pa možete vidjeti kako to funkcionira

    Dodavanje niza jezika i korištenje parametara

    Posjedujući parametre koje smo upravo postavili dostupni su za korištenje iu našim jezičkim datotekama.
    Definirajmo jezičke ključeve promjenom " CNotificationLibrary::add() API

    CNotificationLibrary::add("system_messaging" , $actor -> id , "965" , JText::sprintf("PLG_COMMUNITY_EXAMPLE_SUBJECT" ) , JText::sprintf("PLG_COMMUNITY_EXAMPLE_BODY") ;

    Jezički fajl bi trebao izgledati ovako

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(glumac) ažuriran profil" PLG_COMMUNITY_EXAMPLE_BODY = "Zdravo Admin \n Ovo je e-mail da vas obavještavamo da je (glumac) ažuriran profil \n\n Ako želite da idete na Google, kliknite ovdje \n a href=" _QQ_" (url)"_QQ_">(url)"

    U ovom primjeru koristili smo oznaku (actor) i (url) za prosljeđivanje podataka obavještenjima i predlošcima e-pošte. Da vidimo kako to izgleda.
    U prozoru za obavještenje kada zadržite pokazivač miša iznad avatara, primijetite da je (url) param pokrenut i dodaje vezu na google preko avatara. Namerno, jer smo mi tako napravili :)


    ]

    U istom prozoru, kada pređete mišem preko linka aktera. Ovo je dio u kojem (glumac) odjekuje korisniku koji izvodi akciju, dok (actor_url)" vodi računa da objekt bude ispravno povezan


    Hajde da vidimo šta se dešava u redu za e-poštu


    I konačno, stvarni email koji se šalje krajnjem korisniku


    Uspjeh
    Do sada smo kreirali tri (3) parametra koja se uspješno koriste u prozoru za obavještenja i e-mailovima.

  • (glumac) - Vraća korisničko ime korisnika koji izvodi radnju
  • (actor_url) - Daje pripisati (glumcu)
  • (url) - Nije obavezno, ali ga uvijek trebate imati u obavještenju. To je glavni URL na kojem se dogodila radnja o kojoj smo obaviješteni.
  • Slično, možete definirati "

    • (meta) - ako vam treba
    • (target_url) ako vam je potreban u obavještenju.
    • (naslov) - Obično se koristi za upućivanje na objekt koji je generirao obavijest. Primjer: "Korisnik X je objavio novu fotografiju u albumu Y." Album Y je naslov ovdje
    • (title_url) - Kao i kod prethodnih, url objekta koji je generirao obavijest.
    • (poruka) - Ovaj param se može koristiti za postavljanje (i eho) poruke u tijelu JomSocial e-pošte.
    3.3K

    Prikazivanje poruka korisniku je prilično uobičajena radnja koju bi web aplikacija trebala izvršiti. Može se pojaviti prilikom obrade obrazaca, to mogu biti poruke o grešci, poruke koje vam govore da se registrujete kada korisnik pokuša pristupiti ograničenom dijelu stranice i u mnogim drugim slučajevima.

    Vrlo često, kreiranje i izlaz poruka su razdvojeni u različite HTTP zahtjeve. Po pravilu je zgodno koristiti preusmjeravanje nakon obrade obrazaca (da biste izbjegli probleme s tipkama Nazad i Osvježi), ali je istovremeno prirodni trenutak za kreiranje poruke upravo trenutak obrade obrazaca i izvođenja pratećih radnji. to. Zašto? Zamislite da bi tekst poruke trebao izgledati otprilike ovako: "Broj jedinica naručenih za proizvod 'Podloga za miš' uspješno je promijenjen sa 7 na 12." Nakon preusmjeravanja, možda na potpuno drugačiju stranicu u smislu funkcionalnosti, bit će dodatna glavobolja utvrditi što je prije urađeno.

    Najčešće se poruke prikazuju u POST zahtjevu koji obrađuje obrazac - to nije dobro, riječi "ova stranica je zastarjela" uništavaju život (kada korisnik odluči isprobati dugme Nazad).

    Neko koristi preusmjeravanje, odustaje od prijateljskih poruka.

    Istovremeno, postoji jednostavan i očigledan način da život učinite boljim. Uprkos očiglednosti, iz nekog razloga nikada nisam video da ga neko koristi - barem kada sam pogledao tuđe izvore.

    Dakle, imamo problem - poruka mora "živjeti" u različitim zahtjevima. Potreban nam je mehanizam za prijenos teksta poruke na stranicu koja bi ga trebala prikazati. Vjerovatno ste se već sjetili sesija.

    Da, generalno ste u pravu. Druge metode, na primjer preko globalne varijable, ne dozvoljavaju pohranjivanje podataka u slučaju kada se koristi preusmjeravanje (napomena Maxima Naumenka). Osim toga, obično se pobrinem da svaki ekran u aplikaciji ima mogućnost, zajedno s drugim informacijama, da prikaže poruke koje su generirane na prethodnim ekranima. Ovo je zgodno jer nema potrebe za pripremanjem posebnih ekrana za prikazivanje poruka, a korisnik ne mora ponovo kliknuti mišem. Ali, zaista, dizajner ovdje treba razmisliti – istaknuti područje u kojem bi se poruke pojavile.

    Ideja je vrlo jednostavna i može se implementirati sa nekoliko časova.

    Prvo što vam pada na pamet je kreiranje klase Message, koja bi, u stvari, predstavljala poruku u našem jednostavnom dijagramu klasa. Poruka mora biti u mogućnosti da se sačuva u sesiji, kao i da se prikaže na ekranu.

    class Poruka ( /** * Sadržaj poruke. */ var $content; /** * Konstruktor za inicijalizaciju teksta poruke. * * @param sadržaj sadržaj poruke */ funkcija Poruka($content) ( $this->content = $ sadržaj ; ) /** * Napišite poruku sesiji */ funkcija send() ( $_SESSION["session_messages"] = $this->content; ) /** * Iznesite poruku na stranicu. */ funkcija toPage() ( echo " - " . $this->content . "
    "; } }

    Varijabla $_SESSION se koristi za pristup sesiji.

    Imajte na umu da je $_SESSION niz, mi koristimo samo jedan element ovog niza sa indeksom 'session_message'.

    U ovom slučaju imamo posla s "nizom nizova" - ono što pohranjujemo u element 'session_message' je niz, ovo je lista poslanih poruka (naravno, može ih biti nekoliko).

    Ako niste uspjeli pronaći nit, vrijeme je da popravite odjeljke priručnika posvećene sesijama i nizovima.

    Možda imate pitanje. Zašto su časovi potrebni ovdje? Bilo bi moguće proći s dvije funkcije. Ali pogledajmo dalje. Možda ćemo morati kreirati poruke s različitim tipovima (informacije, greška, upozorenje) i odrediti primaoce poruka.

    Imajte na umu da se trenutno u sesiju ne stavlja sam objekat, već samo tekst poruke. OOP nam omogućava da kasnije promijenimo ponašanje metode send() bez promjene klijentskog koda koji pristupa ovoj metodi (na primjer, u budućnosti možemo upisati cijeli objekt Message u sesiju ako ima mnogo polja).

    Zamislimo da bismo to učinili koristeći funkcije. Vjerovatno bismo imali funkciju message_send($txt), kao i funkciju message_to_page($txt). Sada moramo dodati mogućnost različitog ponašanja za različite vrste poruka. Pozivi funkcije se mijenjaju: message_send($txt, $kind), message_to_page($txt, $kind). Morat ćete pročešljati cijeli kod aplikacije u potrazi za takvim funkcijama, praveći ispravke.

    Ovo se može izbjeći predviđanjem situacije unaprijed predstavljanjem poruke kao asocijativnog niza: $msg[‘txt’], $msg[‘kind’], tada će postojati samo jedan parametar u pozivima funkcije. Možete li osjetiti kako ovo pokušava postati klasa?

    Dakle, OOP vam daje priliku da imate luksuz da ne razmišljate o svemu unaprijed.

    Sljedeća klasa - Inbox - dizajnirana je upravo za to.

    class Inbox ( /** * Niz primljenih poruka. */ var $messages = array(); /** * U konstruktoru dobijamo sve primljene poruke * i brišemo ih iz sesije. */ funkcija Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->poruke = nova poruka($messages[$i]); ) ) /* očisti niz poruka */ $_SESSION["session_messages"] = array(); ) /** * Prikažite sadržaj Inbox-a na stranici. */ funkcija toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Poruka iz sistema:
    "; ) za ($i = 0; $i< $co; $i++) { $this->poruke[$i]->ToPage(); ) ) )

    Isprobajmo naš sistem za razmjenu poruka.

    Napravimo vrlo jednostavan primjer koji će odgovoriti na podnošenje obrasca prijavljivanjem broja sekundi u trenutnoj minuti.

    Sav rad sa nizovima i sesijama sakrili smo unutar klasa, a konačni kod izgleda jednostavno i lijepo.

    Kreirajte direktorij na vašem web serveru, zatim kreirajte ove tri datoteke u njemu i isprobajte skriptu. Imajte na umu da nema problema sa dugmadima Nazad i Osvježi.

    Sada zamislite da kreirate složen portal, gdje se u pravilu nalazi nekoliko blokova na stranicama, a svaki može sadržavati zasebnu aplikaciju.

    Ovdje nailazimo na dvije poteškoće:

    * Želio bih da se lista poruka pojavi u određenom dijelu stranice, a za to ste već našli dobro mjesto.
    Problem je što morate pokrenuti naredbu $inbox->toPage() tačno u trenutku koji bi odgovarao poziciji liste poruka na stranici. Ako želimo promijeniti poziciju ove liste, morat ćemo ući u kod, ali nije dobro stalno mijenjati okvir portala za to. Najbolje rješenje bi bilo napraviti izlaz poruka u obliku posebnog modula, za koji znamo samo da ga treba povezati sa okvirom.
    Odnosno, oslobodite se strogog slijeda pokretanja modula. Zaista, pošto rezultat izlaza Inbox ne zavisi od rada sistema (u ovom koraku već imamo sve podatke u sesiji), čemu onda dodatna složenost?
    * Da biste održali izgled (dizajn) liste poruka, morate voditi računa o HTML kodu, koji je tvrdo kodiran u toPage() metodama klasa Poruka i Inbox. Obično ćete morati da promenite PHP kod da biste promenili dizajn.

    Da biste pokušali riješiti prvi problem, možete kreirati bafer koji pohranjuje rezultat izlaza Inbox.

    Možda ćemo i dalje imati nekoliko stvari sličnih (Inboxu) i trebamo kreirati sistem bafera. Da ne bismo zabunili čiji je izlaz čiji, verovatno ćemo doći do imenovanja bafera. Negdje ćemo pohraniti redoslijed u skladu s kojim bi baferi trebali biti izlazni - po mogućnosti u vanjskoj datoteci da bismo olakšali izmjene.

    Ovaj pokušaj rješenja već nam daje ideju da koristimo XML kao sredstvo za pohranu međupodataka. A korištenje XSLT stilova pomoći će u rješavanju drugog problema.

    Neću se zadržavati na tome šta je XML, a šta XSLT. Ako niste upoznati s ovim stvarima, zvon.org je dobro mjesto za početak traženja.

    Ideja je da se generiše ne HTML kod, već XML struktura u toPage() metodama. Dokument stranice će biti kreiran kao string sa XML kodom (služiće kao „bafer“), a u poslednjoj fazi skripte koristićemo XSL transformaciju.

    Prvo, zamislimo šta bi trebao biti rezultat glavnog dijela koda.

    minuta 57 sekunda: 45

    O čemu se radi, lako je pogoditi - dvije poruke i formular. Imajte na umu da PHP skripta treba samo da pripremi takav string - vrlo je jednostavna. Štaviše, redoslijed glavnih oznaka nije važan - možete ih staviti na početak, na primjer, kako će biti zgodno za programera. Kako to implementirati. Možete, bez promjene bilo čega, koristiti izlazni bafer, izbaciti XML umjesto HTML koda i na kraju jednostavno snimiti izlaz u string. Ali tada ćemo izgubiti fleksibilnost - na primjer, ponekad želite poslati informacije o otklanjanju grešaka direktno na stranicu (koristeći eho). Istovremeno, PHP programeri rade na DOM modulu koji nudi napredniji način kreiranja i prosljeđivanja dokumenata stabla. Ako želimo implementirati DOM, morat ćemo redizajnirati cijelu aplikaciju, mijenjajući izlaz stringova u kreiranje DOM elemenata. Stoga, više volim da skladištim XML reprezentaciju objekata unutar samih objekata, uzastopno sastavljajući zajednički XML dokument. Nije tako teško, samo je potrebna mala modifikacija. Vidjet ćete da ova tehnika nije striktno vezana za specifičan način pohranjivanja XML podataka, i to će vam omogućiti da napravite prijelaz na korištenje DOM-a uz malo truda. Prije svega, primijetite da svaki od naših objekata ima metodu toPage(). Ova sličnost bi nas trebala natjerati da razmislimo o uvođenju nove zajedničke roditeljske klase. Neka svaka klasa koja može kreirati dijelove XML dokumenta za stranicu naslijedi od klase koja će se pobrinuti za XML reprezentaciju objekta. Nazovimo to Outputable.

    class Outputable ( /** * XML kontejner (string). */ var $output = ""; /** * Dajte sadržaj kontejnera i obrišite kontejner. * * @vratite niz sa XML podacima */ funkcija getOutput () ( $ out = $this->output; $this->output = ""; return $out; ) /** * Dodajte dio sadržaju kontejnera. * * @param string string za dodavanje * / function appendOutput($string) ( $this ->output .= $string . "n"; ) /** * "Apstraktna" metoda. */ funkcija toPage() ( ) )

    Metoda toPage() je prazna - u ovom slučaju je potrebna kao indikator kako eksterne klase „matrjoške“ treba da komuniciraju sa unutrašnjom klasom. Međutim, mogli bismo ponuditi zadanu implementaciju ovdje ako bismo primijetili da postoji mnogo objekata koji se prikazuju na stranici na isti način.

    Klase Message i Inbox će se neznatno promijeniti - sada bi obje trebale naslijediti od Outputable, a metode toPage() će se također promijeniti
    Message.php

    klasa Poruka proširuje izlaz ( /** * Sadržaj poruke. */ var $content; /** * Konstruktor za inicijalizaciju teksta poruke. * * @param sadržaj sadržaj poruke */ funkcija Poruka($content) ( $this->content = $content; ) /** * Napišite poruku sesiji */ funkcija send() ( $_SESSION["session_messages"] = $this->content; ) /** * Iznesite poruku na stranicu. * / funkcija toPage() ( $this->appendOutput("".$this->content."); ) )

    klasa Inbox proširuje Outputable ( /** * Niz primljenih poruka. */ var $messages = array(); /** * U konstruktoru primamo sve primljene poruke * i uklanjamo ih iz sesije. */ funkcija Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->poruke = nova poruka($messages[$i]); ) ) /* očisti niz poruka */ $_SESSION["session_messages"] = array(); ) /** * Prikažite sadržaj Inbox-a na stranici. */ funkcija toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->poruke[$i]->toPage(); $this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput(""); ) )

    Metoda izlaza se promijenila - sada, umjesto direktnog izlaza na stranicu, eksterna reprezentacija je za sada pohranjena u Outputable, koji "sjedi" u svakom od objekata. Metoda appendOutput() služi kao zamjena za echo() konstrukciju. Da biste dobili izlaz objekta, koristi se metoda getOutput().

    Sada da vidimo šta je klijentski dio koda, koji će riješiti isti problem kao i prije.
    index.php

    Glavna inovacija je u $global_content objektu, čije ime govori samo za sebe. U ovom slučaju, pripada klasi Outputable; u stvarnim zadacima, vjerovatno biste kreirali posebnu klasu za sadržaj stranice.

    Ako bolje pogledate, sadržaj skripte se praktično nije promijenio - isti inbox, ista toPage(). Dodano uputstvo koje prikazuje sadržaj liste poruka u sadržaju stranice. Radi raznolikosti, sada se generiraju dvije poruke.

    Da bismo sagledali rezultat, ostaje samo da se pripremi XSL predložak.
    style.xsl

    XSLT primjer

    poruka

    Šta smo postigli?

    Prije svega, možete sigurnije preuzimati složene projekte - osigurana je stvarna neovisnost modula. Redoslijed postavljanja rezultata na stranicu sada se kontrolira korištenjem eksternog XSL predloška i ne ovisi o redoslijedu po kojem se moduli izvode.

    Svaki modul koji generiše XML podatke kao rezultat svog rada može se koristiti u projektu. Inače, ovo je jedna od prednosti u odnosu na šablonske mehanizme, u kojima se kreiranje podataka sastoji od niza metoda pozivanja (assign, itd.) određenog motora, za koji ne postoji zajednički standard.

    Još jedna prednost je lakoća otklanjanja grešaka. Ako pokrenete skriptu, primijetit ćete da svaka stranica sadrži izlaz za otklanjanje grešaka - XML ​​prototip koji uvelike pojednostavljuje aplikacije za otklanjanje grešaka.

    Nešto drugo o čemu trebate razmišljati je kako kreirati objekte poruke. Nije uvijek zgodno koristiti new direktno u kodu klijenta. Ali možda je ovo tema za poseban članak.

    Za kraj, galop o izgledima:

    * iskačući prozori za listu važnih poruka
    * "stranice pošiljaoca" i "odredišne ​​stranice" u porukama
    * evidentiranje poruka u bazi podataka
    * dugme "prikaži istoriju mojih radnji"
    * statistička analiza radnji korisnika unutar sesija
    * "inteligentni asistenti" u web aplikacijama

    U KP i BUS-u, počevši od verzije 11.5, u izdanjima koja uključuju društvenu mrežu, pojavio se novi modul “Web messenger”.
    Prije nego što je pušten svima, modul je prošao vatreno krštenje na našem „Društvenom intranetu“, prikupivši čak 8 ažuriranja


    Za šest mjeseci razvoja, uradili smo mnogo

    U potpunosti smo napustili prethodni interfejs i napravili novi, zasnovan na iskustvu popularnih instant messengera.
    Prozor za dijalog je počeo da se otvara unutar stranice, lica su se pojavljivala u njemu, poruke su bile kodirane bojama i postalo je moguće lako voditi razgovor sa nekoliko ljudi u isto vreme.

    Prozor istorije je zasebna tema, svi su dugo želeli da imaju pretragu istorije, sada je konačno imamo, planiramo da dodamo kalendar za brzu navigaciju.

    Napravili smo centar za obavijesti sa različitim vrstama poruka, omogućili pregled historije njihovog prijema, a za programere jednostavan API za dodavanje i pozivanje obavijesti.

    I sve to je dostupno na svakoj stranici Vašeg sajta!

    Nažalost, nije realizovano sve što je planirano

    Prvo Ono što nismo imali vremena je da prevedemo poruke u naše stolove.
    Ovakav prelazak omogućio bi napuštanje modula „društvene mreže“, što bi dalo veću slobodu u izboru urednika, a bilo bi moguće i uvođenje grupnih ćaskanja.

    Sekunda, ovo je implementacija prave "trenutne" komunikacije. Sada modul koristi redovno okupljanje, prozivanje servera jednom svakih n-sekundi, period prozivanja varira u zavisnosti od aktivnosti komunikacije.
    Planiramo napisati poseban servis koji će održavati stalne veze i slati ažuriranja podataka po potrebi (za messenger, za live feed itd.).

    Treće, planiramo malo promijeniti sučelje, napustiti zasebnu listu kontakata i dijaloški prozor i spojiti ih u jednu cjelinu, što će nam u budućnosti omogućiti da premjestimo messenger u mobilnu aplikaciju.

    Dokumentacije još nema i neće se pojaviti do jeseni, jer... Modul se aktivno razvija i želimo ostaviti mogućnost promjene API-ja.
    Ipak, pokušat ću objaviti primjere rada sa onim dijelom API-ja na kojem je rad već završen i možete ih sigurno koristiti u svojim modulima.

    Rad sa obavještenjima (relevantno za IM počevši od verzije 11.5.2)

    Implementirali smo tri vrste obavještenja:
    - personalizirano obavještenje;
    - obavještenje iz sistema;
    - obavještenje koje zahtijeva potvrdu;

    Prije korištenja API-ja potrebno je provjeriti da li je modul instaliran na sistemu:

    if (IsModuleInstalled("im") && CModule::IncludeModule("im")) ( ) ?>

    Personalizirano obavještenje


    Ako su poruke postavljene na NOTIFY_TAG, korisnik će ih grupirati.

    Obavijest iz sistema


    $arMessageFields = array(// primalac "TO_USER_ID" => $USER->GetId(), // pošiljalac (može biti >0) "FROM_USER_ID" => 0, // tip obavijesti "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // modul koji je tražio slanje obavještenja "NOTIFY_MODULE" => "im", // simbolična oznaka za grupisanje (prikazivaće se samo jedna poruka), ako to nije potrebno, ne postavljajte parametar "NOTIFY_TAG" => "IM_CONFIG_NOTICE", // tekst obavještenja na stranici (dostupni html i BB kodovi) "NOTIFY_MESSAGE" => "[b]Pažnja: morate provjeriti i navesti ispravnu putanju do društvene mreže u postavkama modula "Instant Messaging and Notifications"" , // tekst obavijesti koji se šalje e-poštom (ili XMPP), ako nema razlika, ne postavljajte parametar //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

    Obavijest koja zahtijeva potvrdu (potvrda)


    $arMessageFields = array(// primalac "TO_USER_ID" => $USER->GetId(), // pošiljalac "FROM_USER_ID" => 2, // tip obaveštenja "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // modul koji je zahtevao slanje obaveštenja "NOTIFY_MODULE " => "kalendar", // simbolična oznaka za grupisanje (prikazivaće se samo jedna poruka), ako to nije potrebno, ne postavljajte parametar "NOTIFY_TAG" => "KALENDAR|POZIV|123|".$ USER->GetId() , // tekst obaveštenja na sajtu (dostupni html i BB kodovi) "NOTIFY_MESSAGE" => "Pozivam vas da učestvujete na sastanku "Instant poruke i obaveštenja" koji će se održati 15. marta, 2012 u 14:00", // tekst obavještenja za slanje putem e-pošte (ili XMPP), ako nema razlika, ne postavljajte parametar "NOTIFY_MESSAGE_OUT" => "Korisnik Evgeny Shelenkov vas poziva da učestvujete na sastanku "Instant poruke i obavještenja” #BR# koji će se održati 15.03.2012 u 14:00.#BR # #BR# Prihvati: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Odbijte: http://test.ru/calend.php?CONFIRM=N&CID=123", // niz koji opisuje dugmad za obavještenje "NOTIFY_BUTTONS" => Array(// 1. naziv gumba, 2. vrijednost, 3. predložak gumba , 4. prelazak na adresu nakon pritiska (opcioni parametar) Array("TITLE" => "Prihvati", " VALUE" => "Y", "TYPE" => "prihvati" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Odbij", "VALUE" => "N", "TYPE" => "otkaži" /*, "URL " => "http://test.ru/?confirm=N" */),), // simbolički kod šablona za slanje pisma, ako nije naveden, šalje se sa šablonom obaveštenja "NOTIFY_EMAIL_TEMPLATE" => " CALENDAR_INVITATION"); CIMNotify::Add($arMessageFields); ?>

    Da biste radili s ovom vrstom obavijesti, nije dovoljno samo poslati poruku, morate je i uručiti.

    Servis
    Postoje dvije opcije, najjednostavnija je praćenje linka (ako postavite 4. parametar u NOTIFY_BUTTONS).
    Nakon što slijedite link, morate pozvati sljedeći kod u svom kodu:
    Pažnja: obratite pažnju na nazive oznaka; kada pozovete brisanje, sve poruke sa tom oznakom će biti izbrisane.
    Prilikom slanja više poruka to se mora uzeti u obzir kako izvršenje radnje od strane jednog korisnika ne bi slučajno izbrisalo obavještenje svima (osim na mjestima gdje je takva logika potrebna).

    Druga opcija je na događajima.
    1. morate registrirati ovisnost

    Ne zaboravite na svoje funkcije ConfirmRequest I RejectRequest uzrokovati brisanje obavještenja CIMNotify::DeleteByTag()

    To je sve za sada, čekam vaše prijedloge u komentarima, uspješne implementacije!
    Ako želite isprobati API prije izdanja 11.5.2 u nizu sa parametrima, morate dodatno navesti "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, također opcija sa vezom u dugmadima neće raditi za potvrdne obavijesti. Ali bolje je sačekati; ažuriranje 11.5.2 treba da izađe 23. maja.

    Bolje loš niz nego delirium tremens...

    PHP AJAX CRUD: kreiranje, brisanje, uređivanje zapisa u MySQL bazi podataka

    U ovom članku ćemo naučiti kako dodati, urediti i izbrisati zapise u MySQL bazi podataka koristeći PHP. Koristili smo JQuery rukovalac koji šalje AJAX zahtjev skripti na strani servera. Rukovalac ažurira listu zapisa.

    AJAX obrazac za slanje zahtjeva za kreiranje, brisanje, uređivanje

    Prilikom dodavanja zapisa, obrazac šalje podatke PHP skripti putem AJAX zahtjeva. Ako je dodavanje uspješno, lista unosa se ponovo učitava.

    JQuery AJAX funkcije za upit CRUD baze podataka

    U JQuery AJAX funkciji imamo prebacivanje slučajeva dodaj uređivanje i brisanje. Ovi slučajevi generiraju različite nizove podataka upita i odgovora ovisno o akcijama baze podataka.

    funkcija showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) funkcija cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(message); $("#frmAdd").show(); ) funkcija callCrudAction(action,id) ( $("#loaderIcon").show(); var queryString; switch(action) ( case "add ": queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); break; case "edit": queryString = "action="+action+"&message_id="+ id + " &txtmessage="+ $("#txtmessage_"+id).val(); break; case "delete": queryString = "action="+action+"&message_id="+ id; break; ) jQuery.ajax(( url: "crud_action.php", data:queryString, tip: "POST", success:function(data)( switch(action) ( case "add": $("#comment-list-box").append(data); break; case "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); break; case "delete": $("#message_"+id).fadeOut(); break; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), error:function ()() )); )

    PHP skripta za CRUD operacije

    Sljedeći kod izvodi upite prema bazi podataka. Ova PHP skripta, nakon izvođenja CRUD akcije, ažurira zapise kao rezultat AJAX odgovora.

    require_once("dbcontroller.php"); $db_handle = novi DBController(); $action = $_POST["akcija"]; if(!empty($action)) ( switch($action) ( case "add": $result = mysql_query("INSERT INTO comment(message) VALUES("".$_POST["txtmessage"].")" ) ; if($result)($insert_id = mysql_insert_id(); echo " Uredi Izbriši " . $_POST["txtmessage"] . " "; ) prekid; case "edit": $result = mysql_query("AŽURIRAJ poruku skupa komentara = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; prekid; case "delete": if ( !empty($_POST["message_id"])) ( mysql_query("IZBRIŠI IZ komentara WHERE id=".$_POST["message_id"]); ) break; ) )

    U ovom trenutku u ovom kursu, osnova našeg dodatka je postavljena, prilagođena zakačiva je definirana i priložena je trajna poruka koja pokazuje kako zakačiva funkcionira.

    Da mi Ne jesu, nisu implementirali tipove poruka i njihov prikaz prema podacima koje je korisnik unio.

    Ali prije nego što počnemo, moramo dodati podršku za različite tipove poruka, interfejs klase koji će podržavati svaki tip poruke i strukturu podataka potrebnu za pohranjivanje takvih poruka.

    Jeste li spremni za početak?

    Radujem se nastavku tutorijala, ali postoji nekoliko stvari koje moramo razmotriti prije nego što se upustimo u izvorni kod. Provjerite imate li sljedeći softver instaliran na vašem sistemu:

    • PHP 5.6.25 i MySQL 5.6.28
    • Apache ili Nginx
    • WordPress 4.6.1
    • Vaš željeni IDE ili editor

    A ako tražite rješenje sve u jednom, ne zaboravite isprobati MAMP.

    Napredovali smo do

    Kao što je ranije pomenuto, mi smo tačno u sredini ovog kursa. Ako ste propustili neku od prvih lekcija, evo šta smo do sada obradili:

  • U prvom tutorijalu fokusirali smo se na minimalne osnove za kreiranje našeg dodatka i ono što trebate imati da biste započeli.
  • U drugom dijelu smo išli dalje s dodatkom, dodajući malo na osnovnu administrativnu stranicu u WordPress-u. Također smo dodijelili prilagođeni hook koji koristimo i pokrenuli ga na strani servera. Također smo postavili osnovne parametre za naš Messenger postavki.
  • A ovo ćemo razmotriti u završnoj fazi obuke:

  • Sve ćemo to povezati, vidjeti na djelu i učiniti dodatak javno dostupnim za preuzimanje.
  • Trenutno imamo druge zadatke, na koje ćemo se fokusirati.

    Vratimo se na posao

    Pošto smo se okrenuli poslu (a kao što je rečeno u prethodnim lekcijama), posvećeni smo daljoj realizaciji zadataka u ovom dijelu:

    U ovom vodiču ćemo nastaviti da razvijamo naš Messenger postavki dodavanjem podrške za poruke o uspjehu i neuspjehu, kao i dotičući se sigurnosnih pitanja.

    U prethodnom članku smo počeli u Settings Messenger-u, ali samo do tačke postavljanja funkcije koja će stalno prikazivati ​​obavještenje o uspjehu dok se korisnička stranica učitava.

    U ovom vodiču ćemo dodati podršku za poruke o grešci, upozorenju i uspjehu. Zatim ćemo ih prikazati na ekranu kako bismo dobili ideju o tome kako će glasnik raditi.

    Osim toga, napravit ćemo još jednu promjenu koja će dodati podršku za odbacivanje obavijesti prema nahođenju korisnika.

    Ovo je cijeli plan potrebnog rada za ovu lekciju. Počnimo.

    Postavke Messenger ekstenzija

    Zapamtite, cijela poenta Messenger-a postavki je da definiramo naš način rada sa prilagođenim porukama, prilagođenim zakačivacima i izvornim WordPress API-jem za prikazivanje poruka u kontekstu WordPress admin panela.

    Da bismo to uradili, proširićemo rad na prošloj lekciji i krenuti odavde.

    Uspješne poruke

    Pošto smo u prethodnoj lekciji počeli sa uspješnim porukama, nastavimo s njima. Sada imamo tvrdo kodiranu metodu koja prikazuje jedan trik: