Shfaqja e mesazheve për përdoruesin në aplikacionet në internet. PHP AJAX CRUD: krijimi, fshirja, redaktimi i regjistrimeve në skriptin PHP të bazës së të dhënave MySQL për operacionet CRUD

Vështrim i përgjithshëm

Sistemi i integruar i njoftimeve, i pari ndonjëherë në Joomla, lejon aplikacionin tuaj të mbajë përdoruesin (ose grupin e përdoruesve) të informuar për ngjarje të ndryshme. Mendoni për njoftimet si sinjalizime të rëndësishme që përdoruesi do të ishte i interesuar t'i lexonte dhe mbani gjurmët e tyre.
Njoftimet mund të gjenerohen kudo. Në komponentin ose shtojcat tuaja dhe më vonë shfaqet brenda sistemit të njoftimeve JomSocial.
Ky tutorial do t'ju tregojë se si, por meqenëse nuk kemi ide për ndonjë komponent të palës së tretë që mund të përdorim:) shembujt do të bëhen në një shtojcë të komunitetit që do të aktivizohet në ngjarjen onAfterProfileUpdate
Nëse nuk dini si të krijoni një shtojcë që do të aktivizohet në këtë ngjarje, ju sugjerojmë të kontrolloni këtë udhëzues

Gjithsesi, duke e zbatuar atë në komponentin tuaj

Siç u tha në përmbledhjen e këtij tutoriali, ne do të gjenerojmë njoftime duke përdorur shtojcën e komunitetit.
Me shumë mundësi do të dëshironi të krijoni njoftime brenda komponentit ose shtojcës suaj. Tutoriali i mëposhtëm do të funksionojë në cilindo nga këto raste. Ju vetëm duhet të përcaktoni se në cilën pikë të kodit tuaj do të krijohet njoftimi dhe thjesht të ngarkoni skedarin JomSocial Core Libraries.

kërkon_një herë JPATH_ROOT . "/components/com_community/libraries/core.php";

Ndjekja e tutorialit të shpjeguar më poshtë do të funksionojë mirë edhe për zgjerimin tuaj

Përgatitja e Mjedisit Zhvillimor

1. Ne do të supozojmë se ju jeni krijuar tashmë një shtojcë shembulli i tipit të komunitetit i cili do të aktivizohet kur përdoruesi të ndryshojë profilin e tij
Nëse jo, mund të shkarkoni një shtojcë shembull boshe nga , ta instaloni në Joomla dhe të aktivizoni shtojcën. Është emërtuar Komuniteti - Shembull i njoftimeve
2. Navigoni në bazën tuaj të të dhënave dhe zbrazni këto dy tabela, në mënyrë që të mos kenë fare regjistrime

A) njoftimi i parashtesës së komunitetit
b) prefiksi_komuniteti_mailq

3. Keni të paktën dy (2) përdorues në vendet tuaja të testimit dhe njihni ID-të e tyre

Në versionet e mëparshme të Joomla-s, ID-të e përdoruesve kanë filluar gjithmonë nga numri i specifikuar (62, 42) Në Joomla 3, ky numër do të jetë i rastësishëm, prandaj, fotografia e mjedisit tonë të testimit, sepse do të jetë patjetër e ndryshme në fundin tuaj.

Njoftimi i Parë

Hapni skedarin e shtojcës php i cili do të gjendet në ROOT/plugins/community/shembull
Brenda funksionit onAfterProfileUpdate() zëvendësoni

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

Siç tregohet në shembullin, api i shtimit të njoftimit ka 7 parametra

  • $cmd - është lloji i njoftimit. Ju mund të shihni të gjitha llojet e njoftimeve në këtë skedar. ROOT/components/com_community/libraries/notificationtypes.php duke filluar nga, ose rreth linjës 53. Ne rekomandojmë përdorimin e llojit të njoftimit të mesazheve të sistemit.
  • $aktor - është personi që kryen veprimin
  • $target - është personi ose grupi i njerëzve që do të marrin njoftimin
  • $subject - është tema e njoftimit, si në dritaren kërcyese të njoftimit ashtu edhe në titullin e emailit
  • $body - është trupi i mesazhit të njoftimit me email
  • $template - nëse keni nevojë për shabllon specifik për t'u përdorur, mund ta përcaktoni këtu. Përndryshe, ky parametër mund të jetë bosh
  • $params - parametra të përcaktuar me porosi
  • Duke ditur të gjitha këto, le të përcaktojmë variablat që do të përdorim
    Ndrysho kodin e shtojcës në:

    $user = CFactory::getUser(); $cmd = "system_messaging" ; // parametri i parë, lloji i aktivitetit $actor = $user -> id ; //parametri i dytë - merrni ID-në e $actor $target = "965" ; // param i tretë. Kush merr njoftim? Në mjedisin tonë dev, përdoruesi i tij administrator me id 965. Në mjedisin tuaj, me shumë mundësi do të dëshironi të merrni ID-në nga objekti juaj ose nga grupi i përdoruesve. $subject = "Subjekti i njoftimit" ; // Subjekti i të dyjave, email-i dhe njoftimet kërcyese $body = ; //Mesazhi trupor në email. $template = "" ; // Nëse keni nevojë të përdorni skedar specifik shabllon jomsocial, mund ta përcaktoni këtu. $params = CPparameter i ri("" ); // Ne duam të krijojmë një objekt paramesh shtesë dhe t'i caktojmë të dhëna, pa pasur nevojë të përcaktojmë zyrtarisht një klasë CNotificationLibrary:: add ($cmd, $actor, $target, $subject, $body, $template, $params) ;

    Tani identifikohuni me çdo përdorues dhe ndryshoni informacionin e profilit. Le të shkojmë në bazën e të dhënave për të parë se çfarë ka ndodhur.
    Navigoni te tabela prefix_community_notifications dhe vëzhgoni rekordin e ri

    Navigoni te tabela prefix_community_mailq dhe shikoni rekordin e ri

    urime! - Ju keni krijuar me sukses njoftimin tuaj të parë vetë i cili është dërguar përmes emailit dhe sistemit të brendshëm të njoftimeve JomSocial


    Bloat e kodit të mundshëm

    Shembulli i mësipërm është i mirë, dhe funksionon, por në përgjithësi nuk rekomandohet përdorimi i tillë. Në vend të kësaj, mund të shkruhet kështu

    $actor = CFactory::getUser(); $params = CPparameter i ri("" ); CNotificationLibrary:: add ( "system_messaging", $actor -> "Ky është mesazhi i trupit të njoftimit" , "" , $params ) ;

    Kjo është shumë më e pastër dhe më e lehtë për t'u ndjekur, ndërsa në thelb bën absolutisht të njëjtën gjë si një kod i treguar më sipër.

    Parametrat e personalizuar të njoftimit

    Një API njoftimi mund të zgjerohet me çdo param që dëshironi të shtoni.
    Këto parametra mund t'i kalohen ose shabllonit të postës elektronike, njoftimit dhe, natyrisht, skedarit të gjuhës.

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = CPparameter i ri("" ); $params -> set ("actor" , $actor -> getDisplayName () ); // mund të përdoret si etiketë (actor) $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Lidhje për etiketën (actor) $params -> set ("url" , $link ) ; //url e të gjithë aktivitetit. Përdoret kur rri pezull mbi avatar në dritaren e njoftimeve. Mund të përdoret si etiketë (url) edhe në emailet dalëse. Sigurohuni që të keni përcaktuar variablin $link:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Subjekti i njoftimit", "Ky është mesazhi i trupit të njoftimit", "" , $params ) ;

    • $params = Cparametër i ri( ); - Ne duam të krijojmë një objekt të ri params dhe t'i caktojmë të dhëna, pa pasur nevojë të përcaktojmë zyrtarisht një klasë.
    • $params->set("actor", $actor->getDisplayName()); - Njoftimi juaj duhet të ketë gjithmonë një aktor. Ky param mund t'i kalohet shabllonit si etiketë (aktor). Në dritaren e njoftimit, ai përcakton përdoruesin që kryen një veprim.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - URL-ja e aktorit është zakonisht url-ja e një aktori. Në dritaren kërcyese të njoftimit, ai shton lidhjen me elementin (aktor).
    • $params->set("url", $link); - Ky është parametri më i rëndësishëm që duhet të vendosni gjithmonë siç duhet. Në dritaren e njoftimit, ky param përdoret mbi imazhin e avatarit. Në njoftimin me email, ai i bën jehonë vendndodhjes ku ka ndodhur aktiviteti.

    Për këtë shembull, ne do të vendosim variablin $link në lands on www.google.com kështu që ju mund të shihni se si funksionon

    Shtimi i vargut të gjuhës dhe përdorimi i parametrave

    Duke pasur parametrat që sapo vendosëm janë të disponueshëm për t'u përdorur edhe në skedarët tanë të gjuhës.
    Le të përcaktojmë çelësat e gjuhës duke ndryshuar " CNotificationLibrary::add() API

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

    Skedari i gjuhës duhet të duket kështu

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "profili (aktori) i përditësuar" PLG_COMMUNITY_EXAMPLE_BODY = "Përshëndetje administrator \n Ky është posta elektronike për t'ju informuar se (aktori) profilin e përditësuar \n\n Nëse dëshironi të shkoni në Google, klikoni këtu \n a href=" _QQ_" (url)"_QQ_">(url)"

    Në këtë shembull, ne kemi përdorur etiketën (actor) dhe (url) për t'i kaluar të dhënat në të dy shabllonet, njoftimet dhe emailet. Le të shohim se si duket.
    Në dritaren e njoftimit kur qëndroni pezull mbi avatar, vini re se parametri (url) është futur dhe shton lidhjen në google mbi avatar. Është e qëllimshme, sepse ne e bëmë kështu :)


    ]

    Në të njëjtën dritare, kur rri pezull mbi lidhjen e aktorit. Kjo është pjesa ku (aktori) i bëri jehonë përdoruesit që kryen një veprim, ndërsa (actor_url)" u kujdes që objekti të lidhet siç duhet


    Le të shohim se çfarë ndodh në radhën e postës elektronike


    Dhe së fundi, emaili aktual që i dërgohet përdoruesit fundor


    Sukses
    Deri më tani, kemi krijuar tre (3) parametra që janë përdorur me sukses në dritaren e njoftimeve dhe emailet.

  • (aktor) - Kthen emrin e përdoruesit të përdoruesit që kryen veprimin
  • (actor_url) - Jep atribut ndaj (aktorit)
  • (url) - Nuk është e detyrueshme, por duhet ta keni gjithmonë në njoftimin tuaj. Është url-ja kryesore ku ka ndodhur veprimi për të cilin jemi njoftuar.
  • Në mënyrë të ngjashme, ju mund të përcaktoni "

    • (objektivi) - nëse keni nevojë për të
    • (target_url) nëse ju nevojitet në njoftimin tuaj.
    • (titulli) - Përdoret zakonisht për t'iu referuar një objekti që gjeneroi njoftim. Shembull: "Përdoruesi X postoi një foto të re në albumin Y." Albumi Y është titulli këtu
    • (title_url) - Ashtu si me ato të mëparshme, url-ja e një objekti që gjeneroi njoftim.
    • (mesazh) - Ky param mund të përdoret për të vendosur (dhe jehonë) mesazhin në trupin e emailit JomSocial.
    3.3 mijë

    Shfaqja e mesazheve te përdoruesi është një veprim mjaft i zakonshëm që duhet të kryejë një aplikacion në internet. Mund të ndodhë gjatë përpunimit të formularëve, mund të jenë mesazhe gabimi, mesazhe që ju thonë të regjistroheni kur një përdorues përpiqet të hyjë në një pjesë të kufizuar të faqes dhe në shumë raste të tjera.

    Shumë shpesh, krijimi dhe dalja e mesazheve ndahen në kërkesa të ndryshme HTTP. Si rregull, është i përshtatshëm për të përdorur një ridrejtim pas përpunimit të formularëve (për të shmangur problemet me butonat Kthehu dhe Rifresko), por në të njëjtën kohë, momenti natyror për krijimin e një mesazhi është pikërisht momenti i përpunimit të formularëve dhe kryerjes së veprimeve shoqëruese. atë. Pse? Imagjinoni që teksti i mesazhit të duket diçka si kjo: "Numri i njësive të porositura për artikullin "Mouse Pad" është ndryshuar me sukses nga 7 në 12." Pas një ridrejtimi, ndoshta në një faqe krejtësisht të ndryshme për sa i përket funksionalitetit, do të jetë një dhimbje koke shtesë për të përcaktuar se çfarë është bërë më parë.

    Më shpesh, mesazhet shfaqen në kërkesën POST që përpunon formularin - kjo nuk është e mirë, fjalët "kjo faqe është e vjetëruar" prishin jetën (kur përdoruesi vendos të provojë butonin Kthehu).

    Dikush përdor një ridrejtim, duke hequr dorë nga mesazhet miqësore.

    Në të njëjtën kohë, ekziston një mënyrë e thjeshtë dhe e qartë për ta bërë jetën më të mirë. Pavarësisht qartësisë, për disa arsye nuk kam parë kurrë që dikush ta përdorte atë - të paktën kur shikoja burimet e njerëzve të tjerë.

    Pra, kemi një problem - mesazhi duhet të "jetojë" në kërkesa të ndryshme. Ne kemi nevojë për një mekanizëm për të transferuar tekstin e mesazhit në faqen që duhet ta shfaqë atë. Ju ndoshta ju kujtohet tashmë për seancat.

    Po, në përgjithësi keni të drejtë. Metodat e tjera, për shembull përmes një ndryshoreje globale, nuk lejojnë ruajtjen e të dhënave në rastin kur përdoret një ridrejtim (shënim nga Maxim Naumenko). Plus, zakonisht sigurohem që çdo ekran në aplikacion të ketë aftësinë, së bashku me informacione të tjera, të shfaqë mesazhe që janë krijuar në ekranet e mëparshme. Kjo është e përshtatshme sepse nuk ka nevojë të përgatiten ekrane të veçanta për shfaqjen e mesazheve dhe përdoruesi nuk duhet të klikojë përsëri miun. Por, në të vërtetë, projektuesi duhet të mendojë këtu - të nxjerrë në pah zonën në të cilën do të shfaqen mesazhet.

    Ideja është shumë e thjeshtë dhe mund të zbatohet me disa klasa.

    Gjëja e parë që vjen në mendje është krijimi i një klase Mesazhi, e cila në fakt do të përfaqësonte një mesazh në diagramin tonë të thjeshtë të klasës. Mesazhi duhet të jetë në gjendje të ruhet në seancë, si dhe të shfaqet në ekran.

    class Message ( /** * Përmbajtja e mesazhit. */ var $content; /** * Konstruktori për inicializimin e tekstit të mesazhit. * * @param përmbajtje përmbajtja e mesazhit */ funksioni Message($content) ( $this->content = $ përmbajtje ;) /** * Shkruani një mesazh në seancë. */ funksioni send() ( $_SESSION["session_messages"] = $this->përmbajtja; ) /** * Nxjerr një mesazh në faqe. */ funksion toPage() (echo " - " . $this->content . "
    "; } }

    Ndryshorja $_SESSION përdoret për të hyrë në sesion.

    Vini re se $_SESSION është një grup, ne po përdorim vetëm një element të këtij grupi me indeksin 'session_message'.

    Në këtë rast, kemi të bëjmë me një "arresë vargjesh" - ajo që ruajmë në elementin "sesion_message" është një grup, kjo është lista e mesazheve të transmetuara (natyrisht, mund të ketë disa prej tyre).

    Nëse nuk e gjetët temën, është koha për të parë seksionet e manualit kushtuar sesioneve dhe grupeve.

    Ju mund të keni një pyetje. Pse nevojiten klasa këtu? Do të ishte e mundur të kaloni me dy funksione. Por le të shohim më tej. Mund të na duhet të krijojmë mesazhe me lloje të ndryshme (info, gabim, paralajmërim) dhe të përcaktojmë marrësit e mesazheve.

    Ju lutemi vini re se për momentin nuk është vetë objekti që futet në seancë, por vetëm teksti i mesazhit. OOP na lejon të ndryshojmë më vonë sjelljen e metodës send() pa ndryshuar kodin e klientit që akseson këtë metodë (për shembull, në të ardhmen mund të shkruajmë të gjithë objektin Message në seancë nëse ka shumë fusha).

    Le të imagjinojmë se do ta bënim këtë duke përdorur funksione. Ndoshta do të kishim një funksion message_send($txt) dhe gjithashtu një funksion message_to_page ($txt). Tani duhet të shtojmë aftësinë për të pasur sjellje të ndryshme për lloje të ndryshme mesazhesh. Thirrjet e funksionit ndryshojnë: mesazh_send ($txt, $lloj), mesazh_te_page ($txt, $lloj). Ju do të duhet të krehni të gjithë kodin e aplikacionit në kërkim të funksioneve të tilla, duke bërë korrigjime.

    Kjo mund të shmanget duke parashikuar situatën paraprakisht duke paraqitur mesazhin si një grup shoqërues: $msg['txt'], $msg['lloj'], atëherë do të ketë vetëm një parametër në thirrjet e funksionit. A e ndjeni se si kjo po përpiqet të bëhet një klasë?

    Pra, OOP të jep mundësinë të kesh luksin të mos mendosh gjithçka paraprakisht.

    Klasa tjetër - Inbox - është krijuar vetëm për këtë.

    class Inbox ( /** * Grup mesazhesh të marra. */ var $messages = array(); /** * Në konstruktor, marrim të gjitha mesazhet e marra * dhe i fshijmë nga sesioni. */ Funksioni Inbox() ( nëse (is_array($ _SESSION["mesazhet_sesioneve"])) ($mesazhet = $_SESSION["mesazhet_session"]; $co = sizeof($mesazhet); për ($i = 0; $i< $co; $i++) { $this->mesazhe = Mesazh i ri ($mesazhe[$i]); ) ) /* pastroj grupin e mesazheve */ $_SESSION["session_messages"] = array(); ) /** * Shfaqni përmbajtjen e Inbox-it në faqe. */ funksioni toPage() ( $co = sizeof($this->mesazhet); if ($co > 0) ( echo "Mesazhi nga sistemi:
    "; ) për ($i = 0; $i< $co; $i++) { $this->mesazhet[$i]->ToPage(); ) ))

    Le të provojmë sistemin tonë të mesazheve.

    Le të krijojmë një shembull shumë të thjeshtë që do t'i përgjigjet një paraqitjeje formulari duke raportuar numrin e sekondave në minutën aktuale.

    Ne e fshehëm të gjithë punën me vargje dhe sesione brenda klasave, dhe kodi përfundimtar duket i thjeshtë dhe i bukur.

    Krijoni një direktori në serverin tuaj të internetit, më pas krijoni këto tre skedarë në të dhe provoni skriptin. Ju lutemi vini re se nuk ka probleme me butonat "Kthehu" dhe "Rifresko".

    Tani imagjinoni që po krijoni një portal kompleks, ku, si rregull, ka disa blloqe në faqe dhe secila prej tyre mund të përmbajë një aplikacion të veçantë.

    Këtu hasim dy vështirësi:

    * Do të doja që lista e mesazheve të shfaqet në një pjesë të caktuar të faqes dhe ju tashmë keni gjetur një vend të mirë për këtë.
    Problemi është se ju duhet të ekzekutoni komandën $inbox->toPage() pikërisht në momentin që do të korrespondonte me pozicionin e listës së mesazheve në faqe. Nëse duam të ndryshojmë pozicionin e kësaj liste, do të duhet të futemi në kod, por nuk është mirë të ndryshojmë vazhdimisht kornizën e portalit për këtë. Zgjidhja më e mirë do të ishte të bënim daljen e mesazheve në formën e një moduli të veçantë, për të cilin dimë vetëm se duhet të lidhet me kornizën.
    Kjo do të thotë, çlirohuni nga sekuenca e rreptë e nisjes së moduleve. Në të vërtetë, meqenëse rezultati i daljes në Inbox nuk varet nga funksionimi i sistemit (në këtë hap ne tashmë i kemi të gjitha të dhënat në seancë), atëherë pse është kompleksiteti shtesë?
    * Për të ruajtur pamjen (dizajnin) e listës së mesazheve, duhet të kujdeseni për kodin HTML, i cili është i koduar në metodat toPage() të klasave Message dhe Inbox. Në mënyrë tipike, do t'ju duhet të ndryshoni kodin PHP në mënyrë që të ndryshoni dizajnin.

    Për të provuar të zgjidhni problemin e parë, mund të krijoni një buffer që ruan rezultatin e daljes së Inbox.

    Ndoshta do të kemi akoma disa gjëra të ngjashme (me Inbox) dhe duhet të krijojmë një sistem buffer. Për të mos ngatërruar se kush është prodhimi i kujt, ndoshta do të vijmë në emërtimin e buferëve. Ne do të ruajmë diku sekuencën në përputhje me të cilën duhet të dalin buferët - mundësisht në një skedar të jashtëm për t'i bërë ndryshimet më të lehta.

    Kjo përpjekje për një zgjidhje tashmë na jep idenë e përdorimit të XML si një mjet për ruajtjen e të dhënave të ndërmjetme. Dhe përdorimi i stileve XSLT do të ndihmojë në zgjidhjen e problemit të dytë.

    Unë nuk do të ndalem në atë që është XML dhe çfarë është XSLT. Nëse nuk jeni të njohur me këto gjëra, zvon.org është një vend i mirë për të filluar kërkimin.

    Ideja është të gjenerohet jo kodi HTML, por një strukturë XML në metodat toPage(). Dokumenti i faqes do të krijohet si një varg me kod XML (ai do të shërbejë si një "buffer"), dhe në fazën e fundit të skriptit do të përdorim një transformim XSL.

    Së pari, le të imagjinojmë se çfarë duhet të jetë rezultati i pjesës kryesore të kodit.

    minuta 57 sekonda: 45

    Ajo që është është mjaft e lehtë të merret me mend - dy mesazhe dhe një formular. Ju lutemi vini re se skripti PHP duhet vetëm të përgatisë një varg të tillë - është shumë i thjeshtë. Për më tepër, rendi i etiketave kryesore nuk është i rëndësishëm - mund t'i vendosni ato në fillim, për shembull, siç do të jetë e përshtatshme për programuesin. Si ta zbatoni atë. Ju mund, pa ndryshuar asgjë, të përdorni buferimin e daljes, të nxirrni XML në vend të kodit HTML dhe në fund thjesht të kapni daljen në një varg. Por atëherë ne do të humbasim fleksibilitetin - për shembull, ndonjëherë ju dëshironi të nxirrni informacionin e korrigjimit direkt në faqe (duke përdorur echo). Në të njëjtën kohë, zhvilluesit e PHP janë duke punuar në një modul DOM që ofron një mënyrë më të avancuar të krijimit dhe kalimit të dokumenteve të pemës. Nëse duam të implementojmë DOM-in, do të duhet të ridizajnojmë të gjithë aplikacionin, duke ndryshuar daljen e vargjeve në krijimin e elementeve DOM. Prandaj, unë preferoj të ruaj paraqitjen XML të objekteve brenda vetë objekteve, duke mbledhur në mënyrë sekuenciale një dokument të përbashkët XML. Nuk është aq e vështirë, thjesht ka nevojë për një modifikim të vogël. Do të shihni që kjo teknikë nuk është e lidhur rreptësisht me një mënyrë specifike të ruajtjes së të dhënave XML dhe kjo do t'ju lejojë të bëni kalimin në përdorimin e DOM me pak përpjekje. Para së gjithash, vini re se secili nga objektet tona ka një metodë toPage(). Kjo ngjashmëri duhet të na bëjë të mendojmë për prezantimin e një klase të re të përbashkët prindërore. Lëreni çdo klasë që mund të krijojë pjesë të një dokumenti XML për një faqe të trashëgojë nga një klasë që do të kujdeset për paraqitjen XML të objektit. Le ta quajmë Outputable.

    class Outputable ( /** * kontejner XML (string). */ var $output = ""; /** * Jepni përmbajtjen e kontejnerit dhe pastroni kontejnerin. * * @kthejeni një varg me të dhëna XML */ funksion getOutput () ( $ out = $this->output; $this->output = ""; ktheni $out; ) /** * Shtoni një pjesë në përmbajtjen e kontejnerit. * * @param vargun për të shtuar * / funksion appendOutput($string) ( $this ->output .= $string . "n"; ) /** * Metoda "Abstrakte". */ funksioni toPage() ( ) )

    Metoda toPage() është bosh - në këtë rast nevojitet si një tregues se si duhet të komunikojnë klasat e jashtme "matryoshka" me klasën e brendshme. Megjithatë, ne mund të ofrojmë një zbatim të paracaktuar këtu nëse vëmë re se ka shumë objekte që shfaqen në faqe në të njëjtën mënyrë.

    Klasat Message dhe Inbox do të ndryshojnë pak - ato tani duhet të trashëgojnë të dyja nga Outputable dhe metodat toPage() do të ndryshojnë gjithashtu
    Mesazh.php

    class Message extensions Outputable ( /** * Përmbajtja e mesazhit. */ var $content; /** * Konstruktori për inicializimin e tekstit të mesazhit. * * @param përmbajtje përmbajtja e mesazhit */ funksioni Mesazhi($content) ( $this->përmbajtja = $content; ) /** * Shkruani një mesazh në seancë. / funksioni toPage() ( $this->appendOutput("".$this->përmbajtja.""); ) )

    class Inbox extensions Outputable ( /** * Grup mesazhesh të marra. */ var $messages = array(); /** * Në konstruktor, ne marrim të gjitha mesazhet e marra * dhe i heqim ato nga sesioni. */ Funksioni Inbox( ) ( nëse (është_array ($_SESSION["mesazhet_session"])) ($mesazhet = $_SESSION["session_messages"]; $co = sizeof($mesazhet); për ($i = 0; $i< $co; $i++) { $this->mesazhe = Mesazh i ri ($mesazhe[$i]); ) ) /* pastroj grupin e mesazheve */ $_SESSION["session_messages"] = array(); ) /** * Shfaqni përmbajtjen e Inbox-it në faqe. */ funksioni toPage() ( $co = sizeof($this->mesazhe); $this->appendOutput(""); për ($i = 0; $i< $co; $i++) { $this->mesazhet[$i]->toPage(); $this->appendOutput($this->mesazhe[$i]->getOutput()); ) $this->appendOutput(""); ) )

    Metoda e daljes ka ndryshuar - tani, në vend që të dalë drejtpërdrejt në faqe, paraqitja e jashtme ruhet për momentin në Outputable, e cila "ulet" në secilin prej objekteve. Metoda appendOutput() shërben si zëvendësim për konstruktin echo(). Për të marrë daljen e një objekti, përdoret metoda getOutput().

    Tani le të shohim se cila është pjesa e klientit të kodit, e cila do të zgjidhë të njëjtin problem si më parë.
    indeks.php

    Risia kryesore është në objektin $global_content, emri i të cilit flet vetë. Në këtë rast, ajo i përket klasës Outputable; në detyrat e jetës reale, ndoshta do të krijoni një klasë të veçantë për përmbajtjen e faqes.

    Nëse shikoni nga afër, përmbajtja e skriptit praktikisht nuk ka ndryshuar - e njëjta kuti hyrëse, e njëjta toPage(). U shtua një udhëzim që shfaq përmbajtjen e listës së mesazheve në përmbajtjen e faqes. Për shumëllojshmëri, tani janë krijuar dy mesazhe.

    Për të parë rezultatin, mbetet vetëm përgatitja e shabllonit XSL.
    stil.xsl

    Shembull XSLT

    mesazh

    Çfarë kemi arritur?

    Para së gjithash, ju mund të merrni më me siguri projekte komplekse - sigurohet pavarësia e vërtetë e moduleve. Rendi në të cilin vendosen rezultatet në faqe tani kontrollohet duke përdorur një shabllon të jashtëm XSL dhe nuk varet nga rendi në të cilin ekzekutohen modulet.

    Çdo modul që gjeneron të dhëna XML si rezultat i punës së tij mund të përdoret në një projekt. Nga rruga, ky është një nga avantazhet ndaj motorëve shabllon, në të cilin krijimi i të dhënave përbëhet nga një sekuencë e metodave të thirrjes (caktimi, etj.) e një motori specifik, për të cilin nuk ka një standard të përbashkët.

    Një avantazh tjetër është lehtësia e korrigjimit. Nëse ekzekutoni skriptin, do të vini re se çdo faqe përmban dalje debugimi - një prototip XML që thjeshton shumë aplikacionet e korrigjimit.

    Diçka tjetër për të cilën duhet të mendoni është se si të krijoni objekte mesazhi. Nuk është gjithmonë i përshtatshëm për të përdorur të reja direkt në kodin e klientit. Por ndoshta kjo është një temë për një artikull të veçantë.

    Së fundi, një galop rreth perspektivave:

    * Dritare pop-up për një listë të mesazheve të rëndësishme
    * "faqet e dërguesit" dhe "faqet e destinacionit" në mesazhe
    * Regjistrimi i mesazheve në bazën e të dhënave
    * butoni "shfaq historinë e veprimeve të mia"
    * analiza statistikore e veprimeve të përdoruesit brenda sesioneve
    * "Asistentë inteligjentë" në aplikacionet në internet

    Në KP dhe BUS, duke filluar nga versioni 11.5, në botimet që përfshijnë një rrjet social, është shfaqur një modul i ri "Web Messenger".
    Para se të publikohej për të gjithë, moduli iu nënshtrua një pagëzimi me zjarr në "Intranetin tonë social", duke mbledhur deri në 8 përditësime


    Në gjashtë muaj zhvillim, ne kemi bërë shumë

    Ne braktisëm plotësisht ndërfaqen e mëparshme dhe krijuam një të re, bazuar në përvojën e lajmëtarëve të çastit të njohur.
    Dritarja e dialogut filloi të hapej brenda faqes, fytyrat u shfaqën në të, mesazhet ishin të koduara me ngjyra dhe u bë e mundur të vazhdoni me lehtësi një bisedë me disa njerëz në të njëjtën kohë.

    Dritarja e historisë është një temë më vete, të gjithë kanë dashur prej kohësh të kenë një kërkim historik, tani më në fund e kemi atë, po planifikojmë të shtojmë një kalendar atje për navigim të shpejtë.

    Ne krijuam një qendër njoftimesh me lloje të ndryshme mesazhesh, siguruam mundësinë për të parë historikun e marrjes së tyre dhe për zhvilluesit një API të thjeshtë për shtimin dhe rikujtimin e njoftimeve.

    Dhe e gjithë kjo është e disponueshme në çdo faqe të faqes tuaj!

    Fatkeqësisht, jo gjithçka që ishte planifikuar u zbatua

    Së pari Ajo që nuk kishim kohë për të bërë ishte përkthimi i mesazheve në tabelat tona.
    Një tranzicion i tillë do të bënte të mundur braktisjen e modulit të "rrjetit social", i cili do të jepte liri më të madhe në zgjedhjen e redaktorëve, si dhe do të ishte e mundur të futeshin bisedat në grup.

    Së dyti, ky është zbatimi i komunikimit të vërtetë "të çastit". Tani moduli përdor bashkimin e rregullt, duke sondazh serverin një herë në n-sekonda, periudha e votimit ndryshon në varësi të aktivitetit të komunikimit.
    Ne planifikojmë të shkruajmë një shërbim të veçantë që do të mbajë lidhje të vazhdueshme dhe do të dërgojë përditësime të të dhënave sipas nevojës (për mesazherin, për furnizimin e drejtpërdrejtë, etj.).

    Së treti, ne planifikojmë të ndryshojmë pak ndërfaqen, të braktisim listën e veçantë të kontakteve dhe dritaren e dialogut dhe t'i kombinojmë ato në një tërësi të vetme, e cila në të ardhmen do të na lejojë ta zhvendosim mesazhin në një aplikacion celular.

    Nuk ka ende asnjë dokumentacion dhe nuk do të shfaqet deri në vjeshtë, sepse... Moduli është duke u zhvilluar në mënyrë aktive dhe ne duam të lëmë aftësinë për të ndryshuar API.
    Sidoqoftë, unë do të përpiqem të publikoj shembuj të punës me atë pjesë të API-së në të cilën puna tashmë është përfunduar dhe ju mund t'i përdorni ato me siguri në modulet tuaja.

    Puna me njoftimet (e rëndësishme për IM duke filluar nga versioni 11.5.2)

    Ne kemi zbatuar tre lloje njoftimesh:
    - njoftim i personalizuar;
    - njoftim nga sistemi;
    - njoftimi që kërkon konfirmim;

    Para se të përdorni API, duhet të kontrolloni nëse moduli është i instaluar në sistem:

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

    Njoftim i personalizuar


    Nëse mesazhet janë caktuar në NOTIFY_TAG, atëherë përdoruesi do t'i grupojë ato.

    Njoftim nga sistemi


    $arMessageFields = grup (// marrësi "TO_USER_ID" => $USER->GetId(), // dërguesi (mund të jetë >0) "FROM_USER_ID" => 0, // lloji i njoftimit "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // moduli që kërkoi dërgimin e një njoftimi "NOTIFY_MODULE" => "im", // etiketë simbolike për grupim (vetëm një mesazh do të shfaqet), nëse kjo nuk kërkohet, mos vendosni parametrin "NOTIFY_TAG" => "IM_CONFIG_NOTICE", // teksti i njoftimit në sit (disponohen kodet html dhe BB) "NOTIFY_MESSAGE" => "[b]Vëmendje: duhet të kontrolloni dhe të specifikoni rrugën e duhur për në rrjetin social në cilësimet e modulit "Mesazhet e menjëhershme dhe njoftimet"" , // teksti i njoftimit të dërgohet me email (ose XMPP ), nëse nuk ka dallime, mos vendosni parametrin //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

    Njoftimi që kërkon konfirmim (konfirmo)


    $arMessageFields = grup (// marrësi "TO_USER_ID" => $USER->GetId(), // dërguesi "FROM_USER_ID" => 2, // lloji i njoftimit "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // moduli që kërkoi dërgimin e mosnjohjes "NOTIFY_MODULE " => "kalendar", // etiketë simbolike për grupim (vetëm një mesazh do të shfaqet), nëse kjo nuk kërkohet, mos vendosni parametrin "NOTIFY_TAG" => "KALENDAR|FTE|123|".$ USER->GetId() , // tekst njoftimi në sajt (disponohen kodet html dhe BB) "NOTIFY_MESSAGE" => "Ju ftoj të merrni pjesë në takimin "Mesazhet dhe njoftimet e çastit" që do të zhvillohet më 15 mars, 2012 në orën 14:00", // tekst njoftimi për t'u dërguar me email (ose XMPP), nëse nuk ka dallime, mos vendosni parametrin "NOTIFY_MESSAGE_OUT" => "Përdoruesi Evgeny Shelenkov ju fton të merrni pjesë në takimin "Instant mesazhe dhe njoftime” #BR# që do të zhvillohet më 15.03.2012 në orën 14:00.#BR # #BR# Prano: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Refuzoni: http://test.ru/calend.php?CONFIRM=N&CID=123", // grup që përshkruan butonat e njoftimit "NOTIFY_BUTTONS" => Array(// 1. emri i butonit, 2. vlera, 3. shablloni i butonit , 4. kalimi në adresë pasi klikoni (parametër opsional) Array("TITLE" => "Prano", " VALUE" => "Y", "TYPE" => "pranoj" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Refuzo", "VALUE" => "N", "TYPE" => "anulo" /*, "URL " => "http://test.ru/?confirm=N" */),), // kodi simbolik i shabllonit të dërgimit të letrës, nëse nuk specifikohet, ai dërgohet me shabllonin e njoftimit "NOTIFY_EMAIL_TEMPLATE" => " KALENDAR_FTESË"); CIMNotify::Add($arMessageFields); ?>

    Për të punuar me këtë lloj njoftimi, nuk mjafton thjesht të dërgoni një mesazh, por gjithashtu duhet ta shërbeni atë.

    Shërbimi
    Ka dy opsione, më e thjeshta është të ndiqni lidhjen (nëse vendosni parametrin e 4-të në NOTIFY_BUTTONS).
    Pasi të ndiqni lidhjen, duhet të telefononi kodin e mëposhtëm në kodin tuaj:
    Kujdes: kushtojini vëmendje emrit të etiketave; kur telefononi fshirjen, të gjitha mesazhet me atë etiketë do të fshihen.
    Kur dërgoni mesazhe të shumta, kjo duhet të merret parasysh në mënyrë që ekzekutimi i një veprimi nga një përdorues të mos e fshijë aksidentalisht njoftimin për të gjithë (përveç vendeve ku nevojitet një logjikë e tillë).

    Opsioni i dytë është në ngjarje.
    1. ju duhet të regjistroni varësinë

    Mos harroni brenda funksioneve tuaja Konfirmo Kërkesën Dhe Refuzo Kërkesën shkaktojnë fshirjen e njoftimit CIMNotify::DeleteByTag()

    Kjo është e gjitha për momentin, pres sugjerimet tuaja në komente, zbatime të suksesshme!
    Nëse dëshironi të provoni API-në përpara lëshimit të 11.5.2 në një grup me parametra, duhet të specifikoni gjithashtu "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, gjithashtu opsioni me një lidhje në butona nuk do të funksionojë për njoftimet e konfirmuara. Por është më mirë të presësh; përditësimi 11.5.2 pritet të dalë më 23 maj.

    Më mirë një varg i keq sesa delirium tremens...

    PHP AJAX CRUD: krijimi, fshirja, redaktimi i të dhënave në bazën e të dhënave MySQL

    Në këtë artikull, ne do të mësojmë se si të shtojmë, modifikojmë dhe fshijmë të dhënat në një bazë të dhënash MySQL duke përdorur PHP. Ne përdorëm një mbajtës JQuery që dërgon një kërkesë AJAX në një skript nga ana e serverit. Trajtuesi përditëson listën e të dhënave.

    Formulari AJAX për dërgimin e kërkesave për krijimin, fshirjen, modifikimin

    Kur shtoni një rekord, formulari dërgon të dhëna në skriptin PHP nëpërmjet një kërkese AJAX. Nëse shtimi është i suksesshëm, lista e hyrjeve ringarkohet.

    JQuery AJAX funksionon për pyetjen e bazës së të dhënave CRUD

    Në funksionin JQuery AJAX kemi raste switch add edit dhe delete. Këto raste gjenerojnë vargje të ndryshme të të dhënave të pyetjeve dhe përgjigjeve në varësi të veprimeve të bazës së të dhënave.

    funksioni showEditBox(id) ( $("#frmAdd").hide(); var aktualMessage = $("#message_" + id + ".message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) funksioni cancelEdit(message,id) ($("#message_" + id + " .message-content") . ": 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, tipi: "POST", sukses:funksion(të dhëna)( switch(action) ( case "add": $("#comment-list-box").append(data); pushim;rasti "redakto": $("#message_" + id + " .message-content").html(data); $("#frmAdd").shfaq(); pushim; case "delete": $("#message_"+id).fadeOut(); pushim; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), gabim:funksioni ()() )); )

    Skript PHP për operacionet CRUD

    Kodi i mëposhtëm kryen pyetje kundër bazës së të dhënave. Ky skript PHP, pasi kryen një veprim CRUD, përditëson të dhënat si rezultat i përgjigjes AJAX.

    Kërko_një herë ("dbcontroller.php"); $db_handle = kontrollues i ri DBC(); $action = $_POST["veprim"]; if(!empty($action)) ( switch($action) ( case "add": $result = mysql_query("INSERT INTO koment(message) VALUES("".$_POST["txtmessage"].")" ) ; if($result)($insert_id = mysql_insert_id(); jehonë "Modifiko Fshij " . $_POST["txtmessage"] . " "; ) break; rasti "edit": $result = mysql_query("Përditëso mesazhin e grupit të komenteve = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; pushim; rasti "fshij": nëse ( !empty($_POST["message_id"])) ( mysql_query ("FSHI NGA komenti WHERE id=".$_POST["message_id"]); ) break; ) )

    Në këtë pikë të këtij kursi, është hedhur themeli i shtojcës sonë, është përcaktuar një goditje e personalizuar dhe është bashkangjitur një mesazh i vazhdueshëm për të treguar se si funksionon grepa.

    Që ne Jo e bënë, nuk zbatuan llojet e mesazheve dhe shfaqjen e tyre sipas të dhënave të futura nga përdoruesi.

    Por përpara se të fillojmë, duhet të shtojmë mbështetje për lloje të ndryshme mesazhesh, një ndërfaqe klase që do të mbështesë çdo lloj mesazhi dhe strukturën e të dhënave të nevojshme për të ruajtur mesazhe të tilla.

    Gati për të filluar?

    Mezi pres të vazhdoj tutorialin, por ka disa gjëra që duhet të marrim parasysh përpara se të zhytemi me kokë në kodin burimor. Sigurohuni që keni të instaluar softuerin e mëposhtëm në sistemin tuaj:

    • PHP 5.6.25 dhe MySQL 5.6.28
    • Apache ose Nginx
    • WordPress 4.6.1
    • IDE ose redaktori juaj i preferuar

    Dhe nëse jeni duke kërkuar për një zgjidhje gjithëpërfshirëse, mos harroni të provoni MAMP.

    Ne kemi avancuar në

    Siç u përmend më herët, ne jemi pikërisht në mes të këtij kursi. Nëse keni humbur ndonjë nga mësimet e para, ja çfarë kemi mbuluar deri më tani:

  • Në tutorialin e parë, ne u fokusuam në bazat minimale për krijimin e shtojcës sonë dhe atë që duhet të keni për të filluar.
  • Në pjesën e dytë, ne kaluam më tej me shtojcën, duke shtuar pak në faqen bazë të administrimit në WordPress. Ne caktuam gjithashtu një goditje të personalizuar që përdorim dhe e ekzekutuam në anën e serverit. Ne vendosëm gjithashtu parametrat bazë për Messengerin tonë të Cilësimeve.
  • Dhe kjo është ajo që ne do të shqyrtojmë në fazën përfundimtare të trajnimit:

  • Ne do t'i lidhim të gjitha së bashku, do ta shohim në veprim dhe do ta bëjmë shtesën të disponueshme publikisht për shkarkim.
  • Aktualisht kemi detyra të tjera dhe do të fokusohemi në to.

    Le të kthehemi në punë

    Meqenëse i jemi kthyer punës (dhe siç u tha në mësimet e mëparshme), ne jemi të përkushtuar për zbatimin e mëtejshëm të detyrave në këtë pjesë:

    Në këtë tutorial ne do të vazhdojmë të zhvillojmë Settings Messenger-in tonë duke shtuar mbështetje për mesazhet e suksesit dhe dështimit, si dhe duke prekur çështjet e sigurisë.

    Në artikullin e mëparshëm, ne filluam në Settings Messenger, por vetëm deri në pikën e konfigurimit të një veçorie që do të shfaqë vazhdimisht një njoftim suksesi ndërsa faqja e përdoruesit është duke u ngarkuar.

    Në këtë tutorial do të shtojmë mbështetje për mesazhet e gabimit, paralajmërimit dhe suksesit. Më pas do t'i shfaqim në ekran për të marrë një ide se si do të funksionojë mesazheri.

    Për më tepër, ne do të bëjmë një ndryshim tjetër që do të shtojë mbështetje për heqjen e njoftimeve sipas gjykimit të përdoruesit.

    Ky është i gjithë plani i punës së nevojshme për këtë mësim. Le të fillojmë.

    Cilësimet shtesë të Messenger

    Mos harroni, e gjithë qëllimi i Settings Messenger është të përcaktojë mënyrën tonë të punës me mesazhe të personalizuara, grepa të personalizuara dhe API-në vendase të WordPress për shfaqjen e mesazheve në kontekstin e panelit të administratorit të WordPress.

    Për ta bërë këtë, ne do të zgjerojmë punën e bërë në mësimin e fundit dhe do të fillojmë nga këtu.

    Mesazhe të suksesshme

    Meqenëse filluam me mesazhe të suksesshme në mësimin e mëparshëm, le të vazhdojmë me to. Tani kemi një metodë të kodifikuar që shfaq një mashtrim të vetëm: