Stingrs pievienošanas ziņojums php. PHP AJAX CRUD: ierakstu izveide, dzēšana, rediģēšana MySQL datu bāzē

Labāk slikta sērija nekā delīrijs tremens...

PHP AJAX CRUD: ierakstu izveide, dzēšana, rediģēšana MySQL datu bāzē

Šajā rakstā mēs uzzināsim, kā pievienot, rediģēt un dzēst ierakstus MySQL datu bāzē, izmantojot PHP. Mēs izmantojām JQuery apdarinātāju, kas nosūta AJAX pieprasījumu servera puses skriptam. Apdarinātājs atjaunina ierakstu sarakstu.

AJAX veidlapa izveides, dzēšanas, rediģēšanas pieprasījumu nosūtīšanai

Pievienojot ierakstu, veidlapa nosūta datus PHP skriptam, izmantojot AJAX pieprasījumu. Ja pievienošana ir veiksmīga, ierakstu saraksts tiek atkārtoti ielādēts.

JQuery AJAX funkcijas CRUD datu bāzes vaicājumam

JQuery AJAX funkcijā mums ir slēdžu gadījumi, kas var pievienot rediģēšanu un dzēšanu. Šie gadījumi ģenerē dažādas vaicājumu un atbilžu datu virknes atkarībā no datu bāzes darbībām.

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(); ="+ $("#txtmessage_"+id).val(); break; reģistrs "dzēst": queryString = "action="+action+"&message_id="+ id; break; ) jQuery.ajax(( url: " crud_action.php", data:queryString, ierakstiet: "POST", panākumi:function(data)( switch(action) ( case "add": $("#comment-list-box").append(data); break ; pārtraukums; burts "dzēst": $("#ziņa_"+id).fadeOut(); pārtraukums; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), kļūda:funkcija ()() )); )

PHP skripts CRUD operācijām

Šis kods veic datubāzes vaicājumus. Šis PHP skripts pēc CRUD darbības veikšanas atjaunina ierakstus AJAX atbildes rezultātā.

request_once("dbcontroller.php"); $db_handle = jauns DBController(); $darbība = $_POST["darbība"]; 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 " Rediģēt Dzēst " . $_POST["txtmessage"] . " "; ) break "rediģēt": $result = mysql_query("ATJAUNINĀT komentāra kopas ziņojumu = "".$_POST["txtmessage"]."" WHERE id=".$_POST["ziņojuma_id"]); if($result) echo $_POST["txtmessage"]; pārtraukums; reģistrs "dzēst": if ( !empty($_POST["ziņojuma_id"])) ( mysql_query("DZĒST NO komentāra WHERE id=".$_POST["ziņojuma_id"]); ) pārtraukums) )

Pārskats

Iebūvētā paziņojumu sistēma, pirmo reizi Joomla, ļauj jūsu lietotnei informēt lietotāju (vai lietotāju grupu) par dažādiem notikumiem. Uztveriet paziņojumus kā svarīgus brīdinājumus, ka lietotājs būtu ieinteresēts tos lasīt un sekot līdzi.
Paziņojumus var ģenerēt visur. Jūsu komponentā vai spraudņos un vēlāk tiek parādīts JomSocial paziņojumu sistēmā.
Šī apmācība jums parādīs, kā, taču, tā kā mums nav ne jausmas par kādu trešās puses komponentu, ko mēs varētu izmantot:) piemēri tiks veikti kopienas spraudnī, kas tiks aktivizēts notikumā onAfterProfileUpdate
Ja nezināt, kā izveidot spraudni, kas tiks aktivizēts šajā notikumā, iesakām pārbaudīt šo rokasgrāmatu

Ieviešot to savā komponentā jebkurā gadījumā

Kā minēts šīs apmācības pārskatā, mēs ģenerēsim paziņojumus, izmantojot kopienas spraudni.
Jūs, visticamāk, vēlēsities izveidot paziņojumus savā komponentā vai spraudnī. Tālāk sniegtā apmācība darbosies jebkurā no šiem gadījumiem. Jums tikai jānosaka, kurā koda punktā paziņojums tiks izveidots, un vienkārši ielādējiet failu JomSocial Core Libraries.

prasīt_vienreiz JPATH_ROOT . "/components/com_community/libraries/core.php" ;

Tālāk sniegtās apmācības ievērošana lieliski darbosies arī jūsu paplašinājumam

Attīstības vides sagatavošana

1. Mēs pieņemsim, ka jūs jau esat izveidojis kopienas tipa spraudni, kas tiks aktivizēts, kad lietotājs mainīs savu profilu
Ja nē, varat lejupielādēt tukšu spraudņa piemēru no , instalēt to Joomla un iespējot spraudni. Tas ir nosaukts Kopiena — paziņojumu piemērs
2. Pārejiet uz savu datu bāzi un iztukšojiet šīs divas tabulas, lai tajās vispār nebūtu ierakstu

A) prefix_community_notification
b) prefix_community_mailq

3. Jūsu testa vietnēs ir jābūt vismaz diviem (2) lietotājiem un jāzina viņu ID

Iepriekšējās Joomla versijās lietotāja ID vienmēr ir sākušies no norādītā skaitļa (62, 42). Joomla 3 šis skaitlis būs nejaušs, līdz ar to mūsu testēšanas vides attēls, jo tas noteikti atšķirsies jūsu beigās.

Pirmais paziņojums

Atveriet spraudņa php failu, kas atradīsies mapē ROOT/plugins/community/example
Funkcijā onAfterProfileUpdate() aizstājiet

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

Kā parādīts piemērā, paziņojumu pievienošanas api ir 7 parametri

  • $cmd — ir paziņojuma veids. Šajā failā varat redzēt visus paziņojumu veidus. ROOT/components/com_community/libraries/notificationtypes.php, sākot no 53. rindiņas vai ap to. Mēs iesakām izmantot paziņojuma veidu system_messaging.
  • $aktieris - ir persona, kas veic darbību
  • $target — ir persona vai cilvēku grupa, kas saņems paziņojumu
  • $subject — ir paziņojuma tēma gan paziņojuma uznirstošajā logā, gan e-pasta virsrakstā
  • $body — ir e-pasta paziņojuma ziņojuma pamatteksts
  • $template — ja jums ir nepieciešama konkrēta veidne, ko izmantot, varat to definēt šeit. Pretējā gadījumā šis parametrs var būt tukšs
  • $params — pielāgoti definēti parametri
  • Zinot to visu, definēsim mainīgos, ko izmantosim
    Mainiet spraudņa kodu uz:

    $lietotājs = CFactory::getUser(); $cmd = "sistēmas_ziņojumapmaiņa" ; // pirmais parametrs, darbības veids $actor = $user -> id ; //otrais parametrs - iegūstiet $actor ID $target = "965" ; // trešais param. Kas saņem paziņojumus? Mūsu izstrādātāju vidē tā administratora lietotājs ar id 965. Jūsu vidē jūs, visticamāk, vēlēsities iegūt ID no sava objekta vai no lietotāju masīva. $subject = "Paziņojuma tēma" ; // Abu, e-pasta un uznirstošo paziņojumu tēma $body = ; //Ķermeņa ziņojums e-pastos. $template = "" ; // Ja jums ir nepieciešams izmantot konkrētu jomsocial veidnes failu, varat to definēt šeit. $params = jauns CParameter("" ) ; // Mēs vēlamies izveidot papildu parametru objektu un piešķirt tam datus, formāli nedefinējot klasi CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Tagad piesakieties ar jebkuru lietotāju un mainiet profila informāciju. Dodieties uz datu bāzi, lai redzētu, kas noticis.
    Pārejiet uz tabulu prefix_community_notifications un novērojiet jauno ierakstu

    Pārejiet uz tabulu prefix_community_mailq un skatiet jauno ierakstu

    Apsveicam! - Jūs esat veiksmīgi izveidojis savu pirmo paziņojumu, kas ir nosūtīts pa e-pastu un iekšējo JomSocial paziņojumu sistēmu


    Iespējamais kods uzpūšanās

    Iepriekš minētais piemērs ir labs, un tas darbojas, bet kopumā nav ieteicams to izmantot šādi. Tā vietā to varētu uzrakstīt šādi

    $actor = CFactory::getUser(); $params = jauns CParameter("" ) ; CNotificationLibrary:: add ( "system_messaging" , $actor -> "Šis ir paziņojuma pamatteksta ziņojums" , "" , $params ) ;

    Tas ir daudz tīrāk un vieglāk sekot, vienlaikus darot to pašu, ko iepriekš parādītajā kodā.

    Pielāgoti paziņojumu parametri

    Paziņojumu API var paplašināt ar jebkuru parametru, kuru vēlaties pievienot.
    Šos parametrus var nodot vai nu e-pasta veidnei, paziņojumam un, protams, valodas failam.

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = jauns CParameter("" ) ; $params -> set ("actor", $actor -> getDisplayName () ) ; // var izmantot kā (actor) tagu $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Saite uz (aktieru) tagu $params -> set ("url" , $link ) ; //url no visas darbības. Izmanto, kad paziņojumu logā virza kursoru virs iemiesojuma. Var izmantot kā (url) tagu arī izejošajos e-pastos. Pārliecinieties, vai esat definējis $link mainīgo:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "This is the notification body message" , "" , $params ) ;

    • $params = jauns CParameter( ); - Mēs vēlamies izveidot jaunu parametru objektu un piešķirt tam datus, formāli nedefinējot klasi.
    • $params->set("aktieris", $actor->getDisplayName()); - Jūsu paziņojumā vienmēr ir jābūt aktierim. Šo parametru var nodot veidnei kā (aktiera) tagu. Paziņojumu logā tas definē lietotāju, kurš veic darbību.
    • $params->set("aktora_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - Aktiera URL parasti ir aktiera URL. Paziņojuma uznirstošajā logā tas pievieno saiti uz (aktiera) elementu
    • $params->set("url", $saite); - Šis ir vissvarīgākais parametrs, kas vienmēr ir pareizi jāiestata. Paziņojumu logā šis parametrs tiek izmantots virs iemiesojuma attēla. E-pasta paziņojumā tas atkārto vietu, kur notika darbība.

    Šajā piemērā mēs iestatīsim mainīgo $link uz zemi www.google.com lai jūs varētu redzēt, kā tas darbojas

    Valodas virknes pievienošana un parametru izmantošana

    Tikko iestatītie parametri ir pieejami lietošanai arī mūsu valodu failos.
    Ļauj definēt valodas taustiņus, mainot " CNatificationLibrary::add() API

    CNotificationLibrary::add("sistēmas_ziņojumapmaiņa" , $actor -> id , "965" , JText::sprintf("PLG_COMMUNITY_EXAMPLE_SUBJECT") , JText::sprintf("PLG_COMMUNITY_EXAMPLE_BODY") ,,par

    Valodas failam vajadzētu izskatīties šādi

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(aktieris) atjaunināts profils" PLG_COMMUNITY_EXAMPLE_BODY = "Sveiki, administrators \n Šis ir vēstule, lai informētu, ka (aktieris) ir atjaunināts profils \n\n Ja vēlaties doties uz Google, noklikšķiniet šeit \n a href=" _QQ_" (url)"_QQ_">(url)"

    Šajā piemērā mēs esam izmantojuši tagu (actor) un (url), lai nodotu datus gan paziņojumu, gan e-pasta veidnēm. Redzēsim, kā tas izskatās.
    Paziņojumu logā, virzot kursoru virs iemiesojuma, ievērojiet (url) parametru, kas ir ieslēgts un pievieno saiti uz Google virs iemiesojuma. Tas ir apzināti, jo mēs tā esam izveidojuši :)


    ]

    Tajā pašā logā, virzot kursoru virs aktiera saites. Šī ir daļa, kurā (aktors) atsaucās uz lietotāju, kurš veic darbību, savukārt (actor_url)" rūpējās, lai objekts tiktu pareizi saistīts


    Redzēsim, kas notiek e-pasta rindā


    Un visbeidzot faktiskais e-pasts, kas tiek nosūtīts gala lietotājam


    Panākumi
    Līdz šim esam izveidojuši trīs (3) parametrus, kas tiek veiksmīgi izmantoti paziņojumu logā un e-pastos.

  • (aktieris) — atgriež tā lietotāja lietotājvārdu, kurš veic darbību
  • (actor_url) — sniedz atribūts (aktieris)
  • (url) — nav obligāti, taču tam vienmēr ir jābūt paziņojumā. Tas ir galvenais vietrādis URL, kurā notikusi darbība, par kuru mēs esam informēti.
  • Līdzīgi jūs varat definēt "

    • (mērķis) - ja jums tas ir nepieciešams
    • (target_url), ja tas ir nepieciešams paziņojumā.
    • (nosaukums) — parasti izmanto, lai atsauktos uz objektu, kas ģenerēja paziņojumu. Piemērs: "Lietotājs X publicēja jaunu fotoattēlu albumā Y." Šeit ir albuma Y nosaukums
    • (title_url) — tāpat kā iepriekšējiem, tā objekta URL, kas ģenerēja paziņojumu.
    • (Ziņojums) — šo parametru var izmantot, lai iestatītu (un atbalsotu) ziņojumu JomSocial e-pasta pamattekstā.
    3,3 tūkst

    Ziņojumu parādīšana lietotājam ir diezgan izplatīta darbība, kas jāveic tīmekļa lietojumprogrammai. Tas var rasties, apstrādājot veidlapas, tas var būt kļūdu ziņojumi, ziņojumi, kas liek reģistrēties, kad lietotājs mēģina piekļūt ierobežotai vietnes daļai, un daudzos citos gadījumos.

    Ļoti bieži ziņojumu izveide un izvadīšana tiek sadalīta dažādos HTTP pieprasījumos. Parasti pēc veidlapu apstrādes ir ērti izmantot novirzīšanu (lai izvairītos no problēmām ar pogām Atpakaļ un Atsvaidzināt), taču tajā pašā laikā dabiskais ziņojuma izveides brīdis ir tieši veidlapu apstrādes un ar to saistīto darbību veikšanas brīdis. to. Kāpēc? Iedomājieties, ka ziņojuma tekstam vajadzētu izskatīties apmēram šādi: "Produktam "Mouse Pad" pasūtīto vienību skaits ir veiksmīgi mainīts no 7 uz 12." Pēc novirzīšanas, iespējams, uz pavisam citu lapu funkcionalitātes ziņā, būs papildu galvassāpes, lai noskaidrotu, kas tika darīts iepriekš.

    Visbiežāk ziņojumi tiek parādīti POST pieprasījumā, kas apstrādā veidlapu - tas nav labi, vārdi “šī lapa ir novecojusi” sabojā dzīvi (kad lietotājs nolemj izmēģināt pogu Atpakaļ).

    Kāds izmanto novirzīšanu, atsakoties no draudzīgiem ziņojumiem.

    Tajā pašā laikā ir vienkāršs un acīmredzams veids, kā padarīt dzīvi labāku. Neskatoties uz acīmredzamību, kaut kādu iemeslu dēļ es nekad neredzēju, ka kāds to izmantotu - vismaz tad, kad es paskatījos uz citu cilvēku avotiem.

    Tātad mums ir problēma - ziņojumam ir “jādzīvo” dažādos pieprasījumos. Mums ir nepieciešams mehānisms, lai ziņojuma tekstu pārsūtītu uz lapu, kurā tas būtu jāparāda. Jūs droši vien jau atcerējāties par sesijām.

    Jā, kopumā tev taisnība. Citas metodes, piemēram, izmantojot globālo mainīgo, neļauj saglabāt datus gadījumā, ja tiek izmantota novirzīšana (Maksima Naumenko piezīme). Turklāt es parasti pārliecinos, ka katram lietojumprogrammas ekrānam ir iespēja kopā ar citu informāciju parādīt ziņojumus, kas tika ģenerēti iepriekšējos ekrānos. Tas ir ērti, jo nav nepieciešams sagatavot atsevišķus ekrānus ziņojumu parādīšanai, kā arī lietotājam nav atkārtoti jāklikšķina ar peli. Bet, tiešām, dizaineram šeit ir jādomā - izcelt jomu, kurā parādītos ziņojumi.

    Ideja ir ļoti vienkārša un to var īstenot ar pāris nodarbībām.

    Pirmā lieta, kas nāk prātā, ir izveidot Ziņojumu klasi, kas faktiski attēlotu ziņojumu mūsu vienkāršajā klases diagrammā. Ziņojumam ir jāspēj saglabāt sevi sesijā, kā arī parādīt sevi ekrānā.

    class Ziņojums ( /** * Ziņojuma saturs. */ var $content; /** * Konstruktors ziņojuma teksta inicializēšanai. * * @param content message content */ function Message($content) ( $this->content = $ saturs ) /** * Uzrakstiet ziņojumu sesijai */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Izvada ziņojumu uz lapu */ funkcija toPage. () ( atbalss. " - " . $this->content .
    "; } }

    Mainīgais $_SESSION tiek izmantots, lai piekļūtu sesijai.

    Ņemiet vērā, ka $_SESSION ir masīvs, mēs izmantojam tikai vienu šī masīva elementu ar indeksu "session_message".

    Šajā gadījumā mums ir darīšana ar “masīvu masīvu” - tas, ko mēs saglabājam elementā “session_message”, ir masīvs, tas ir pārsūtīto ziņojumu saraksts (protams, tie var būt vairāki).

    Ja nevarat atrast pavedienu, ir pienācis laiks atjaunināt rokasgrāmatas sadaļas, kas veltītas sesijām un masīviem.

    Jums var būt jautājums. Kāpēc šeit ir vajadzīgas nodarbības? Varētu iztikt ar divām funkcijām. Bet paskatīsimies tālāk. Mums, iespējams, būs jāizveido dažāda veida ziņojumi (informācija, kļūda, brīdinājums) un jānosaka ziņojumu adresāti.

    Lūdzu, ņemiet vērā, ka šobrīd sesijā netiek ievietots pats objekts, bet tikai ziņojuma teksts. OOP ļauj vēlāk mainīt send() metodes uzvedību, nemainot klienta kodu, kas piekļūst šai metodei (piemēram, turpmāk sesijā varēsim ierakstīt visu ziņojuma objektu, ja tajā ir daudz lauku).

    Iedomāsimies, ka mēs to darītu, izmantojot funkcijas. Mums, iespējams, būtu funkcija message_send($txt), kā arī funkcija message_to_page($txt). Tagad mums ir jāpievieno iespēja izmantot dažādu veidu ziņojumus. Funkciju izsaukumi mainās: message_send($txt, $kind), message_to_page($txt, $kind). Jums būs jāizķemmē viss lietojumprogrammas kods, meklējot šādas funkcijas, veicot labojumus.

    No tā var izvairīties, iepriekš paredzot situāciju, uzrādot ziņojumu kā asociatīvu masīvu: $msg[’txt’], $msg[’kind’], tad funkciju izsaukumos būs tikai viens parametrs. Vai jūtat, kā šī mēģina kļūt par klasi?

    Tātad OOP sniedz jums iespēju nedomāt par visu iepriekš.

    Nākamā klase - Inbox - ir paredzēta tieši šim nolūkam.

    class Inbox ( /** * Saņemto ziņojumu masīvs. */ var $messages = array(); /** * Konstruktorā mēs iegūstam visus saņemtos ziņojumus * un izdzēšam tos no sesijas. */ funkcija Inbox() ( if (is_array($ _SESSION["sesijas_ziņojumi"])) ( $ziņojumi = $_SESSION["sesijas_ziņojumi"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->ziņojumi = jauns ziņojums($ziņas[$i]); ) ) /* notīrīt ziņojumu masīvu */ $_SESSION["session_messages"] = masīvs(); ) /** * Parādīt lapā Iesūtnes saturu. */ funkcija toPage() ( $co = sizeof($this->messages); if ($co > 0) ( atbalss "Ziņojums no sistēmas:
    "; ) for ($i = 0; $i< $co; $i++) { $this->ziņojumi[$i]->ToLapa(); ) ) )

    Izmēģināsim mūsu ziņojumapmaiņas sistēmu.

    Izveidosim ļoti vienkāršu piemēru, kas atbildēs uz veidlapas iesniegšanu, ziņojot par sekunžu skaitu pašreizējā minūtē.

    Mēs paslēpām visu darbu ar masīviem un sesijām klasēs, un gala kods izskatās vienkāršs un skaists.

    Izveidojiet direktoriju savā tīmekļa serverī, pēc tam izveidojiet tajā šos trīs failus un izmēģiniet skriptu. Lūdzu, ņemiet vērā, ka ar pogām Atpakaļ un Atsvaidzināt nav problēmu.

    Tagad iedomājieties, ka veidojat sarežģītu portālu, kura lapās parasti ir vairāki bloki, un katrā no tiem var būt atsevišķa lietojumprogramma.

    Šeit mēs saskaramies ar divām grūtībām:

    * Es vēlētos, lai ziņojumu saraksts tiktu parādīts noteiktā lapas daļā, un jūs jau esat atradis tam piemērotu vietu.
    Problēma ir tāda, ka jums ir jāpalaiž komanda $inbox->toPage() tieši tajā brīdī, kas atbilstu ziņojumu saraksta pozīcijai lapā. Ja vēlamies mainīt šī saraksta pozīciju, mums būs jāiedziļinās kodā, taču nav labi šim nolūkam pastāvīgi mainīt portāla rāmi. Labākais risinājums būtu izveidot ziņojumu izvadi atsevišķa moduļa veidā, par kuru mēs zinām tikai to, ka tam ir jābūt savienotam ar ietvaru.
    Tas ir, atbrīvojieties no stingras moduļu palaišanas secības. Patiešām, tā kā Inbox izvades rezultāts nav atkarīgs no sistēmas darbības (šajā solī mums jau ir visi sesijas dati), tad kāpēc tā ir papildu sarežģītība?
    * Lai saglabātu ziņojumu saraksta izskatu (dizainu), jums ir jārūpējas par HTML kodu, kas tiek iekodēts Message un Inbox klases metodēs toPage(). Parasti, lai mainītu dizainu, jums būs jāmaina PHP kods.

    Lai mēģinātu atrisināt pirmo problēmu, varat izveidot buferi, kurā tiek saglabāti iesūtnes izvades rezultāti.

    Iespējams, mums joprojām būs vairākas līdzīgas (inbox) lietas, un mums ir jāizveido bufersistēma. Lai nesajauktu, kura produkcija ir kura, iespējams, nonāksim pie buferu nosaukšanas. Mēs kaut kur saglabāsim secību, saskaņā ar kuru buferi jāizvada - vēlams ārējā failā, lai atvieglotu izmaiņas.

    Šis risinājuma mēģinājums jau dod mums domu par XML izmantošanu kā starpposma datu glabāšanas līdzekli. Un XSLT stilu izmantošana palīdzēs atrisināt otro problēmu.

    Es nekavēšos pie tā, kas ir XML un kas ir XSLT. Ja neesat pazīstams ar šīm lietām, zvon.org ir laba vieta, kur sākt meklēt.

    Ideja ir ģenerēt nevis HTML kodu, bet gan XML struktūru toPage() metodēs. Lapas dokuments tiks izveidots kā virkne ar XML kodu (tas kalpos kā “buferis”), un skripta pēdējā posmā izmantosim XSL transformāciju.

    Vispirms iedomāsimies, kam vajadzētu būt koda galvenās daļas rezultātam.

    minūte 57 sekunde: 45

    Kas tas ir, ir diezgan viegli uzminēt - divi ziņojumi un veidlapa. Lūdzu, ņemiet vērā, ka PHP skriptam ir tikai jāsagatavo šāda virkne - tas ir ļoti vienkārši. Turklāt galveno tagu secība nav svarīga - jūs varat tos ievietot pirmajā vietā, piemēram, kā tas būs ērti programmētājam. Kā to īstenot. Jūs varat, neko nemainot, izmantot izvades buferizāciju, izvadīt XML, nevis HTML kodu, un beigās vienkārši tvert izvadi virknē. Bet tad mēs zaudēsim elastību - piemēram, dažreiz jūs vēlaties izvadīt atkļūdošanas informāciju tieši lapā (izmantojot atbalsi). Tajā pašā laikā PHP izstrādātāji strādā pie DOM moduļa, kas piedāvā progresīvāku veidu, kā izveidot un nodot koka dokumentus. Ja mēs vēlamies ieviest DOM, mums būs jāpārveido visa lietojumprogramma, mainot virkņu izvadi uz DOM elementu izveidi. Tāpēc es dodu priekšroku objektu XML attēlojuma glabāšanai pašos objektos, secīgi saliekot kopīgu XML dokumentu. Tas nav tik grūti, tas tikai nedaudz jāmaina. Jūs redzēsit, ka šī metode nav stingri saistīta ar konkrētu XML datu glabāšanas veidu, un tas ļaus jums pāriet uz DOM izmantošanu ar nelielu piepūli. Pirmkārt, ievērojiet, ka katram no mūsu objektiem ir metode toPage(). Šai līdzībai vajadzētu likt mums domāt par jaunas kopīgas vecāku klases ieviešanu. Ļaujiet katrai klasei, kas var izveidot lapas XML dokumenta daļas, mantot no klases, kas rūpēsies par objekta XML attēlojumu. Sauksim to par izvadāmu.

    class Izvadāms ( /** * XML konteiners (virkne). */ var $output = ""; /** * Norādiet konteinera saturu un notīriet konteineru. * * @atgriezt virkni ar XML datiem */ funkcija getOutput () ( $ out = $this->output; $this->output = ""; return $out; ->output .= $string . "n" ) /** * "Abstract" metode */ function toPage( ) ( ) )

    Metode toPage() ir tukša - šajā gadījumā tā ir nepieciešama kā indikators tam, kā ārējām “matryoshka” klasēm jāsazinās ar iekšējo klasi. Tomēr mēs šeit varētu piedāvāt noklusējuma ieviešanu, ja pamanītu, ka ir daudz objektu, kas lapā tiek parādīti tādā pašā veidā.

    Klases Ziņojums un Iesūtne nedaudz mainīsies — tām tagad vajadzētu būt mantotām no Outputable, un mainīsies arī metodes toPage()
    Message.php

    klase Ziņojuma paplašinājumi Izvadāms ( /** * Ziņojuma saturs. */ var $content; /** * Konstruktors ziņojuma teksta inicializācijai. * * @param saturs ziņojuma saturs */ funkcija Message($content) ( $this->content = $content; ) /** * Rakstiet ziņojumu sesijai */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Izvada ziņu lapai ( $ this->appendOutput("".$this->content."" ) )

    class Inbox extends Outputable ( /** * Saņemto ziņojumu masīvs. */ var $messages = array(); /** * Konstruktorā mēs saņemam visus saņemtos ziņojumus * un noņemam tos no sesijas. */ function Inbox( ) ( if (is_masīvs ($_SESSION["sesijas_ziņojumi"])) ( $ziņojumi = $_SESSION["sesijas_ziņojumi"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->ziņojumi = jauns ziņojums($ziņas[$i]); ) ) /* notīrīt ziņojumu masīvu */ $_SESSION["session_messages"] = masīvs(); ) /** * Parādīt lapā Iesūtnes saturu. */ funkcija toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->ziņojumi[$i]->ToLapa(); $this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput(""); ) )

    Izvades metode ir mainījusies – tagad tā vietā, lai tieši izvadītu uz lapu, ārējais attēlojums pagaidām tiek glabāts Outputable, kas “sēž” katrā no objektiem. Metode appendOutput() kalpo kā echo() konstrukcijas aizstājējs. Lai iegūtu objekta izvadi, tiek izmantota metode getOutput().

    Tagad apskatīsim, kāda ir koda klienta daļa, kas atrisinās to pašu problēmu kā iepriekš.
    indekss.php

    Galvenais jauninājums ir $global_content objektā, kura nosaukums runā pats par sevi. Šajā gadījumā tas pieder klasei Outputable reālās dzīves uzdevumos, jūs, iespējams, izveidotu atsevišķu klasi lapas saturam.

    Ja paskatās vērīgi, tad skripta saturs praktiski nav mainījies – tā pati inbox, tā pati toPage(). Pievienota instrukcija, kas lapas saturā parāda ziņojumu saraksta saturu. Dažādības labad tagad tiek ģenerēti divi ziņojumi.

    Lai apskatītu rezultātu, atliek tikai sagatavot XSL veidni.
    style.xsl

    XSLT piemērs

    ziņa

    Ko esam sasnieguši?

    Pirmkārt, jūs varat drošāk uzņemties sarežģītus projektus – tiek nodrošināta reāla moduļu neatkarība. Rezultātu ievietošanas secība lapā tagad tiek kontrolēta, izmantojot ārēju XSL veidni, un tā nav atkarīga no moduļu palaišanas secības.

    Projektā var izmantot jebkuru moduli, kas sava darba rezultātā ģenerē XML datus. Starp citu, šī ir viena no priekšrocībām salīdzinājumā ar veidņu dzinējiem, kuros datu izveide sastāv no konkrēta dzinēja izsaukšanas metožu secības (piešķiršanas utt.), kurai nav vienota standarta.

    Vēl viena priekšrocība ir atkļūdošanas vienkāršība. Ja palaižat skriptu, pamanīsit, ka katra lapa satur atkļūdošanas izvadi — XML prototipu, kas ievērojami vienkāršo atkļūdošanas lietojumprogrammas.

    Vēl kaut kas, kas jums ir jādomā, ir ziņojumu objektu izveide. Ne vienmēr ir ērti lietot jaunu tieši klienta kodā. Bet varbūt šī ir atsevišķa raksta tēma.

    Visbeidzot, atainojums par perspektīvām:

    * uznirstošie logi svarīgu ziņojumu sarakstam
    * "sūtītāja lapas" un "galamērķa lapas" ziņojumos
    * ziņojumu reģistrēšana datu bāzē
    * poga "rādīt manu darbību vēsturi"
    * statistiskā analīze par lietotāju darbībām sesiju laikā
    * "inteliģentie palīgi" tīmekļa lietojumprogrammās

    KP un BUS, sākot ar versiju 11.5, izdevumos, kas ietver sociālo tīklu, ir parādījies jauns modulis “Web messenger”.
    Pirms modulis tika izlaists visiem, tas tika kristīts mūsu sociālajā iekštīklā, savācot pat 8 atjauninājumus.


    Sešu attīstības mēnešu laikā mēs esam daudz paveikuši

    Mēs pilnībā atteicāmies no iepriekšējās saskarnes un izveidojām jaunu, pamatojoties uz populāro tūlītējo ziņojumapmaiņas programmu pieredzi.
    Lapā sāka atvērties dialoga logs, tajā parādījās sejas, ziņojumi tika apzīmēti ar krāsu kodiem, un kļuva iespējams ērti turpināt sarunu ar vairākiem cilvēkiem vienlaikus.

    Vēstures logs ir atsevišķs temats, visi sen ir gribējuši vēstures meklēšanu, nu beidzot tas ir, plānojam tur pievienot kalendāru ātrai navigācijai.

    Mēs izveidojām paziņojumu centru ar dažāda veida ziņojumiem, nodrošinājām iespēju skatīt to saņemšanas vēsturi un izstrādātājiem vienkāršu API paziņojumu pievienošanai un atsaukšanai.

    Un tas viss ir pieejams katrā jūsu vietnes lapā!

    Diemžēl ne viss iecerētais tika īstenots

    Pirmkārt Mums nebija laika, ko darīt, bija pārtulkot ziņojumus mūsu tabulās.
    Šāda pāreja ļautu atteikties no “sociālo tīklu” moduļa, kas dotu lielāku brīvību redaktoru izvēlē, kā arī būtu iespējams ieviest grupu čatus.

    Otrkārt, šī ir patiesas "tūlītējas" komunikācijas īstenošana. Tagad modulis izmanto regulāru pūlēšanu, aptauju serveri reizi n-sekundēs, aptaujas periods mainās atkarībā no komunikācijas aktivitātes.
    Plānojam uzrakstīt atsevišķu servisu, kas uzturēs pastāvīgus savienojumus un izsūtīs datu atjauninājumus pēc nepieciešamības (mēnesenim, tiešraidei utt.).

    Trešais, mēs plānojam nedaudz mainīt saskarni, atteikties no atsevišķā kontaktpersonu saraksta un dialoga loga un apvienot tos vienā veselumā, kas nākotnē ļaus mums pārvietot kurjeru mobilajā aplikācijā.

    Dokumentācijas pagaidām nav un līdz rudenim tā arī neparādīsies, jo... Modulis tiek aktīvi izstrādāts, un mēs vēlamies atstāt iespēju mainīt API.
    Tomēr es mēģināšu publicēt piemērus darbam ar to API daļu, pie kuras darbs jau ir pabeigts, un jūs varat tos droši izmantot savos moduļos.

    Darbs ar paziņojumiem (attiecas uz tūlītējo ziņojumu, sākot no versijas 11.5.2)

    Mēs esam ieviesuši trīs veidu paziņojumus:
    - personalizēts paziņojums;
    - paziņojums no sistēmas;
    - paziņojums, kam nepieciešams apstiprinājums;

    Pirms API lietošanas pārbaudiet, vai modulis ir instalēts sistēmā:

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

    Personalizēts paziņojums


    Ja ziņojumi ir iestatīti uz NOTIFY_TAG, lietotājs tos grupēs.

    Paziņojums no sistēmas


    $arMessageFields = masīvs(// adresāts "TO_USER_ID" => $USER->GetId(), // sūtītājs (var būt >0) "FROM_USER_ID" => 0, // paziņojuma veids "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // modulis, kas pieprasīja nosūtīt paziņojumu "NOTIFY_MODULE" => "im", // simbolisks tags grupēšanai (tiks parādīts tikai viens ziņojums), ja tas nav nepieciešams, neiestatiet parametru "NOTIFY_TAG" => "IM_CONFIG_NOTICE", // paziņojuma teksts vietnē (pieejami html un BB kodi) "NOTIFY_MESSAGE" => "[b]Uzmanību: jums jāpārbauda un jānorāda pareizais ceļš uz sociālo tīklu moduļa "Tūlītējā ziņojumapmaiņa un paziņojumi" iestatījumos" , // paziņojuma teksts, kas jānosūta pa e-pastu (vai XMPP ), ja nav atšķirību, neiestatiet parametru //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

    Paziņojums, kam nepieciešams apstiprinājums (apstiprināt)


    $arMessageFields = array(// adresāts "TO_USER_ID" => $USER->GetId(), // sūtītājs "FROM_USER_ID" => 2, // paziņojuma veids "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // modulis, kas pieprasīja nosūtīt paziņojumu "NOTIFY_MODULE " => "calendar", // simbolisks tags grupēšanai (tiks parādīts tikai viens ziņojums), ja tas nav nepieciešams, neiestatiet parametru "NOTIFY_TAG" => "CALENDAR|INVITE|123|".$ USER->GetId() , // paziņojuma teksts vietnē (pieejami html un BB kodi) "NOTIFY_MESSAGE" => "Aicinu piedalīties sanāksmē "Tūlītējā ziņojumapmaiņa un paziņojumi", kas notiks 15. martā, 2012 at 14:00", // paziņojuma teksts nosūtīt pa e-pastu (vai XMPP), ja nav atšķirību, neiestatiet parametru "NOTIFY_MESSAGE_OUT" => "Lietotājs Jevgeņijs Šeļenkovs aicina piedalīties sapulcē "Instant ziņojumi un paziņojumi” #BR#, kas notiks 15.03.2012. plkst. 14:00.#BR # #BR# Pieņemiet: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Atteikt: http://test.ru/calend.php?CONFIRM=N&CID=123", // masīvs, kas apraksta paziņojumu pogas "NOTIFY_BUTTONS" => Masīvs(// 1. pogas nosaukums, 2. vērtība, 3. pogas veidne , 4. pāreja uz adresi pēc noklikšķināšanas (izvēles parametrs) Array("TITLE" => "Accept", " VALUE" => "Y", "TYPE" => "accept" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Atteikt", "VALUE" => "N", "TYPE" => "atcelt" /*, "URL " => "http://test.ru/?confirm=N" */),), // vēstules nosūtīšanas veidnes simboliskais kods, ja nav norādīts, tas tiek nosūtīts ar paziņojumu veidni "NOTIFY_EMAIL_TEMPLATE" => " KALENDĀRS_UZAICINĀJUMS"); CIMNotify::Add($arMessageFields); ?>

    Lai strādātu ar šāda veida paziņojumiem, nepietiek tikai ar ziņojuma nosūtīšanu.

    apkalpošana
    Ir divas iespējas, visvienkāršākā ir sekot saitei (ja NOTIFY_BUTTONS iestatāt 4. parametru).
    Pēc tam, kad sekojat saitei, savā kodā ir jāizsauc šāds kods:
    Uzmanību: pievērsiet īpašu uzmanību tagu nosaukumam, kad izsaucat dzēšanu, visi ziņojumi ar šo tagu tiks dzēsti.
    Sūtot vairākus ziņojumus, tas ir jāņem vērā, lai viena lietotāja darbības izpilde nejauši neizdzēstu paziņojumu visiem (izņemot vietas, kur šāda loģika ir nepieciešama).

    Otra iespēja ir pasākumos.
    1. jāreģistrē atkarība

    Neaizmirstiet par savām funkcijām ConfirmRequest Un RejectRequest izraisīt paziņojuma dzēšanu CIMNotify::DeleteByTag()

    Pagaidām tas arī viss, gaidu jūsu ieteikumus komentāros, veiksmīgas realizācijas!
    Ja vēlaties izmēģināt API pirms 11.5.2 izlaišanas masīvā ar parametriem, papildus jānorāda "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, arī opcija ar saiti pogās nedarbosies apstiprinājuma paziņojumiem. Bet labāk ir pagaidīt; atjauninājums 11.5.2 iznāks 23. maijā.

    Šajā kursa brīdī ir izveidots mūsu spraudņa pamats, ir definēts pielāgots āķis un ir pievienots pastāvīgs ziņojums, kas parāda, kā āķis darbojas.

    Ka mēs Nav izdarīja, viņi neieviesa ziņojumu veidus un to attēlošanu atbilstoši lietotāja ievadītajiem datiem.

    Bet pirms sākam, mums ir jāpievieno atbalsts dažādiem ziņojumu veidiem, klases interfeiss, kas atbalstīs katru ziņojuma veidu, un datu struktūra, kas nepieciešama šādu ziņojumu glabāšanai.

    Vai esat gatavs sākt?

    Ar nepacietību gaidu apmācības turpināšanu, taču ir dažas lietas, kas mums jāņem vērā, pirms iedziļināties avota kodā. Pārliecinieties, vai jūsu sistēmā ir instalēta šāda programmatūra:

    • PHP 5.6.25 un MySQL 5.6.28
    • Apache vai Nginx
    • WordPress 4.6.1
    • Jūsu vēlamais IDE vai redaktors

    Un, ja meklējat universālu risinājumu, neaizmirstiet izmēģināt MAMP.

    Mēs esam virzījušies uz

    Kā minēts iepriekš, mēs esam tieši šī kursa vidū. Ja esat nokavējis kādu no pirmajām nodarbībām, lūk, ko mēs līdz šim esam apskatījuši:

  • Pirmajā apmācībā mēs koncentrējāmies uz minimālajiem pamatiem mūsu spraudņa izveidei un tam, kas jums ir nepieciešams, lai sāktu darbu.
  • Otrajā daļā mēs virzījāmies tālāk ar spraudni, nedaudz papildinot pamata administrācijas lapu WordPress. Mēs arī piešķīrām pielāgotu āķi, ko izmantojam, un palaidām to servera pusē. Mēs iestatījām arī iestatījumu ziņojumapmaiņas pamatparametrus.
  • Un tas ir tas, ko mēs apsvērsim apmācības pēdējā posmā:

  • Mēs to visu savienosim, redzēsim darbībā un padarīsim spraudni publiski pieejamu lejupielādei.
  • Pašlaik mums ir citi uzdevumi, un mēs koncentrēsimies uz tiem.

    Atgriezīsimies pie darba

    Tā kā esam pievērsušies darbam (un kā minēts iepriekšējās nodarbībās), esam apņēmušies turpināt šīs daļas uzdevumu izpildi:

    Šajā apmācībā mēs turpināsim pilnveidot iestatījumu Messenger, pievienojot atbalstu veiksmes un neveiksmes ziņojumiem, kā arī pieskaroties drošības problēmām.

    Iepriekšējā rakstā mēs sākām darbu lietotnē Settings Messenger, taču tikai līdz tādai funkcijai, kas nepārtraukti rādīs paziņojumu par panākumiem, kamēr tiek ielādēta lietotāja lapa.

    Šajā apmācībā mēs pievienosim atbalstu kļūdu, brīdinājumu un veiksmes ziņojumiem. Pēc tam mēs tos parādīsim ekrānā, lai iegūtu priekšstatu par to, kā kurjers darbosies.

    Turklāt mēs veiksim vēl vienu izmaiņu, kas papildinās atbalstu paziņojumu noraidīšanai pēc lietotāja ieskatiem.

    Šis ir viss šīs nodarbības nepieciešamā darba plāns. Sāksim.

    Iestatījumi Messenger paplašinājums

    Atcerieties, ka Iestatījumu ziņojumapmaiņas mērķis ir definēt mūsu veidu, kā strādāt ar pielāgotiem ziņojumiem, pielāgotiem āķiem un vietējo WordPress API, lai parādītu ziņojumus WordPress administratora paneļa kontekstā.

    Lai to izdarītu, mēs paplašināsim pēdējā nodarbībā paveikto un sāksim no šejienes.

    Veiksmīgas ziņas

    Tā kā iepriekšējā nodarbībā sākām ar veiksmīgiem ziņojumiem, tad turpināsim ar tiem. Tagad mums ir stingri kodēta metode, kas parāda vienu triku: