Szigorú üzenet hozzáadása php. PHP AJAX CRUD: rekordok létrehozása, törlése, szerkesztése a MySQL adatbázisban

Jobb egy rossz sorozat, mint a delirium tremens...

PHP AJAX CRUD: rekordok létrehozása, törlése, szerkesztése a MySQL adatbázisban

Ebben a cikkben megtudjuk, hogyan adhat hozzá, szerkeszthet és törölhet rekordokat egy MySQL adatbázisban PHP használatával. JQuery kezelőt használtunk, amely AJAX kérést küld egy szerveroldali szkriptnek. A kezelő frissíti a rekordok listáját.

AJAX űrlap létrehozási, törlési, szerkesztési kérelmek küldéséhez

Rekord hozzáadásakor az űrlap adatokat küld a PHP szkriptnek egy AJAX kéréssel. Ha a hozzáadás sikeres, a bejegyzések listája újra betöltődik.

JQuery AJAX függvények CRUD adatbázis-lekérdezéshez

A JQuery AJAX funkcióban lehetőség van a kapcsolók eseteire, szerkesztésre és törlésre. Ezek az esetek az adatbázisműveletektől függően különböző lekérdezési és válaszadat-karakterláncokat generálnak.

függvény showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) függvény cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(message); $("#frmAdd").show(); függvény callCrudAction(action,id) ( $("#loaderIcon").show(); var queryString; switch(action) ("add" : queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); ="+ $("#txtmessage_"+id).val(); break; case "delete": queryString = "action="+action+"&message_id="+ id; break; ) jQuery.ajax(( url: " crud_action.php", data:queryString, típus: "POST", siker:function(data)( switch(action) ( case "add": $("#comment-list-box").append(data); break ; case "edit": $("#message_" + id + " .message-content").html(data("#frmAdd").show(); szünet; case "delete": $("#üzenet_"+id).fadeOut(); szünet; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), hiba:függvény ()() )); )

PHP szkript a CRUD műveletekhez

A következő kód lekérdezéseket hajt végre az adatbázisban. Ez a PHP-szkript egy CRUD-művelet végrehajtása után frissíti a rekordokat az AJAX-válasz eredményeként.

request_once("dbcontroller.php"); $db_handle = new DBController(); $akció = $_POST["akció"]; 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 "edit": $result = mysql_query("UPDATE comment set message = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($eredmény) echo $_POST["txtmessage"]; break; kis- és nagybetű "delete": if ( !empty($_POST["üzenetazonosító"])) ( mysql_query("DELETE FROM FROM WHERE id=".$_POST["üzenetazonosító"]); ) break) )

Áttekintés

A beépített értesítési rendszer, először a Joomlában, lehetővé teszi, hogy az alkalmazás folyamatosan tájékoztassa a felhasználót (vagy felhasználói csoportot) a különféle eseményekről. Tekintse az értesítéseket fontos figyelmeztetéseknek, amelyekkel a felhasználó szívesen olvasná és nyomon követné azokat.
Értesítések mindenhol generálhatók. A komponensben vagy a beépülő modulokban, és később megjelenik a JomSocial értesítési rendszerben.
Ez az oktatóanyag megmutatja, hogyan kell, de mivel fogalmunk sincs semmilyen harmadik féltől származó összetevőről, amelyet használhatnánk:) a példákat egy közösségi bővítményen készítjük el, amely az onAfterProfileUpdate eseménynél aktiválódik.
Ha nem tudja, hogyan hozzon létre egy bővítményt, amely aktiválódik ezen az eseményen, javasoljuk, hogy ellenőrizze ezt az útmutatót

Mindenképpen implementálja az összetevőjébe

Amint az oktatóanyag áttekintésében szerepel, értesítéseket generálunk a közösségi bővítmény segítségével.
Valószínűleg értesítéseket szeretne létrehozni az összetevőben vagy a bővítményben. A következő oktatóanyag minden esetben működni fog. Csak azt kell meghatároznia, hogy a kód mely pontján jön létre az értesítés, és csak betöltenie kell a JomSocial Core Libraries fájlt.

igényel_egyszer JPATH_ROOT . "/components/com_community/libraries/core.php" ;

Az alábbiakban ismertetett oktatóanyag követése az Ön bővítményénél is jól működik

A fejlesztési környezet előkészítése

1. Feltételezzük, hogy már létrehozott egy közösségi típusú példa beépülő modult, amely akkor aktiválódik, amikor a felhasználó megváltoztatja a profilját
Ha nem, letöltheti az üres példabővítményt a webhelyről, telepítheti a Joomlába, és engedélyezheti a bővítményt. Meg van nevezve Közösség – Értesítések Példa
2. Navigáljon az adatbázisába, és ürítse ki ezt a két táblát, hogy ne legyenek rekordok

A) prefix_community_notification
b) prefix_community_mailq

3. Legyen legalább két (2) felhasználója a tesztoldalain, és ismerje az azonosítójukat

A Joomla korábbi verzióiban a felhasználói azonosítók mindig meghatározott számtól (62, 42) indultak. A Joomla 3-ban ez a szám véletlenszerű lesz, így a tesztkörnyezetünk képe, mert az Ön végén biztosan más lesz.

Az első értesítés

Nyissa meg a beépülő modul php fájlját, amely a ROOT/plugins/community/example mappában lesz
Az onAfterProfileUpdate() függvényen belül cserélje ki a

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

Amint a példában látható, az értesítési hozzáadási API-nak 7 paramétere van

  • $cmd – az értesítés típusa. Ebben a fájlban az összes értesítéstípust láthatja. ROOT/components/com_community/libraries/notificationtypes.php az 53. sortól kezdve, vagy annak környékén. Javasoljuk a system_messaging értesítési típus használatát.
  • $színész – az a személy, aki végrehajtja a cselekvést
  • $célpont – az a személy vagy embercsoport, aki értesítést kap
  • $tárgy – az értesítés tárgya, mind az értesítés felugró ablakában, mind az e-mail címében
  • $body – az e-mail értesítő üzenet törzse
  • $sablon – ha konkrét sablonra van szüksége, itt definiálhatja. Ellenkező esetben ez a paraméter üres lehet
  • $params – egyénileg meghatározott paraméterek
  • Mindezek ismeretében határozzuk meg az általunk használt változókat
    Módosítsa a beépülő modul kódját a következőre:

    $user = CFactory::getUser(); $cmd = "rendszer_üzenetek" ; // első paraméter, tevékenység típusa $actor = $user -> id ; //második param - $actor azonosítójának lekérése $target = "965" ; // harmadik param. Ki kap értesítést? Fejlesztői környezetünkben a 965-ös azonosítójú adminisztrátor. A környezetében valószínűleg az objektumtól vagy a felhasználók tömbjétől szeretné lekérni az azonosítót. $subject = "Értesítés tárgya" ; // Mindkettő tárgya, e-mail és előugró értesítések $body = ; //Body message in emails. $sablon = "" ; // Ha konkrét jomsocial sablonfájlt kell használnia, itt definiálhatja. $params = new CParameter("" ) ; // Szeretnénk létrehozni egy további params objektumot, és adatokat rendelni hozzá anélkül, hogy hivatalosan meg kellene határoznunk egy osztályt CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Most jelentkezzen be bármelyik felhasználóval, és módosítsa a profil adatait. Menjünk az adatbázisba, és nézzük meg, mi történt.
    Keresse meg a prefix_community_notifications táblát, és figyelje meg az új rekordot

    Lépjen a prefix_community_mailq táblára, és tekintse meg az új rekordot

    Gratulálunk! - Sikeresen létrehozta első saját értesítését, amelyet e-mailben és belső JomSocial értesítési rendszerben küldtek el


    Potenciális kód felfúvódás

    A fenti példa rendben van, és működik, de általában nem ajánlott így használni. Ehelyett így is lehetne írni

    $actor = CFactory::getUser(); $params = new CParameter("" ) ; CNotificationLibrary:: add ( "rendszer_üzenetek" , $actor -> "Ez az értesítés törzsüzenete" , "" , $params ) ;

    Ez sokkal tisztább és könnyebben követhető, miközben alapvetően ugyanazt csinálja, mint a fent bemutatott kód.

    Egyéni értesítési paraméterek

    Az értesítési API bármely hozzáadni kívánt paraméterrel bővíthető.
    Ezeket a paramétereket e-mail-sablonnak, értesítésnek és természetesen nyelvi fájlnak is át lehet adni.

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = new CParameter("" ) ; $params -> set ("actor", $actor -> getDisplayName () ) ; // használható (actor) tagként $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Link az (actor) taghez $params -> set ("url" , $link ) ; // a teljes tevékenység URL-je. Akkor használatos, ha az értesítési ablakban az avatar fölé viszi az egérmutatót. Használható (url) címkeként a kimenő e-mailekben is. Győződjön meg arról, hogy definiálta a $link változót:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "This is the notification body message" , "" , $params ) ;

    • $params = new CParameter( ); - Új params objektumot szeretnénk létrehozni, és adatokat rendelni hozzá anélkül, hogy formálisan osztályt kellene definiálni.
    • $params->set("színész", $actor->getDisplayName()); - Az értesítésben mindig szerepelnie kell egy színésznek. Ez a paraméter átadható a sablonnak (aktor) címkeként. Az értesítési ablakban meghatározza a műveletet végrehajtó felhasználót.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - A színész URL-je általában egy színész URL-je. Az értesítési előugró ablakban hozzáadja a hivatkozást az (actor) elemhez
    • $params->set("url", $link); - Ez a legfontosabb paraméter, amelyet mindig megfelelően kell beállítani. Az értesítési ablakban ezt a paramétert a rendszer az avatar képe fölött használja. Az e-mailes értesítésben visszaadja azt a helyet, ahol a tevékenység történt.

    Ebben a példában a $link változót a lands on értékre állítjuk be www.google.comígy láthatja, hogyan működik

    Nyelvi karakterlánc hozzáadása és paraméterek használata

    A most beállított paraméterek birtokában a nyelvi fájlokban is használhatók.
    Meghatározhatjuk a nyelvi kulcsokat a " CNotificationLibrary::add() API

    CNotificationLibrary::add("rendszer_üzenetek" , $actor -> id , "965" , JText::sprintf("PLG_COMMUNITY_EXAMPLE_SUBJECT") , JText::sprintf("PLG_COMMUNITY_EXAMPLE_BODY") ,,par ")")

    A nyelvi fájlnak így kell kinéznie

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(színész) frissítette profilját" PLG_COMMUNITY_EXAMPLE_BODY = "Kedves Adminisztrátor \n Ez a levél, hogy értesítsük, hogy (színész) frissítette a profilt \n\n Ha a Google-t szeretné elérni, kattintson ide \n a href=" _QQ_" (url)"_QQ_">(url)"

    Ebben a példában a címkét (actor) és (url) használtuk az adatok átadására mind az értesítési, mind az e-mail sablonoknak. Lássuk, hogy néz ki.
    Az értesítési ablakban, amikor az avatar fölé viszi az egérmutatót, vegye észre az (url) paramétert, és hozzáadja a google-ra mutató linket az avatar fölé. Szándékos, mert mi így csináltuk :)


    ]

    Ugyanabban az ablakban, amikor az egérmutatót a színész linkje fölé viszi. Ez az a rész, ahol (actor) visszhangozta a műveletet végrehajtó felhasználót, míg az (actor_url)" gondoskodott arról, hogy az objektum megfelelően legyen linkelve


    Lássuk, mi történik az e-mail-sorban


    És végül a tényleges e-mail, amelyet a végfelhasználónak küldenek


    Siker
    Eddig három (3) paramétert hoztunk létre, amelyeket sikeresen használunk az értesítési ablakban és az e-mailekben.

  • (actor) – A műveletet végző felhasználó felhasználónevét adja vissza
  • (actor_url) – Megadja a tulajdonság a (színész)
  • (url) – Nem kötelező, de mindig szerepelnie kell az értesítésben. Ez a fő URL-cím, ahol a művelet történt, amelyről értesítést kapunk.
  • Hasonlóképpen meghatározhatja a "

    • (cél) - ha szüksége van rá
    • (cél_url), ha szüksége van rá az értesítésben.
    • (cím) – Általában egy értesítést generáló objektumra utalnak. Példa: "X felhasználó új fényképet tett közzé az Y albumban." Az Y album címe itt
    • (title_url) – A korábbiakhoz hasonlóan az értesítést generáló objektum URL-je.
    • (üzenet) – Ezzel a paraméterrel beállíthatjuk (és visszhangozhatjuk) az üzenetet a JomSocial e-mail szövegében.
    3,3K

    Az üzenetek megjelenítése a felhasználónak meglehetősen gyakori művelet, amelyet egy webalkalmazásnak végre kell hajtania. Előfordulhat űrlapok feldolgozása során, lehetnek hibaüzenetek, olyan üzenetek, amelyek felszólítják a regisztrációt, amikor a felhasználó megpróbál hozzáférni az oldal korlátozott részére, és sok más esetben is.

    Nagyon gyakran az üzenetek létrehozása és kimenete különböző HTTP-kérésekre különül el. Általában kényelmes az átirányítás használata az űrlapok feldolgozása után (a Vissza és a Frissítés gombokkal kapcsolatos problémák elkerülése érdekében), ugyanakkor az üzenet létrehozásának természetes pillanata pontosan az űrlapok feldolgozásának és az azt kísérő műveletek végrehajtásának pillanata. azt. Miért? Képzelje el, hogy az üzenet szövege valahogy így nézzen ki: „Az „Egérpad” termékhez rendelt egységek számát sikeresen módosítottuk 7-ről 12-re.” Egy átirányítás után, esetleg funkcionalitás szempontjából teljesen más oldalra, extra fejtörést okoz majd annak meghatározása, hogy mi történt korábban.

    Leggyakrabban üzenetek jelennek meg az űrlapot feldolgozó POST-kérésben - ez nem jó, az „ez az oldal elavult” szavak tönkreteszik az életet (amikor a felhasználó úgy dönt, hogy megpróbálja a Vissza gombot).

    Valaki átirányítást használ, lemondva a barátságos üzenetekről.

    Ugyanakkor van egy egyszerű és kézenfekvő módszer az élet jobbá tételére. A nyilvánvalóság ellenére valamiért soha nem láttam, hogy bárki is használná – legalábbis amikor mások forrásait néztem.

    Tehát van egy problémánk – az üzenetnek különböző kérésekben kell „élnie”. Szükségünk van egy mechanizmusra, amely az üzenet szövegét átviszi arra az oldalra, amelyen meg kell jelennie. Valószínűleg már emlékszel a foglalkozásokra.

    Igen, általánosságban igazad van. Más módszerek, például egy globális változón keresztül, nem teszik lehetővé az adatok mentését abban az esetben, ha átirányítást használnak (Maxim Naumenko megjegyzése). Ráadásul általában gondoskodom arról, hogy az alkalmazás minden képernyője más információkkal együtt képes legyen megjeleníteni a korábbi képernyőkön generált üzeneteket. Ez azért kényelmes, mert nem kell külön képernyőket készíteni az üzenetek megjelenítéséhez, és a felhasználónak nem kell újra kattintania az egérrel. De valójában a tervezőnek itt kell gondolkodnia - hogy kiemelje azt a területet, ahol az üzenetek megjelennek.

    Az ötlet nagyon egyszerű, és néhány órával megvalósítható.

    Az első dolog, ami eszünkbe jut, egy Üzenet osztály létrehozása, amely valójában egy üzenetet jelentene az egyszerű osztálydiagramunkban. Az üzenetnek képesnek kell lennie arra, hogy elmentse magát a munkamenetben, és megjelenjen a képernyőn.

    class Üzenet ( /** * Üzenet tartalma. */ var $content; /** * Konstruktor az üzenet szövegének inicializálásához. * * @param content message content */ function Message($content) ( $this->content = $ tartalma () ( visszhang. " - " . $this->content .
    "; } }

    A $_SESSION változó a munkamenet eléréséhez használható.

    Vegye figyelembe, hogy a $_SESSION egy tömb, ennek a tömbnek csak egy elemét használjuk a „session_message” indexszel.

    Ebben az esetben egy "tömbök tömbjével" van dolgunk - amit a 'session_message' elemben tárolunk, az egy tömb, ez a továbbított üzenetek listája (természetesen több is lehet).

    Ha nem találja a szálat, ideje felfrissíteni a kézikönyv szekciókkal és tömbökkel foglalkozó részeit.

    Lehet, hogy kérdése van. Miért van szükség ide osztályokra? Két funkcióval is meg lehetne boldogulni. De nézzük tovább. Előfordulhat, hogy különböző típusú üzeneteket kell létrehoznunk (információ, hiba, figyelmeztetés), és meg kell határoznunk az üzenetek címzettjeit.

    Kérjük, vegye figyelembe, hogy jelenleg nem maga az objektum kerül a munkamenetbe, hanem csak az üzenet szövege. Az OOP lehetővé teszi, hogy később módosítsuk a send() metódus viselkedését anélkül, hogy módosítanánk a metódushoz hozzáférő ügyfélkódot (például a jövőben a teljes Message objektumot írhatjuk a munkamenetbe, ha sok mezője van).

    Képzeljük el, hogy ezt függvényekkel tennénk meg. Valószínűleg lenne egy message_send($txt) függvényünk, és lenne egy message_to_page($txt) függvényünk is. Most hozzá kell adnunk azt a képességet, hogy különböző típusú üzenetekhez eltérő viselkedést biztosítsunk. A függvényhívások változnak: message_send($txt, $fajta), message_to_page($txt, $kind). Az ilyen funkciók kereséséhez át kell fésülnie a teljes alkalmazáskódot, és javítania kell.

    Ez elkerülhető, ha előre látjuk a helyzetet, ha az üzenetet asszociatív tömbként jelenítjük meg: $msg[’txt’], $msg[’kind’], akkor a függvényhívásokban csak egy paraméter lesz. Érzi, hogyan próbál ebből osztály lenni?

    Tehát az OOP lehetőséget ad arra, hogy élvezze azt a luxust, hogy ne gondoljon át mindent előre.

    A következő osztály - az Inbox - éppen erre szolgál.

    class Inbox ( /** * Beérkezett üzenetek tömbje. */ var $messages = array(); /** * A konstruktorban megkapjuk az összes beérkezett üzenetet * és töröljük őket a munkamenetből. */ function Inbox() ( if (is_array($ _SESSION["munkamenet_üzenetek"])) ( $üzenetek = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->üzenetek = new Üzenet($üzenetek[$i]); ) ) /* az üzenetek törlése array */ $_SESSION["session_messages"] = array(); ) /** * Jelenítse meg a Beérkezett üzenetek tartalmát az oldalon. */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Üzenet a rendszertől:
    "; ) for ($i = 0; $i< $co; $i++) { $this->üzenetek[$i]->ToPage(); ) ) )

    Próbáljuk ki az üzenetküldő rendszerünket.

    Hozzunk létre egy nagyon egyszerű példát, amely egy űrlap beküldésére válaszol az aktuális percben eltöltött másodpercek számának jelentésével.

    Minden munkát elrejtettünk tömbökkel és munkamenetekkel az osztályokon belül, és a végső kód egyszerűnek és gyönyörűnek tűnik.

    Hozzon létre egy könyvtárat a webszerveren, majd hozza létre benne ezt a három fájlt, és próbálja ki a szkriptet. Felhívjuk figyelmét, hogy a Vissza és a Frissítés gombokkal nincs probléma.

    Most képzelje el, hogy egy összetett portált hoz létre, ahol általában több blokk található az oldalakon, és mindegyik tartalmazhat külön alkalmazást.

    Itt két nehézségbe ütközünk:

    * Szeretném, ha az üzenetek listája megjelenne az oldal egy meghatározott részén, és erre már talált egy jó helyet.
    A probléma az, hogy a $inbox->toPage() parancsot pontosan abban a pillanatban kell futtatni, amely megfelel az üzenetlista pozíciójának az oldalon. Ha meg akarjuk változtatni ennek a listának a pozícióját, akkor bele kell mennünk a kódba, de ehhez nem jó, ha folyamatosan változtatjuk a portál keretet. A legjobb megoldás az lenne, ha az üzenetek kimenetét külön modul formájában készítenénk el, amiről csak annyit tudunk, hogy a keretrendszerhez kell kötni.
    Vagyis szabaduljon meg a modulok indításának szigorú sorrendje alól. Valóban, mivel az Inbox kimenet eredménye nem függ a rendszer működésétől (ennél a lépésnél már minden adatunk megvan a munkamenetben), akkor minek az extra bonyolultság?
    * Az üzenetlista megjelenésének (dizájnjának) megőrzéséhez ügyelni kell a HTML kódra, amely a Message és Inbox osztályok toPage() metódusaiban van kódolva. Általában meg kell változtatnia a PHP kódot a terv megváltoztatásához.

    Az első probléma megoldásához létrehozhat egy puffert, amely az Inbox kimenet eredményét tárolja.

    Talán még lesz több hasonló (az Inboxhoz hasonló) dolgunk, és pufferrendszert kell létrehoznunk. Annak érdekében, hogy ne keverjük össze, kinek a kimenete, valószínűleg el fogunk jönni a pufferek elnevezéséhez. Valahol eltároljuk a pufferek kimeneti sorrendjét - lehetőleg egy külső fájlban, hogy megkönnyítsük a változtatásokat.

    Ez a megoldási kísérlet már azt az ötletet ad nekünk, hogy az XML-t használjuk köztes adatok tárolására. Az XSLT stílusok használata pedig segít megoldani a második problémát.

    Nem foglalkozom azzal, hogy mi az XML és mi az XSLT. Ha nem ismeri ezeket a dolgokat, a zvon.org jó hely a keresés megkezdéséhez.

    Az ötlet az, hogy a toPage() metódusokban ne HTML kódot állítsunk elő, hanem XML struktúrát. Az oldaldokumentum egy karakterláncként jön létre XML kóddal ("pufferként" fog szolgálni), és a szkript utolsó szakaszában XSL transzformációt fogunk használni.

    Először képzeljük el, mi legyen a kód fő részének eredménye.

    perc 57 másodperc: 45

    Hogy mi ez, azt nagyon könnyű kitalálni – két üzenet és egy űrlap. Kérjük, vegye figyelembe, hogy a PHP szkriptnek csak egy ilyen karakterláncot kell elkészítenie - ez nagyon egyszerű. Ezenkívül a fő címkék sorrendje nem fontos - például ezeket helyezheti előtérbe, ahogy az a programozó számára kényelmes lesz. Hogyan kell megvalósítani. Anélkül, hogy bármit megváltoztatnánk, használhatunk kimeneti pufferelést, XML-t írhatunk ki HTML kód helyett, és a végén egyszerűen rögzíthetjük a kimenetet egy karakterláncban. De akkor elveszítjük a rugalmasságot – például néha a hibakeresési információkat közvetlenül az oldalra kívánja kiadni (visszhang használatával). Ugyanakkor a PHP fejlesztői egy olyan DOM modulon dolgoznak, amely fejlettebb módot kínál a fa dokumentumok létrehozására és átadására. Ha a DOM-ot szeretnénk megvalósítani, akkor a teljes alkalmazást újra kell terveznünk, a karakterláncok kimenetét DOM elemek létrehozására módosítva. Ezért jobban szeretem az objektumok XML reprezentációját magukon az objektumokon belül tárolni, szekvenciálisan összeállítva egy közös XML dokumentumot. Nem olyan nehéz, csak egy kis módosításra szorul. Látni fogja, hogy ez a technika nincs szigorúan az XML adatok tárolásának egy meghatározott módjához kötve, és ez lehetővé teszi, hogy kis erőfeszítéssel áttérjen a DOM használatára. Először is vegyük észre, hogy minden objektumunk rendelkezik egy toPage() metódussal. Ez a hasonlóság elgondolkodtathat egy új közös szülőosztály bevezetésén. Hagyja, hogy minden osztály, amely egy oldalhoz XML-dokumentumot tud létrehozni, örököljön egy osztálytól, amely gondoskodik az objektum XML-reprezentációjáról. Nevezzük Outputable-nak.

    class Kiadható ( /** * XML tároló (karakterlánc). */ var $output = ""; /** * Adja meg a tároló tartalmát, és törölje a tárolót. * * @return egy karakterláncot XML adatokkal */ függvény getOutput () ( $ out = $this->output; $this->output = ""; return $out; ->output .= $string . "n" ) /** * "Absztrakt" metódus */ function toPage( ) ( ) )

    A toPage() metódus üressé válik - ebben az esetben szükség van arra, hogy jelezze, hogyan kell a külső „matryoshka” osztályoknak kommunikálnia a belső osztállyal. Itt azonban kínálhatnánk egy alapértelmezett megvalósítást, ha észrevennénk, hogy sok olyan objektum van, amely ugyanúgy megjelenik az oldalon.

    A Message és a Beérkezett üzenetek osztályok kissé módosulnak – mostantól mindkettőnek öröklődik az Outputable-ból, és a toPage() metódus is megváltozik
    Üzenet.php

    osztály Üzenet kiterjesztése Kimeneti ( /** * Üzenet tartalma. */ var $content; /** * Konstruktor az üzenet szövegének inicializálásához. * * @param tartalom üzenet tartalma */ függvény Üzenet($content) ( $this->content = $content; ) /** * Üzenet írása a session-be */ függvény send() ( $_SESSION["session_messages"] = $this->content; ) /** * Üzenet kiírása az oldalra this->appendOutput("".$this->content."" ) )

    class Inbox extends Outputable ( /** * Beérkezett üzenetek tömbje. */ var $messages = array(); /** * A konstruktorban megkapjuk az összes beérkezett üzenetet * és eltávolítjuk őket a munkamenetből. */ function Inbox( ) ( if (is_array ($_SESSION["munkamenet_üzenetek"])) ( $üzenetek = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->üzenetek = new Üzenet($üzenetek[$i]); ) ) /* az üzenetek törlése array */ $_SESSION["session_messages"] = array(); ) /** * Jelenítse meg a Beérkezett üzenetek tartalmát az oldalon. */ függvény toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->üzenetek[$i]->ToPage(); $this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput(""); ) )

    A kimeneti mód megváltozott - a külső megjelenítés helyett a közvetlenül az oldalra történő kiadás helyett egyelőre a Outputable-ban van eltárolva, amely minden objektumban „ül”. Az appendOutput() metódus az echo() konstrukció helyettesítésére szolgál. Egy objektum kimenetének lekéréséhez a getOutput() metódust használjuk.

    Most nézzük meg, mi a kód kliens része, ami ugyanazt a problémát oldja meg, mint korábban.
    index.php

    A fő újítás a $global_content objektumban van, melynek neve önmagáért beszél. Ebben az esetben a valós feladatokban az Outputable osztályba tartozik, valószínűleg külön osztályt hozna létre az oldal tartalmához.

    Ha alaposan megnézi, a szkript tartalma gyakorlatilag nem változott - ugyanaz a postafiók, ugyanaz a toPage(). Hozzáadott egy utasítást, amely megjeleníti az üzenetlista tartalmát az oldal tartalmában. A változatosság kedvéért most két üzenet jön létre.

    Az eredmény megtekintéséhez már csak az XSL sablon elkészítése van hátra.
    style.xsl

    XSLT példa

    üzenet

    Mit értünk el?

    Először is magabiztosabban vállalhat összetett projekteket - a modulok valódi függetlensége biztosított. Az eredmények lapon való elhelyezésének sorrendjét most egy külső XSL-sablon vezérli, és nem függ a modulok futtatásának sorrendjétől.

    Bármely modul, amely munkája eredményeként XML adatokat generál, használható egy projektben. Ez egyébként az egyik előnye a sablonmotorokkal szemben, amelyekben az adatalkotás egy adott motor hívási metódusainak sorozatából áll (hozzárendelés stb.), amelyre nincs közös szabvány.

    Egy másik előny a könnyű hibakeresés. Ha futtatja a szkriptet, észre fogja venni, hogy minden oldal tartalmaz hibakeresési kimenetet – egy XML-prototípust, amely nagyban leegyszerűsíti az alkalmazások hibakeresőjét.

    Még valami, amire gondolnia kell, az az üzenetobjektumok létrehozása. Nem mindig kényelmes az újat közvetlenül az ügyfélkódban használni. De talán ez egy külön cikk témája.

    Végül egy galopp a kilátásokról:

    * Előugró ablakok a fontos üzenetek listájához
    * "feladó oldalak" és "céloldalak" az üzenetekben
    * Üzenetek naplózása az adatbázisban
    * gomb "műveleteim előzményeinek megjelenítése"
    * a felhasználói műveletek statisztikai elemzése a munkameneteken belül
    * "intelligens asszisztensek" a webes alkalmazásokban

    A KP-ban és a BUS-ban, a 11.5-ös verziótól kezdődően, a közösségi hálózatot tartalmazó kiadásokban egy új „Web messenger” modul jelent meg.
    Mielőtt mindenki számára megjelent volna, a modul átesett egy tűzkeresztségen a „Social Intranetünkön”, és 8 frissítést gyűjtött össze.


    A fejlesztés hat hónapja alatt sokat tettünk

    Teljesen elhagytuk a korábbi felületet és létrehoztunk egy újat, a népszerű azonnali üzenetküldők tapasztalatai alapján.
    Az oldalon belül kezdett megnyílni a párbeszédablak, arcok jelentek meg benne, az üzenetek színkóddal lettek ellátva, és lehetővé vált, hogy egyszerre több emberrel is könnyedén folytathassunk beszélgetést.

    Az előzményablak egy külön téma, mindenki régóta szeretett volna előzménykeresőt, most végre megvan, a gyors navigáció érdekében tervezzük, hogy egy naptárat is felveszünk oda.

    Létrehoztunk egy értesítési központot különböző típusú üzenetekkel, lehetővé téve a beérkezésük előzményeinek megtekintését, a fejlesztők számára pedig egy egyszerű API-t az értesítések hozzáadásához és visszahívásához.

    És mindez a webhely minden oldalán elérhető!

    Sajnos nem minden valósult meg, amit elterveztek

    Első Amire nem volt időnk, az az üzenetek lefordítása a táblázatunkba.
    Egy ilyen átállás lehetővé tenné a „social network” modul elhagyását, amely nagyobb szabadságot adna a szerkesztők kiválasztásában, és lehetőség nyílna a csoportos chat bevezetésére is.

    Második, ez az igazi "azonnali" kommunikáció megvalósítása. Mostantól a modul rendszeres poolingot használ, n-másodpercenként egyszer lekérdezi a szervert, a lekérdezési periódus a kommunikációs tevékenységtől függően változik.
    Tervezzük egy külön szolgáltatás írását, amely folyamatos kapcsolatot tart fenn, és szükség szerint küldi az adatfrissítéseket (a messengerhez, a live feedhez stb.).

    Harmadik, azt tervezzük, hogy némileg megváltoztatjuk a felületet, elhagyjuk a külön névjegyzéket és párbeszédablakot, és ezeket egyetlen egésszé egyesítjük, ami a jövőben lehetővé teszi, hogy a messengert mobilalkalmazásba helyezzük át.

    Dokumentáció még nincs és csak ősszel jelenik meg, mert... A modult aktívan fejlesztik, és szeretnénk meghagyni az API megváltoztatásának lehetőségét.
    Mindazonáltal megpróbálok példákat közzétenni az API azon részével való munkavégzésre, amelyen a munka már befejeződött, és biztonságosan használhatja őket a moduljaiban.

    Értesítések kezelése (a 11.5.2-es verziótól kezdődően az IM-re vonatkozik)

    Háromféle értesítést vezettünk be:
    - személyre szabott értesítés;
    - értesítés a rendszertől;
    - megerősítést igénylő értesítés;

    Az API használata előtt ellenőriznie kell, hogy a modul telepítve van-e a rendszeren:

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

    Személyre szabott értesítés


    Ha az üzenetek beállítása NOTIFY_TAG, akkor a felhasználó csoportosítja őket.

    Értesítés a rendszertől


    $arMessageFields = array(// címzett "TO_USER_ID" => $USER->GetId(), // feladó (>0 lehet) "FROM_USER_ID" => 0, // értesítés típusa "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // modul, amely értesítést kért "NOTIFY_MODULE" => "im", // szimbolikus címke a csoportosításhoz (csak egy üzenet jelenik meg), ha ez nem szükséges, ne állítsa be a "NOTIFY_TAG" => "IM_CONFIG_NOTICE" paramétert, // értesítési szöveg a webhelyen (HTML és BB kódok elérhetők) "NOTIFY_MESSAGE" => "[b]Figyelem: ellenőriznie kell és meg kell adnia a közösségi hálózat helyes elérési útját az "Azonnali üzenetküldés és értesítések" modul beállításaiban" , // e-mailben (vagy XMPP-ben) küldendő értesítési szöveg, ha nincs eltérés, ne állítsa be a paramétert //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

    Megerősítést igénylő értesítés (megerősítés)


    $arMessageFields = array(// címzett "TO_USER_ID" => $USER->GetId(), // feladó "FROM_USER_ID" => 2, // értesítés típusa "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // az értesítés küldését kérő modul "NOTIFY_MODULE " => "naptár", // szimbolikus címke a csoportosításhoz (csak egy üzenet jelenik meg), ha ez nem szükséges, ne állítsa be a "NOTIFY_TAG" => "CALENDAR|INVITE|123|" paramétert.$ FELHASZNÁLÓ->GetId() , // értesítési szöveg a webhelyen (HTML és BB kódok elérhetők) "NOTIFY_MESSAGE" => "Meghívom Önt, hogy vegyen részt az „Azonnali üzenetküldés és értesítések” találkozón, amelyre március 15-én kerül sor, 2012 at 14:00", // e-mailben (vagy XMPP-ben) küldendő értesítési szöveg, ha nincs eltérés, ne állítsa be a "NOTIFY_MESSAGE_OUT" paramétert => "Evgeny Shelenkov felhasználó meghívja Önt, hogy vegyen részt az "Azonnali" megbeszélésen üzenetek és értesítések” #BR#, amelyre 2012. 03. 15-én, 14:00-kor kerül sor.#BR # #BR# Elfogadás: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Elutasítás: http://test.ru/calend.php?CONFIRM=N&CID=123", // az értesítési gombokat leíró tömb "NOTIFY_BUTTONS" => Array(// 1. gomb neve, 2. értéke, 3. gombsablon , 4. áttérés a címre kattintás után (opcionális paraméter) Array("TITLE" => "Accept", " VALUE" => "Y", "TYPE" => "accept" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Refuse", "VALUE" => "N", "TYPE" => "cancel" /*, "URL " => "http://test.ru/?confirm=N" */),), // a levélküldő sablon szimbolikus kódja, ha nincs megadva, akkor a "NOTIFY_EMAIL_TEMPLATE" => " értesítési sablonnal kerül elküldésre NAPTÁR_MEGHÍVÁS"); CIMNotify::Add($arMessageFields); ?>

    Az ilyen típusú értesítések használatához nem elég egyszerűen elküldeni egy üzenetet.

    Szolgáltatás
    Két lehetőség van, a legegyszerűbb a hivatkozás követése (ha beállítja a 4. paramétert a NOTIFY_BUTTONS-ban).
    A link követése után a következő kódot kell meghívnia a kódban:
    Figyelem: ügyeljen a címkék nevére a törlés hívásakor, a címkével rendelkező összes üzenet törlődik.
    Több üzenet küldésekor ezt figyelembe kell venni, hogy egy felhasználó műveletének végrehajtása véletlenül se törölje az értesítést mindenkinek (kivéve azokat a helyeket, ahol ilyen logikára van szükség).

    A második lehetőség a rendezvényeken van.
    1. regisztrálnia kell a függőséget

    Ne felejtse el a funkciókat Kérés megerősítéseÉs RejectRequestértesítés törlését okozhatja CIMNotify::DeleteByTag()

    Egyelőre ennyi, kommentben várom javaslataitokat, sikeres megvalósításokat!
    Ha szeretné kipróbálni az API-t a 11.5.2 kiadása előtt egy paraméteres tömbben, akkor a következőt is meg kell adnia: "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, a gombokban található hivatkozást tartalmazó opció sem fog működni a megerősítési értesítéseknél. De jobb várni, a 11.5.2-es frissítés május 23-án jelenik meg.

    A kurzus ezen a pontján a beépülő modulunk alapjait lefektettük, egyéni hook-ot definiáltunk, és egy állandó üzenetet csatoltunk, amely bemutatja a hook működését.

    Hogy mi Nem megtették, nem a felhasználó által megadott adatok szerint valósították meg az üzenettípusokat és azok megjelenítését.

    Mielőtt azonban elkezdenénk, hozzá kell adnunk a különböző üzenettípusok támogatását, egy osztályfelületet, amely minden üzenettípust támogat, és az ilyen üzenetek tárolásához szükséges adatstruktúrát.

    Készen áll az indulásra?

    Alig várom az oktatóanyag folytatását, de van néhány dolog, amit figyelembe kell vennünk, mielőtt belemerülnénk a forráskódba. Győződjön meg arról, hogy a következő szoftverek telepítve vannak a rendszeren:

    • PHP 5.6.25 és MySQL 5.6.28
    • Apache vagy Nginx
    • WordPress 4.6.1
    • Az Ön által preferált IDE vagy szerkesztő

    Ha pedig egy teljes körű megoldást keres, ne felejtse el kipróbálni a MAMP-ot.

    Előrehaladtunk

    Mint korábban említettük, pontosan ennek a tanfolyamnak a közepén járunk. Ha lemaradtál az első leckékről, a következőket írtuk le eddig:

  • Az első oktatóanyagban a bővítmény létrehozásának minimális alapjaira összpontosítottunk, és arra, hogy mire van szüksége az induláshoz.
  • A második részben tovább haladtunk a pluginnal, kicsit hozzátéve a WordPress alapadminisztrációs oldalát. Hozzárendeltünk egy egyedi hook-ot is, amelyet használunk, és futtattuk a szerver oldalon. A Beállítások Messenger alapvető paramétereit is beállítjuk.
  • És ezt fogjuk figyelembe venni a képzés utolsó szakaszában:

  • Összekapcsoljuk az egészet, megnézzük működés közben, és nyilvánosan letölthetővé tesszük a bővítményt.
  • Jelenleg más feladataink vannak, ezekre fogunk koncentrálni.

    Térjünk vissza a munkához

    Mióta a munka felé fordultunk (és ahogy az előző leckéken is jeleztük), elkötelezettek vagyunk az ebben a részben szereplő feladatok további megvalósítása mellett:

    Ebben az oktatóanyagban folytatjuk a Beállítások Messenger fejlesztését a siker- és kudarcüzenetek támogatásával, valamint a biztonsági kérdések érintésével.

    Az előző cikkben a Beállítások Messengerben kezdtük, de csak egy olyan funkció beállításáig, amely folyamatosan megjeleníti a sikerértesítést a felhasználói oldal betöltése közben.

    Ebben az oktatóanyagban támogatást nyújtunk a hiba-, figyelmeztető- és sikerüzenetekhez. Ezután megjelenítjük őket a képernyőn, hogy képet kapjunk a messenger működéséről.

    Ezen túlmenően egy másik módosítást is végrehajtunk, amely támogatja az értesítések elvetését a felhasználó belátása szerint.

    Ez a leckéhez szükséges munka teljes terve. Kezdjük.

    Beállítások Messenger bővítmény

    Ne feledje, hogy a Settings Messenger lényege az, hogy meghatározzuk az egyéni üzenetekkel, egyéni hookokkal és a natív WordPress API-val való munkamódszerünket az üzenetek WordPress adminisztrációs panel kontextusában történő megjelenítéséhez.

    Ennek érdekében kibővítjük az utolsó leckében végzett munkát, és innen indulunk.

    Sikeres üzenetek

    Mivel az előző leckében sikeres üzenetekkel kezdtük, folytassuk velük. Most van egy keményen kódolt módszerünk, amely egyetlen trükköt jelenít meg: