Pagpapakita ng mga mensahe sa user sa mga web application. PHP AJAX CRUD: paglikha, pagtanggal, pag-edit ng mga tala sa MySQL database PHP script para sa mga pagpapatakbo ng CRUD

Pangkalahatang-ideya

Ang built in na sistema ng notification, una sa Joomla, ay nagbibigay-daan sa iyong app na panatilihing may kaalaman ang user (o grupo ng mga user) tungkol sa iba't ibang mga kaganapan. Isipin ang mga notification bilang mahalagang alerto na magiging interesado ang user na basahin at subaybayan ito.
Maaaring mabuo ang mga notification sa lahat ng dako. Sa iyong bahagi o mga plugin at pagkatapos ay ipinapakita sa loob ng JomSocial notification system.
Ipapakita sa iyo ng tutorial na ito kung paano, ngunit dahil wala kaming ideya ng anumang bahagi ng third-party na magagamit namin:) ang mga halimbawa ay gagawin sa isang plugin ng komunidad na ma-trigger sa kaganapang onAfterProfileUpdate
Kung hindi mo alam kung paano lumikha ng isang plugin na ma-trigger sa kaganapang ito, iminumungkahi naming suriin mo ang gabay na ito

Ang pagpapatupad nito sa iyong bahagi pa rin

Gaya ng nakasaad sa pangkalahatang-ideya ng tutorial na ito, bubuo kami ng mga notification gamit ang plugin ng komunidad.
Malamang na gusto mong gumawa ng mga notification sa loob ng iyong bahagi, o sa iyong plugin. Ang sumusunod na tutorial ay gagana sa alinman sa mga kasong ito. Kailangan mo lang tukuyin kung anong punto sa iyong code ang gagawing notification at i-load lang ang JomSocial Core Libraries file.

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

Ang pagsunod sa tutorial na ipinaliwanag sa ibaba ay gagana rin para sa iyong extension

Paghahanda sa Kapaligiran sa Pag-unlad

1. Ipagpalagay namin na nakagawa ka na ng halimbawa ng plugin ng uri ng komunidad na ma-trigger kapag binago ng user ang profile nito
Kung hindi, maaari kang mag-download ng walang laman na halimbawang plugin mula sa , i-install ito sa Joomla at paganahin ang plugin. Ito ay pinangalanan Komunidad - Halimbawa ng Mga Notification
2. Mag-navigate sa iyong database at alisan ng laman ang dalawang talahanayan na ito, para wala silang anumang mga tala

A) prefix_community_notification
b) prefix_community_mailq

3. Magkaroon ng hindi bababa sa dalawang (2) user sa iyong mga site ng pagsubok at alam ang kanilang mga ID

Sa mga naunang bersyon ng Joomla, ang mga user ID ay palaging nagsisimula sa tinukoy na numero (62, 42) Sa Joomla 3, ang numerong ito ay magiging random, kaya, ang larawan ng aming kapaligiran sa pagsubok dahil tiyak na magiging iba ito sa iyong pagtatapos.

Ang Unang Abiso

Buksan ang plugin php file na makikita sa ROOT/plugins/community/example
Sa loob ng function na onAfterProfileUpdate() palitan ang

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

Gaya ng ipinapakita sa halimbawa, ang notification add api ay may 7 parameter

  • $cmd - ay ang uri ng notification. Makikita mo ang lahat ng uri ng notification sa file na ito. ROOT/components/com_community/libraries/notificationtypes.php simula sa, o sa paligid ng linya 53. Inirerekomenda namin ang paggamit ng system_messaging na uri ng notification.
  • $actor - ay ang taong nagsasagawa ng aksyon
  • $target - ay ang tao, o grupo ng mga tao na makakatanggap ng abiso
  • $subject - ay ang notification subject, sa pareho, notification popup window at ang pamagat ng email
  • $body - ay ang katawan ng mensahe ng notification sa email
  • $template - kung kailangan mo ng partikular na template na gagamitin, maaari mo itong tukuyin dito. Kung hindi, maaaring walang laman ang parameter na ito
  • $params - custom na tinukoy na mga parameter
  • Alam ang lahat ng ito, hayaan nating tukuyin ang mga variable na gagamitin natin
    Baguhin ang iyong plugin code sa:

    $user = CFactory::getUser(); $cmd = "system_messaging" ; // unang param, uri ng aktibidad $actor = $user -> id ; //second param - kunin ang id ng $actor $target = "965" ; // ikatlong param. Sino ang tumatanggap ng notification? Sa aming dev environment, ang admin user nito na may id 965. Sa iyong environment, malamang na gusto mong makuha ang ID mula sa iyong object o mula sa hanay ng mga user. $subject = "Paksa ng Abiso" ; // Paksa ng pareho, email at popup notification $body = ; //Body message sa mga email. $template = "" ; // Kung kailangan mong gumamit ng partikular na jomsocial template file, maaari mo itong tukuyin dito. $params = bagong CParameter("" ); // Nais naming lumikha ng karagdagang params object, at magtalaga ng data dito, nang hindi kinakailangang pormal na tukuyin ang isang class CNotificationLibrary:: add ($cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Ngayon mag-login sa sinumang user at baguhin ang impormasyon ng profile. Pumunta tayo sa database para makita kung ano ang nangyari.
    Mag-navigate sa prefix_community_notifications table at obserbahan ang bagong record

    Mag-navigate sa prefix_community_mailq table, at tingnan ang bagong record

    Binabati kita! - Matagumpay mong nalikha ang iyong unang sariling abiso na ipinadala sa pamamagitan ng email at panloob na sistema ng abiso ng JomSocial


    Potensyal na Code Bloat

    Ang halimbawa sa itaas ay maayos, at gumagana ito, ngunit sa pangkalahatan ay hindi inirerekomenda na gamitin ito nang ganoon. Sa halip, maaari itong isulat nang ganito

    $actor = CFactory::getUser(); $params = bagong CParameter("" ); CNotificationLibrary:: add ( "system_messaging" , $actor -> "Ito ang notification body message" , "" , $params );

    Ito ay mas malinis at mas madaling sundin habang karaniwang ginagawa ang parehong bagay tulad ng isang code na ipinapakita sa itaas.

    Mga Custom na Parameter ng Notification

    Maaaring palawigin ang isang notification API sa anumang param na gusto mong idagdag.
    Ang mga param na ito ay maaaring ipasa sa alinman sa template ng email, abiso, at siyempre, file ng wika.

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = bagong CParameter("" ); $params -> set ("actor" , $actor -> getDisplayName () ); // ay maaaring gamitin bilang (actor) tag $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ); // Link para sa (actor) tag na $params -> set ("url" , $link ); //url ng buong aktibidad. Ginagamit kapag nagho-hover sa avatar sa window ng notification. Magagamit din bilang (url) tag sa mga papalabas na email. Tiyaking natukoy mo ang $link variable:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "Ito ang notification body message" , "" , $params ) ;

    • $params = bagong CParameter( ); - Nais naming lumikha ng bagong params object, at magtalaga ng data dito, nang hindi kinakailangang pormal na tukuyin ang isang klase.
    • $params->set("actor", $actor->getDisplayName()); - Dapat palaging may artista ang iyong notification. Ang param na ito ay maaaring ipasa sa template bilang (actor) tag. Sa window ng notification, tinutukoy nito ang user na nagdadala ng aksyon.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - Ang URL ng aktor ay karaniwang url ng isang aktor. Sa popup ng notification, idinaragdag nito ang link sa (actor) na elemento
    • $params->set("url", $link); - Ito ang pinakamahalagang parameter na dapat mong palaging itakda nang maayos. Sa window ng notification, ginagamit ang param na ito sa larawan ng avatar. Sa abiso sa email, inie-echo nito ang lokasyon kung saan naganap ang aktibidad.

    Para sa halimbawang ito, magtatakda kami ng variable na $link upang mapunta sa www.google.com para makita mo kung paano ito gumagana

    Pagdaragdag ng String ng Wika at Paggamit ng Mga Param

    Ang pagkakaroon ng mga param na itinakda namin ay magagamit din sa aming mga file ng wika.
    Tukuyin natin ang mga susi ng wika sa pamamagitan ng pagbabago sa " CNotificationLibrary::add() API

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

    Ang file ng wika ay dapat magmukhang ganito

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(actor) updated profile" PLG_COMMUNITY_EXAMPLE_BODY = "Hi Admin \n Ito ang mail para ipaalam sa iyo na (actor) updated profile \n\n Kung gusto mong pumunta sa Google, mag-click dito \n a href=" _QQ_" (url)"_QQ_">(url)"

    Sa halimbawang ito, ginamit namin ang tag (actor) at (url) para ipasa ang data sa pareho, notification, at mga template ng email. Tingnan natin kung ano ang hitsura nito.
    Sa window ng notification kapag nagho-hover sa avatar, pansinin ang (url) param na sinipa at idinagdag ang link sa google sa avatar. Ito ay sinadya, dahil ginawa namin ito na paraan :)


    ]

    Sa parehong window, kapag nag-hover sa link ng aktor. Ito ang bahagi kung saan ini-echo ni (actor) ang user na nagdadala ng isang aksyon, habang (actor_url)" ay nag-ingat na ang bagay ay naka-link nang maayos


    Tingnan natin kung ano ang mangyayari sa email queue


    At panghuli, ang aktwal na email na ipinadala sa end user


    Tagumpay
    Hanggang ngayon, gumawa kami ng tatlong (3) parameter na matagumpay na ginagamit sa window ng notification, at mga email.

  • (actor) - Ibinabalik ang username ng user na nagdadala ng aksyon
  • (actor_url) - Nagbibigay ng katangian sa (aktor)
  • (url) - Hindi sapilitan, ngunit dapat ay laging nasa iyong notification. Ito ang pangunahing url kung saan nangyari ang pagkilos na naabisuhan sa amin.
  • Katulad nito, maaari mong tukuyin ang "

    • (target) - kung kailangan mo ito
    • (target_url) kung kailangan mo ito sa iyong notification.
    • (pamagat) - Karaniwang ginagamit upang sumangguni sa isang bagay na nakabuo ng notification. Halimbawa: "Nag-post ang User X ng bagong larawan sa Album Y." Album Y ang pamagat dito
    • (title_url) - Tulad ng mga nauna, ang url ng isang bagay na nakabuo ng notification.
    • (mensahe) - Ang param na ito ay maaaring gamitin upang itakda (at i-echo) ang mensahe sa katawan ng JomSocial email.
    3.3K

    Ang pagpapakita ng mga mensahe sa user ay isang medyo karaniwang aksyon na dapat gawin ng isang web application. Ito ay maaaring mangyari kapag nagpoproseso ng mga form, maaari itong mga mensahe ng error, mga mensahe na nagsasabi sa iyong magparehistro kapag sinubukan ng isang user na i-access ang isang pinaghihigpitang bahagi ng site, at sa maraming iba pang mga kaso.

    Kadalasan, ang paglikha at output ng mga mensahe ay pinaghihiwalay sa iba't ibang mga kahilingan sa HTTP. Bilang isang patakaran, maginhawang gumamit ng pag-redirect pagkatapos ng pagproseso ng mga form (upang maiwasan ang mga problema sa mga pindutan ng Bumalik at I-refresh), ngunit sa parehong oras, ang natural na sandali para sa paglikha ng isang mensahe ay tiyak na sandali ng pagproseso ng mga form at pagsasagawa ng mga aksyon na kasama ito. Bakit? Isipin na ang text ng mensahe ay dapat magmukhang ganito: "Ang bilang ng mga unit na na-order para sa item na 'Mouse Pad' ay matagumpay na nabago mula 7 hanggang 12." Pagkatapos ng isang pag-redirect, marahil sa isang ganap na naiibang pahina sa mga tuntunin ng pag-andar, ito ay magiging isang dagdag na sakit ng ulo upang matukoy kung ano ang ginawa noon.

    Kadalasan, ang mga mensahe ay ipinapakita sa kahilingan ng POST na nagpoproseso ng form - hindi ito maganda, ang mga salitang "luma na ang pahinang ito" ay sumisira sa buhay (kapag nagpasya ang gumagamit na subukan ang pindutang Bumalik).

    Gumagamit ang isang tao ng redirect, sumusuko sa mga friendly na mensahe.

    Kasabay nito, mayroong isang simple at malinaw na paraan upang mapabuti ang buhay. Sa kabila ng pagiging malinaw, sa ilang kadahilanan ay wala akong nakitang gumamit nito - kahit na noong tumingin ako sa mga mapagkukunan ng ibang tao.

    Kaya, mayroon kaming problema - ang mensahe ay dapat "mabuhay" sa iba't ibang mga kahilingan. Kailangan namin ng mekanismo para ilipat ang text ng mensahe sa page na dapat magpakita nito. Marahil ay naalala mo na ang tungkol sa mga sesyon.

    Oo, sa pangkalahatan ay tama ka. Ang iba pang mga pamamaraan, halimbawa sa pamamagitan ng isang pandaigdigang variable, ay hindi pinapayagan ang pag-save ng data sa kaso kapag ang isang pag-redirect ay ginamit (tandaan ni Maxim Naumenko). Dagdag pa rito, karaniwan kong tinitiyak na ang bawat screen sa application ay may kakayahan, kasama ng iba pang impormasyon, na magpakita ng mga mensaheng nabuo sa mga nakaraang screen. Maginhawa ito dahil hindi na kailangang maghanda ng hiwalay na mga screen para sa pagpapakita ng mga mensahe, at hindi na kailangang i-click muli ng user ang mouse. Ngunit, talaga, kailangang mag-isip ang taga-disenyo dito - upang i-highlight ang lugar kung saan lalabas ang mga mensahe.

    Ang ideya ay napaka-simple at maaaring ipatupad sa isang pares ng mga klase.

    Ang unang bagay na pumapasok sa isip ay lumikha ng isang klase ng Mensahe, na, sa katunayan, ay kumakatawan sa isang mensahe sa aming simpleng diagram ng klase. Dapat na mai-save ng mensahe ang sarili nito sa session, pati na rin ipakita ang sarili nito sa screen.

    Mensahe ng klase ( /** * Nilalaman ng mensahe. */ var $content; /** * Tagabuo para sa pagsisimula ng text ng mensahe. * * Nilalaman ng mensahe ng nilalaman ng @param */ function na Mensahe($content) ($this->content = $ content ; ) /** * Sumulat ng mensahe sa session. */ function send() ($_SESSION["session_messages"] = $this->content; ) /** * Output ng mensahe sa page. */ function toPage() ( echo " - " . $this->content ."
    "; } }

    Ang $_SESSION variable ay ginagamit upang ma-access ang session.

    Tandaan na ang $_SESSION ay isang array, gumagamit lang kami ng isang elemento ng array na ito na may index na 'session_message'.

    Sa kasong ito, kami ay nakikitungo sa isang "array ng mga array" - ang iniimbak namin sa elemento ng 'session_message' ay isang array, ito ang listahan ng mga ipinadalang mensahe (siyempre, maaaring mayroong ilan sa kanila).

    Kung hindi mo mahanap ang thread, oras na para suriin ang mga seksyon ng manual na nakatuon sa mga session at array.

    Baka may tanong ka. Bakit kailangan ng mga klase dito? Ito ay magiging posible upang makakuha ng sa pamamagitan ng dalawang function. Ngunit tingnan pa natin. Maaaring kailanganin naming lumikha ng mga mensahe na may iba't ibang uri (impormasyon, error, babala), at tukuyin ang mga tatanggap ng mensahe.

    Pakitandaan na sa ngayon ay hindi ang object mismo ang inilalagay sa session, ngunit ang text ng mensahe lamang. Binibigyang-daan kami ng OOP na baguhin sa ibang pagkakataon ang pag-uugali ng send() na paraan nang hindi binabago ang client code na nag-a-access sa paraang ito (halimbawa, sa hinaharap maaari naming isulat ang buong object ng Mensahe sa session kung marami itong field).

    Isipin natin na gagawin natin ito gamit ang mga function. Malamang na magkakaroon tayo ng function na message_send($txt), at isang function din ng message_to_page($txt). Ngayon kailangan nating magdagdag ng kakayahang magkaroon ng iba't ibang pag-uugali para sa iba't ibang uri ng mga mensahe. Nagbabago ang mga function na tawag: message_send($txt, $kind), message_to_page($txt, $kind). Kakailanganin mong suklayin ang buong code ng aplikasyon sa paghahanap ng mga naturang function, paggawa ng mga pagwawasto.

    Maiiwasan ito sa pamamagitan ng maagang pag-asa sa sitwasyon sa pamamagitan ng pagpapakita ng mensahe bilang isang associative array: $msg['txt'], $msg['kind'], pagkatapos ay magkakaroon lamang ng isang parameter sa mga function call. Nararamdaman mo ba kung paano ito sinusubukang maging isang klase?

    Kaya, binibigyan ka ng OOP ng pagkakataon na magkaroon ng karangyaan na hindi pag-isipan ang lahat nang maaga.

    Ang susunod na klase - Inbox - ay idinisenyo para lang dito.

    class Inbox ( /** * Array ng mga natanggap na mensahe. */ var $messages = array(); /** * Sa constructor, nakukuha namin ang lahat ng natanggap na mensahe * at tinatanggal ang mga ito mula sa session. */ function Inbox() ( if (is_array ($ _SESSION["session_messages"])) ($messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->mga mensahe = bagong Mensahe($mensahe[$i]); ) ) /* i-clear ang array ng mga mensahe */ $_SESSION["session_messages"] = array(); ) /** * Ipakita ang mga nilalaman ng Inbox sa pahina. */ function toPage() ($co = sizeof($this->message); if ($co > 0) (echo "Mensahe mula sa system:
    "; ) para sa ($i = 0; $i< $co; $i++) { $this->mga mensahe[$i]->ToPage(); ) ) )

    Subukan natin ang aming messaging system.

    Gumawa tayo ng napakasimpleng halimbawa na tutugon sa pagsusumite ng form sa pamamagitan ng pag-uulat ng bilang ng mga segundo sa kasalukuyang minuto.

    Itinago namin ang lahat ng gawain gamit ang mga array at session sa loob ng mga klase, at mukhang simple at maganda ang huling code.

    Lumikha ng isang direktoryo sa iyong web server, pagkatapos ay lumikha ng tatlong file na ito dito at subukan ang script. Pakitandaan na walang mga problema sa mga button na Bumalik at I-refresh.

    Ngayon isipin na lumilikha ka ng isang kumplikadong portal, kung saan, bilang panuntunan, mayroong ilang mga bloke sa mga pahina, at ang bawat isa ay maaaring maglaman ng isang hiwalay na aplikasyon.

    Narito kami ay nakakaranas ng dalawang kahirapan:

    * Gusto kong lumabas ang listahan ng mga mensahe sa isang partikular na bahagi ng page, at nakahanap ka na ng magandang lugar para dito.
    Ang problema ay kailangan mong patakbuhin ang $inbox->toPage() na utos sa eksaktong sandali na tumutugma sa posisyon ng listahan ng mga mensahe sa pahina. Kung gusto naming baguhin ang posisyon ng listahang ito, kailangan naming pumunta sa code, ngunit hindi magandang palaging baguhin ang portal frame para dito. Ang pinakamahusay na solusyon ay ang paggawa ng output ng mga mensahe sa anyo ng isang hiwalay na module, na alam lang natin na kailangan itong konektado sa balangkas.
    Iyon ay, palayain ang iyong sarili mula sa mahigpit na pagkakasunud-sunod ng paglulunsad ng mga module. Sa katunayan, dahil ang resulta ng output ng Inbox ay hindi nakasalalay sa pagpapatakbo ng system (sa hakbang na ito ay mayroon na tayong lahat ng data sa session), kung gayon bakit ang sobrang kumplikado?
    * Upang mapanatili ang hitsura (disenyo) ng listahan ng mensahe, kailangan mong pangalagaan ang HTML code, na naka-hardcode sa mga toPage() na pamamaraan ng mga klase ng Mensahe at Inbox. Karaniwan, kailangan mong baguhin ang PHP code upang mabago ang disenyo.

    Upang subukang lutasin ang unang problema, maaari kang lumikha ng buffer na nag-iimbak ng resulta ng output ng Inbox.

    Marahil ay magkakaroon pa rin tayo ng ilang bagay na katulad (sa Inbox), at kailangan nating lumikha ng buffer system. Upang hindi malito kung kanino ang output, malamang na darating tayo sa pagbibigay ng pangalan sa mga buffer. Iimbak namin sa isang lugar ang pagkakasunud-sunod alinsunod sa kung saan ang mga buffer ay dapat na output - mas mabuti sa isang panlabas na file upang gawing mas madali ang mga pagbabago.

    Ang pagtatangkang ito sa isang solusyon ay nagbibigay na sa amin ng ideya ng paggamit ng XML bilang isang paraan ng pag-iimbak ng intermediate data. At ang paggamit ng mga istilo ng XSLT ay makakatulong sa paglutas ng pangalawang problema.

    Hindi ako magtatagal sa kung ano ang XML at kung ano ang XSLT. Kung hindi ka pamilyar sa mga bagay na ito, ang zvon.org ay isang magandang lugar para magsimulang maghanap.

    Ang ideya ay hindi bumuo ng HTML code, ngunit isang XML na istraktura sa mga pamamaraan ng toPage(). Ang dokumento ng pahina ay gagawin bilang isang string na may XML code (ito ay magsisilbing isang "buffer"), at sa huling yugto ng script ay gagamit kami ng XSL na pagbabago.

    Una, isipin natin kung ano ang dapat na maging resulta ng pangunahing bahagi ng code.

    minuto 57 segundo: 45

    Ano ito ay medyo madaling hulaan - dalawang mensahe at isang form. Pakitandaan na kailangan lang ng PHP script na maghanda ng ganoong string - ito ay napakasimple. Bukod dito, ang pagkakasunud-sunod ng mga pangunahing tag ay hindi mahalaga - maaari mong unahin ang mga ito, halimbawa, bilang magiging maginhawa para sa programmer. Paano ito ipatupad. Maaari mong, nang hindi binabago ang anuman, gumamit ng output buffering, output XML sa halip na HTML code, at sa huli ay makuha lamang ang output sa isang string. Ngunit pagkatapos ay mawawalan tayo ng kakayahang umangkop - halimbawa, kung minsan gusto mong direktang mag-output ng impormasyon sa pag-debug sa pahina (gamit ang echo). Kasabay nito, gumagawa ang mga developer ng PHP sa isang module ng DOM na nag-aalok ng mas advanced na paraan ng paggawa at pagpasa ng mga dokumento ng puno. Kung gusto nating ipatupad ang DOM, kakailanganin nating muling idisenyo ang buong application, na binabago ang output ng mga string sa paglikha ng mga elemento ng DOM. Samakatuwid, mas gusto kong iimbak ang XML na representasyon ng mga bagay sa loob ng mga bagay mismo, na sunud-sunod na nag-iipon ng isang karaniwang XML na dokumento. Hindi naman ganoon kahirap, kailangan lang ng konting modification. Makikita mo na ang diskarteng ito ay hindi mahigpit na nakatali sa isang partikular na paraan ng pag-iimbak ng data ng XML, at ito ay magbibigay-daan sa iyo na gawin ang paglipat sa paggamit ng DOM na may kaunting pagsisikap. Una sa lahat, pansinin na ang bawat isa sa aming mga bagay ay may pamamaraang toPage(). Ang pagkakatulad na ito ay dapat makapagpaisip sa atin tungkol sa pagpapakilala ng bagong karaniwang parent class. Hayaan ang bawat klase na maaaring lumikha ng mga piraso ng isang XML na dokumento para sa isang pahina na magmana mula sa isang klase na mag-aalaga sa XML na representasyon ng bagay. Tawagin natin itong Outputable.

    class Outputable ( /** * XML container (string). */ var $output = ""; /** * Ibigay ang mga nilalaman ng container at i-clear ang container. * * @return a string with XML data */ function getOutput () ($ out = $this->output; $this->output = ""; return $out; ) /** * Magdagdag ng bahagi sa mga nilalaman ng container. * * @param string ang string na idaragdag * / function appendOutput($string) ( $this ->output .= $string . "n"; ) /** * "Abstract" method. */ function toPage() ( ) )

    Ang paraan ng toPage() ay ginawang walang laman - sa kasong ito ito ay kinakailangan bilang isang tagapagpahiwatig kung paano dapat makipag-ugnayan ang mga panlabas na klase ng "matryoshka" sa panloob na klase. Gayunpaman, maaari kaming mag-alok ng default na pagpapatupad dito kung napansin namin na maraming mga bagay na nagpapakita ng kanilang mga sarili sa pahina sa parehong paraan.

    Bahagyang magbabago ang mga klase ng Mensahe at Inbox - dapat na silang magmana ngayon mula sa Outputable, at magbabago rin ang mga pamamaraan ng toPage()
    Message.php

    class Message extends Outputable ( /** * Message content. */ var $content; /** * Constructor for initializing the message text. * * @param content message content */ function Message($content) ($this->content = $content; ) /** * Sumulat ng mensahe sa session. */ function send() ($_SESSION["session_messages"] = $this->content; ) /** * Mag-output ng mensahe sa page. * / function toPage() ( $this->appendOutput("".$this->content.""); ) )

    class Inbox extends Outputable ( /** * Array ng mga natanggap na mensahe. */ var $messages = array(); /** * Sa constructor, natatanggap namin ang lahat ng natanggap na mensahe * at inalis ang mga ito sa session. */ function Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ($messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->mga mensahe = bagong Mensahe($mensahe[$i]); ) ) /* i-clear ang array ng mga mensahe */ $_SESSION["session_messages"] = array(); ) /** * Ipakita ang mga nilalaman ng Inbox sa pahina. */ function toPage() ($co = sizeof($this->message); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->mga mensahe[$i]->toPage(); $this->appendOutput($this->message[$i]->getOutput()); ) $this->appendOutput(""); ) )

    Ang paraan ng output ay nagbago - ngayon, sa halip na direktang mag-output sa pahina, ang panlabas na representasyon ay pansamantalang iniimbak sa Outputable, na "umupo" sa bawat isa sa mga bagay. Ang appendOutput() na paraan ay nagsisilbing kapalit para sa echo() construct. Upang makuha ang output ng isang bagay, ginagamit ang getOutput() method.

    Ngayon tingnan natin kung ano ang bahagi ng kliyente ng code, na malulutas ang parehong problema tulad ng dati.
    index.php

    Ang pangunahing pagbabago ay nasa $global_content object, ang pangalan nito ay nagsasalita para sa sarili nito. Sa kasong ito, kabilang ito sa Outputable na klase; sa mga gawain sa totoong buhay, malamang na gagawa ka ng hiwalay na klase para sa nilalaman ng pahina.

    Kung titingnan mong mabuti, ang nilalaman ng script ay halos hindi nagbago - ang parehong inbox, ang parehong toPage(). Nagdagdag ng tagubilin na nagpapakita ng mga nilalaman ng listahan ng mensahe sa nilalaman ng pahina. Para sa pagkakaiba-iba, dalawang mensahe ang nabuo ngayon.

    Upang tingnan ang resulta, ang natitira na lang ay ihanda ang XSL template.
    style.xsl

    Halimbawa ng XSLT

    mensahe

    Ano ang narating natin?

    Una sa lahat, maaari kang mas kumpiyansa na kumuha ng mga kumplikadong proyekto - sinisiguro ang tunay na kalayaan ng mga module. Ang pagkakasunud-sunod kung saan ang mga resulta ay inilalagay sa pahina ay kinokontrol na ngayon gamit ang isang panlabas na XSL na template at hindi nakadepende sa pagkakasunud-sunod kung saan ang mga module ay pinapatakbo.

    Anumang module na bumubuo ng XML data bilang resulta ng trabaho nito ay maaaring gamitin sa isang proyekto. Sa pamamagitan ng paraan, ito ay isa sa mga pakinabang sa mga template engine, kung saan ang paglikha ng data ay binubuo ng isang pagkakasunud-sunod ng mga pamamaraan ng pagtawag (magtalaga, atbp.) ng isang tiyak na makina, kung saan walang karaniwang pamantayan.

    Ang isa pang bentahe ay kadalian ng pag-debug. Kung patakbuhin mo ang script, mapapansin mo na ang bawat pahina ay naglalaman ng debug output - isang XML prototype na lubos na nagpapadali sa mga aplikasyon sa pag-debug.

    Ang isa pang bagay na kailangan mong isipin ay kung paano lumikha ng mga bagay ng mensahe. Hindi palaging maginhawang gumamit ng bago nang direkta sa client code. Ngunit marahil ito ay isang paksa para sa isang hiwalay na artikulo.

    Sa wakas, isang gallop tungkol sa mga prospect:

    * mga pop-up window para sa isang listahan ng mahahalagang mensahe
    * "mga pahina ng nagpadala" at "mga pahina ng patutunguhan" sa mga mensahe
    * pag-log ng mga mensahe sa database
    * button na "ipakita ang kasaysayan ng aking mga aksyon"
    * istatistikal na pagsusuri ng mga aksyon ng user sa loob ng mga session
    * "matalinong katulong" sa mga web application

    Sa KP at BUS, simula sa bersyon 11.5, sa mga edisyon na may kasamang social network, isang bagong module na "Web messenger" ang lumitaw.
    Bago ilabas sa lahat, ang module ay sumailalim sa binyag ng apoy sa aming "Social Intranet", na nangongolekta ng hanggang 8 update


    Sa anim na buwan ng pag-unlad, marami na tayong nagawa

    Lubos naming inabandona ang dating interface at gumawa ng bago, batay sa karanasan ng mga sikat na instant messenger.
    Nagsimulang magbukas ang dialogue window sa loob ng page, lumitaw ang mga mukha dito, may color code ang mga mensahe, at naging posible na madaling makipag-usap sa maraming tao nang sabay-sabay.

    Ang window ng kasaysayan ay isang hiwalay na paksa, lahat ay matagal nang nagnanais na magkaroon ng isang paghahanap sa kasaysayan, ngayon ay mayroon na kami nito, pinaplano naming magdagdag ng isang kalendaryo doon para sa mabilis na pag-navigate.

    Gumawa kami ng notification center na may iba't ibang uri ng mga mensahe, nagbigay ng kakayahang tingnan ang kasaysayan ng kanilang resibo, at para sa mga developer ng isang simpleng API para sa pagdaragdag at pag-recall ng mga notification.

    At lahat ng ito ay magagamit sa bawat pahina ng iyong site!

    Sa kasamaang palad, hindi lahat ng binalak ay natupad

    Una Ang wala kaming oras na gawin ay isalin ang mga mensahe sa aming mga talahanayan.
    Ang ganitong paglipat ay magiging posible na iwanan ang "social network" na module, na magbibigay ng higit na kalayaan sa pagpili ng mga editor, at posible ring ipakilala ang mga panggrupong chat.

    Pangalawa, ito ang pagpapatupad ng tunay na "instant" na komunikasyon. Ngayon ang module ay gumagamit ng regular na pooling, botohan ang server isang beses bawat n-segundo, ang panahon ng botohan ay nag-iiba depende sa aktibidad ng komunikasyon.
    Plano naming magsulat ng isang hiwalay na serbisyo na magpapanatili ng tuluy-tuloy na mga koneksyon at magpadala ng mga update ng data kung kinakailangan (para sa messenger, para sa live feed, atbp.).

    Pangatlo, plano naming bahagyang baguhin ang interface, abandunahin ang hiwalay na listahan ng contact at dialog window, at pagsamahin ang mga ito sa isang solong kabuuan, na sa hinaharap ay magpapahintulot sa amin na ilipat ang messenger sa isang mobile application.

    Wala pang dokumentasyon at hindi ito lalabas hanggang sa taglagas, dahil... Ang module ay aktibong binuo at gusto naming iwanan ang kakayahang baguhin ang API.
    Gayunpaman, susubukan kong mag-publish ng mga halimbawa ng pagtatrabaho sa bahaging iyon ng API kung saan natapos na ang trabaho at ligtas mong magagamit ang mga ito sa iyong mga module.

    Paggawa gamit ang mga notification (may-katuturan para sa IM simula sa bersyon 11.5.2)

    Nagpatupad kami ng tatlong uri ng mga notification:
    - personalized na abiso;
    - abiso mula sa system;
    - abiso na nangangailangan ng kumpirmasyon;

    Bago gamitin ang API, kailangan mong suriin kung naka-install ang module sa system:

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

    Personalized na notification


    Kung ang mga mensahe ay nakatakda sa NOTIFY_TAG, ipapangkat ng user ang mga ito.

    Notification mula sa system


    $arMessageFields = array(// recipient "TO_USER_ID" => $USER->GetId(), // sender (maaaring >0) "FROM_USER_ID" => 0, // uri ng notification "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // module na humiling na magpadala ng notification na "NOTIFY_MODULE" => "im", // simbolikong tag para sa pagpapangkat (isang mensahe lang ang ipapakita), kung hindi ito kinakailangan, huwag itakda ang parameter na "NOTIFY_TAG" => "IM_CONFIG_NOTICE", // notification text sa site (html at BB codes available) "NOTIFY_MESSAGE" => "[b]Attention: dapat mong suriin at tukuyin ang tamang landas patungo sa social network sa mga setting ng module na "Instant Messaging at Notifications"" , // teksto ng notification na ipapadala sa pamamagitan ng email (o XMPP ), kung walang mga pagkakaiba, huwag itakda ang parameter //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

    Notification na nangangailangan ng kumpirmasyon (kumpirmahin)


    $arMessageFields = array(// recipient "TO_USER_ID" => $USER->GetId(), // sender "FROM_USER_ID" => 2, // uri ng notification "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // module na humiling na ipadala ang notification "NOTIFY_MODULE " => "kalendaryo", // simbolikong tag para sa pagpapangkat (isang mensahe lang ang ipapakita), kung hindi ito kinakailangan, huwag itakda ang parameter na "NOTIFY_TAG" => "CALENDAR|INVITE|123|".$ USER->GetId() , // text ng notification sa site (html at BB codes available) "NOTIFY_MESSAGE" => "Iniimbitahan kitang makilahok sa pulong na "Instant Messaging and Notifications" na magaganap sa Marso 15, 2012 at 14:00", // text ng notification na ipapadala sa pamamagitan ng email (o XMPP), kung walang mga pagkakaiba, huwag itakda ang parameter na "NOTIFY_MESSAGE_OUT" => "Inimbitahan ka ng user na si Evgeny Shelenkov na makibahagi sa pulong na "Instant mga mensahe at notification” #BR# na magaganap sa 03/15/2012 sa 14:00.#BR # #BR# Tanggapin: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Tanggihan: http://test.ru/calend.php?CONFIRM=N&CID=123", // array na naglalarawan sa mga button ng notification "NOTIFY_BUTTONS" => Array(// 1. pangalan ng button, 2. value, 3. template ng button , 4. paglipat sa address pagkatapos i-click ang (opsyonal na parameter) Array("TITLE" => "Tanggapin", " VALUE" => "Y", "TYPE" => "tanggapin" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Refuse", "VALUE" => "N", "TYPE" => "cancel" /*, "URL " => "http://test.ru/?confirm=N" */),), // simbolikong code ng template ng pagpapadala ng liham, kung hindi tinukoy, ipinapadala ito kasama ang template ng notification na "NOTIFY_EMAIL_TEMPLATE" => " CALENDAR_INVITATION"); CIMNotify::Add($arMessageFields); ?>

    Upang gumana sa ganitong uri ng notification, hindi sapat na magpadala lamang ng mensahe; kailangan mo rin itong ihatid.

    Serbisyo
    Mayroong dalawang mga pagpipilian, ang pinakasimpleng isa ay sumusunod sa link (kung itinakda mo ang ika-4 na parameter sa NOTIFY_BUTTONS).
    Pagkatapos sundin ang link, kailangan mong tawagan ang sumusunod na code sa iyong code:
    Pansin: bigyang pansin ang pangalan ng mga tag; kapag tumawag ka ng pagtanggal, ang lahat ng mga mensaheng may tag na iyon ay tatanggalin.
    Kapag nagpapadala ng maraming mensahe, dapat itong isaalang-alang upang ang pagpapatupad ng isang aksyon ng isang user ay hindi aksidenteng matanggal ang abiso sa lahat (maliban sa mga lugar kung saan kailangan ang naturang lohika).

    Ang pangalawang opsyon ay sa mga kaganapan.
    1. kailangan mong irehistro ang dependency

    Huwag kalimutan sa loob ng iyong mga function Tanggapin ang paki-usap At RejectRequest dahilan upang matanggal ang abiso CIMNotify::DeleteByTag()

    Iyon lang sa ngayon, hinihintay ko ang iyong mga mungkahi sa mga komento, matagumpay na pagpapatupad!
    Kung gusto mong subukan ang API bago ang paglabas ng 11.5.2 sa isang array na may mga parameter, dapat mo ring tukuyin ang "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, gayundin ang opsyon na may link sa mga button ay hindi gagana para sa pagkumpirma ng mga notification. Ngunit mas mahusay na maghintay; ang update 11.5.2 ay ilalabas sa Mayo 23.

    Mas mabuti na ang masamang guhit kaysa delirium tremens...

    PHP AJAX CRUD: paglikha, pagtanggal, pag-edit ng mga tala sa database ng MySQL

    Sa artikulong ito, malalaman natin kung paano magdagdag, mag-edit at magtanggal ng mga tala sa isang database ng MySQL gamit ang PHP. Gumamit kami ng JQuery handler na nagpapadala ng kahilingan sa AJAX sa isang script sa gilid ng server. Ina-update ng handler ang listahan ng mga record.

    AJAX form para sa pagpapadala ng mga kahilingan para sa paglikha, pagtanggal, pag-edit

    Kapag nagdadagdag ng tala, nagpapadala ang form ng data sa script ng PHP sa pamamagitan ng kahilingan sa AJAX. Kung ang pagdaragdag ay matagumpay, ang listahan ng mga entry ay ire-reload.

    JQuery AJAX function para sa CRUD database query

    Sa JQuery AJAX function mayroon kaming switch case magdagdag ng edit at delete. Ang mga kasong ito ay bumubuo ng iba't ibang mga string ng data ng query at tugon depende sa mga aksyon sa database.

    function showEditBox(id) ($("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) function cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(mensahe); $("#frmAdd").show(); ) function 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, type: "POST", success:function(data)( switch(action) ( case "add": $("#comment-list-box").append(data); break; case "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); pahinga; case "delete": $("#message_"+id).fadeOut(); pahinga; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), error:function ()() )); )

    PHP script para sa CRUD operations

    Ang sumusunod na code ay nagsasagawa ng mga query laban sa database. Ang PHP script na ito, pagkatapos magsagawa ng CRUD action, ay nag-a-update ng mga tala bilang resulta ng tugon ng AJAX.

    require_once("dbcontroller.php"); $db_handle = bagong DBController(); $action = $_POST["action"]; 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 " Edit Delete " . $_POST["txtmessage"] . " "; ) break; case "edit": $result = mysql_query("UPDATE comment set message = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; break; case "delete": if ( !empty($_POST["message_id"])) ( mysql_query("DELETE FROM comment WHERE id=".$_POST["message_id"]); ) break; ) )

    Sa puntong ito sa kursong ito, ang pundasyon ng aming plugin ay inilatag, ang isang custom na hook ay tinukoy, at isang paulit-ulit na mensahe ay naka-attach upang ipakita kung paano gumagana ang hook.

    Na tayo Hindi ginawa, hindi nila ipinatupad ang mga uri ng mga mensahe at ang kanilang pagpapakita ayon sa data na ipinasok ng user.

    Ngunit bago tayo magsimula, kailangan nating magdagdag ng suporta para sa iba't ibang uri ng mensahe, isang interface ng klase na susuporta sa bawat uri ng mensahe, at ang istraktura ng data na kailangan upang mag-imbak ng mga naturang mensahe.

    Handa nang magsimula?

    Inaasahan kong ipagpatuloy ang tutorial, ngunit may ilang bagay na kailangan nating isaalang-alang bago sumisid muna sa source code. Tiyaking mayroon kang sumusunod na software na naka-install sa iyong system:

    • PHP 5.6.25 at MySQL 5.6.28
    • Apache o Nginx
    • WordPress 4.6.1
    • Ang iyong gustong IDE o editor

    At kung naghahanap ka ng all-in-one na solusyon, huwag kalimutang subukan ang MAMP.

    Nag-advance na kami sa

    Gaya ng nabanggit kanina, eksaktong nasa kalagitnaan tayo ng kursong ito. Kung napalampas mo ang alinman sa mga unang aralin, narito ang napag-usapan namin sa ngayon:

  • Sa unang tutorial, nakatuon kami sa pinakamababang pangunahing kaalaman para sa paglikha ng aming plugin at kung ano ang kailangan mong magkaroon upang makapagsimula.
  • Sa ikalawang bahagi, lumipat kami nang higit pa sa plugin, nagdaragdag ng kaunti sa pangunahing pahina ng pangangasiwa sa WordPress. Nagtalaga din kami ng custom na hook na ginagamit namin at pinatakbo ito sa gilid ng server. Itinakda din namin ang mga pangunahing parameter para sa aming Mga Setting ng Messenger.
  • At ito ang isasaalang-alang natin sa huling yugto ng pagsasanay:

  • Pagsasama-samahin namin ang lahat, makikita ito sa pagkilos, at gagawing available sa publiko ang plugin para sa pag-download.
  • Sa kasalukuyan ay mayroon kaming iba pang mga gawain, at tututukan namin ang mga ito.

    Balik na tayo sa trabaho

    Dahil kami ay bumaling sa trabaho (at tulad ng nakasaad sa nakaraang mga aralin), kami ay nakatuon sa karagdagang pagpapatupad ng mga gawain sa bahaging ito:

    Sa tutorial na ito, patuloy naming bubuuin ang aming Mga Setting ng Messenger sa pamamagitan ng pagdaragdag ng suporta para sa mga mensahe ng tagumpay at pagkabigo, pati na rin ang pagpindot sa mga isyu sa seguridad.

    Sa nakaraang artikulo, nagsimula kami sa Mga Setting ng Messenger, ngunit hanggang sa punto lamang ng pag-set up ng tampok na patuloy na magpapakita ng abiso ng tagumpay habang naglo-load ang pahina ng user.

    Sa tutorial na ito magdaragdag kami ng suporta para sa mga mensahe ng error, babala at tagumpay. Pagkatapos ay ipapakita namin ang mga ito sa screen upang makakuha ng ideya kung paano gagana ang messenger.

    Bukod pa rito, gagawa kami ng isa pang pagbabago na magdaragdag ng suporta para sa pag-dismiss ng mga notification sa pagpapasya ng user.

    Ito ang buong plano ng kinakailangang gawain para sa araling ito. Magsimula na tayo.

    Mga Setting ng extension ng Messenger

    Tandaan, ang buong punto ng Mga Setting ng Messenger ay upang tukuyin ang aming paraan ng pagtatrabaho sa mga custom na mensahe, custom na hook, at ang native na WordPress API para sa pagpapakita ng mga mensahe sa konteksto ng WordPress admin panel.

    Upang gawin ito, palawakin natin ang gawaing ginawa sa huling aralin at magsisimula dito.

    Mga matagumpay na mensahe

    Dahil nagsimula tayo sa mga matagumpay na mensahe sa nakaraang aralin, ipagpatuloy natin ang mga ito. Ngayon ay mayroon na kaming hard-coded na paraan na nagpapakita ng iisang trick: