V mojej aplikácii Zend píšem trochu API pre mobilné aplikácie. Aby som to mobilným vývojárom uľahčil, používam Swagger. Zatiaľ všetko funguje dobre, až na jednu požiadavku GET.
Kedy zavolám /user/messages/(sessionToken)? NumMessages = (numMessages) & pageNr = (pageNr) v prehliadači dostanem požadované výsledky, ale keď sa pokúsim nechať Swagger vykonať túto požiadavku, odovzdá sa iba sessionToken. Skúsil som tieto anotácie pre Swagger:
/** * @SWG\Api(path="/user/messages/(sessionToken)?numMessages=(numMessages)&pageNr=(pageNr)", * @SWG\Operation(* method="GET", * Summary=" Dostane správy stránkované", * notes="", * type="string", * prezývka="getUsermessagesPaged", * autorizácie=(), * @SWG\Parameter(* name="sessionToken", * description="Token z aktívnej relácie používateľa", * požadované=true, * type="reťazec", * paramType="cesta", * allowMultiple=true *), * @SWG\Parameter(* name="numMessages", * description=" počet správ na stránke (numMessages & pageNr sú ignorované, ak nie sú nastavené obe)", * required=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\Parameter (* name="číslo stránky", * description="číslo stránky (numMessages & pageNr sú ignorované, ak nie sú nastavené obe)", * požadované=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\ResponseMessage(code=200, message="json (správy => "user_messages")"), * @SWG\ResponseMessage(code=400, message="json s chybou "neprihlásený"" ) *) *) */
Vidí niekto moju chybu?
Akákoľvek pomoc je vítaná.
S pozdravom
Aktualizovať. Ako bolo navrhnuté, zmenil som oba paramTypes na „query“ a zmenil som cestu:
@SWG\Api(path="/user/messages/(sessionToken)",
ale nepracoval ako bojovník.
xdebug v Eclipse PDT ukazuje:
RequestURI => /ias/public/user/messages/(sessionToken)
QueryParams => Zend\\Stdlib\\Parameters - *ArrayObject*storage => Array - =>
swagger JSON:
( "apiVersion": "1.0.0", "swaggerVersion": "1.2", "apis": [ ( "cesta": "\/user", "description": "Operácie o používateľoch" ) ], "informácie" : ( "title": "Api pre mobilný prístup", "description": "Toto je xxx rozhranie API pre mobilný prístup.", "termsOfServiceUrl": null, "contact": "xxx", "license": null, "licenseUrl" : null, "_partialId": null, "_partials": , "_context": ( "komentár": "\/**\ * @SWG\\Info(\ * title="Mobile access api",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ *)\ *\/", "line": 3 } } } !}
Tu je výstup /user:
( "basePath": "http://localhost/ias/public", "swaggerVersion": "1.2", "apiVersion": "1.0.0", "resourcePath": "/user", "apis": [ ( "cesta": "/používateľ/zostatok/(sessionToken)", "operácie": [ ( "metóda": "GET", "summary": "Získava používateľskú rovnováhu", "prezývka": "getUserdata", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Token z aktívnej relácie používateľa" ) ], "responseMessages": [ ( "code": 200, "message": "json (zostatok => "user_balance")" ), ( "code": 400, "správa ": "json s chybou "neprihlásený"" ) ], "poznámky": "", "oprávnenia": () ) ]), ( "cesta": "/používateľ/prihlásenie", "operácie": [ ( "method": "POST", "summary": "Prihlási používateľa do systému", "prezývka": "loginUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "e-mail", "type": "string", "required": true, "allowMultiple": false, "description": "E-mail používateľa na prihlásenie" ), ( "paramType": "form", "name": "password", "type": "string", "required": true, "allowMultiple": false, "description": "Heslo na prihlásenie ako čistý text" ) ], "responseMessages": [ ( "code": 200, "message": "json s session_id, user_id, user_balance" ), ( "code": 400, "message": "json s chybou "žiadny používateľ s daným e-mailom a heslom"" ), ( " kód": 400, "správa": "json s chybou "neplatný vstup"" ), ( "kód": 400, "správa": "json s chybou "žiadna žiadosť o príspevok"" ) ], "poznámky": "" , "autorizácie": () ) ] ), ( "cesta": "/používateľ/odhlásenie", "operácie": [ ( "metóda": "POST", "summary": "Odhlásenie používateľa", "prezývka" : "logoutUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, " allowMultiple": false, "description": "Token z aktívnej relácie používateľa" ) ], "responseMessages": [ ( "code": 200, "message": "json (result => "deleted")" ), ( "code": 400, "message": "json s chybou "no user_session s daným sid"" ), ( "code": 400, "message": "json s chybou "neplatný vstup"" ), ( "code ": 400, "správa": "json s chybou "žiadna žiadosť o príspevok"" )], "poznámky": "", "autorizácie": () ) ]), ( "cesta": "/používateľ/správy/( sessionToken)", "operations": [ ( "method": "GET", "summary": "Získava nové správy", "nickname": "getUsermessages", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Token z aktívnej relácie používateľa" ) ], "responseMessages": [ ( "code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400, "message": "json s chybou "neprihlásený "" ) ], "poznámky": "", "autorizácie": () ), ( "metóda": "GET", "summary": "Získava stránkovanie správ", "prezývka": "getUsermessagesPaged", "typ" : "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "description": "Token z active user session" ), ( "paramType": "query", "name": "numMessages", "type": "string", "required": true, "description": "počet správ na stránke (numMessages & pageNr sú ignorované, ak nie sú nastavené obe)" ), ( "paramType": "query", "name": "pageNr", "type": "string", "required": true, "description": "pagenumber ( numMessages & pageNr sú ignorované, ak nie sú nastavené obe)" )], "responseMessages": [ ( "code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400 , "správa": "json s chybou "neprihlásený"" ) ], "poznámky": "", "oprávnenia": () ) ]), ( "cesta": "/user/userdata", "operácie" : [ ( "method": "POST", "summary": "Príspevky používateľské údaje", "prezývka": "postUserdata", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Token z aktívnej relácie používateľa" ), ( "paramType": "form ", "name": "password", "type": "string", "required": false, "allowMultiple": false, "description": "new password" ), ( "paramType": "form", " name": "address", "type": "string", "required": false, "allowMultiple": false, "description": "nová adresa" ), ( "paramType": "form", "name": "housenr", "type": "string", "required": false, "allowMultiple": false, "description": "new housenr" ), ( "paramType": "form", "name": "zip" , "type": "string", "required": false, "allowMultiple": false, "description": "new zip" ), ( "paramType": "form", "name": "city", "type ": "string", "required": false, "allowMultiple": false, "description": "new city" ), ( "paramType": "form", "name": "email", "type": " string", "required": false, "allowMultiple": false, "description": "new email" ) ], "responseMessages": [ ( "code": 200, "message": "json (user => "userdata" ")" ), ( "kód": 400, "správa": "json s chybou
Vyzerá to ako chyba, že moje swagger-ui neposiela žiadne parametre požiadavky? Tu je príklad s jedným parametrom dotazu, sessionToken: (riadené FireBug 2.0.6)
GET /ias/public/user/balance HTTP/1.1 Hostiteľ: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Accept: application/json Accept-Language: de, en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Content-Type: application/json Referer: http://localhost/ias/swagger/ Cookie: __utma=111872281.581414660.137618947257252 ; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set Pripojenie: keep-alive
Odpoveď znela:
HTTP/1.1 400 Bad Request Date: Ut, 25 Nov 2014 14:58:20 GMT Server: Apache/2.4.9 (Win32) PHP/5.5.12 X-Powered-By: PHP/5.5.12 Content-Length: 25 Pripojenie: close Content-Type: application/json; charset=utf-8
Odpoveď bola správna, pretože nebol odovzdaný žiadny sessionToken.
To si vyžaduje prácu, ale nepochádza z swagger-ui:
GET /ias/public/user/balance?sessionToken=HTTP/1.1 Hostiteľ: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Prijať: text/html,application/ xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: __utma=111872281.581414660 .1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set Pripojenie: keep-alive
PrehľadZabudovaný systém upozornení, vôbec prvý v Joomle, umožňuje vašej aplikácii informovať používateľa (alebo skupinu používateľov) o rôznych udalostiach. Upozornenia vnímajte ako dôležité upozornenia, ktoré by si používateľ rád prečítal a sledoval.
Oznámenia môžu byť generované všade. Vo vašom komponente alebo zásuvných moduloch a neskôr zobrazené v systéme upozornení JomSocial.
Tento tutoriál vám ukáže ako, ale keďže nemáme predstavu o žiadnom komponente tretej strany, ktorý by sme mohli použiť:) príklady budú vykonané na komunitnom plugine, ktorý sa spustí pri udalosti onAfterProfileUpdate
Ak neviete, ako vytvoriť doplnok, ktorý sa spustí pri tejto udalosti, odporúčame vám prečítať si túto príručku
Ako je uvedené v prehľade tohto tutoriálu, upozornenia budeme generovať pomocou komunitného pluginu.
S najväčšou pravdepodobnosťou budete chcieť vytvoriť upozornenia vo svojom komponente alebo v doplnku. Nasledujúci tutoriál bude fungovať v každom z týchto prípadov. Musíte len určiť, v ktorom bode vášho kódu sa vytvorí upozornenie a stačí načítať súbor JomSocial Core Libraries.
require_once JPATH_ROOT . "/components/com_community/libraries/core.php" ;
Dodržiavanie návodu vysvetleného nižšie bude fungovať dobre aj pre vaše rozšírenie
Príprava vývojového prostredia1. Budeme predpokladať, že už máte vytvorený vzorový doplnok komunitného typu, ktorý sa spustí, keď používateľ zmení svoj profil
Ak nie, môžete si stiahnuť prázdny vzorový plugin z , nainštalovať ho do Joomla a povoliť plugin. Je to pomenované Komunita – príklad upozornení
2. Prejdite do svojej databázy a vyprázdnite tieto dve tabuľky, aby nemali žiadne záznamy
A) prefix_community_notification
b) prefix_community_mailq
3. Majte na svojich testovacích lokalitách aspoň dvoch (2) používateľov a poznajte ich ID
V skorších verziách Joomly, ID používateľov vždy začínali od špecifikovaného čísla (62, 42). V Joomle 3 bude toto číslo náhodné, teda obraz nášho testovacieho prostredia, pretože na vašom konci bude určite iný.
Prvé oznámenieOtvorte súbor php pluginu, ktorý sa bude nachádzať v ROOT/plugins/community/example
V rámci funkcie onAfterProfileUpdate() nahraďte
CNotificationLibrary::add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;
Ako je znázornené na príklade, notifikácia pridať api má 7 parametrov
Keď toto všetko vieme, definujme premenné, ktoré budeme používať
Zmeňte kód doplnku na:
$user = CFactory::getUser();
$cmd = "system_messaging" ;
// prvy param, typ aktivity $actor = $user -> id ;
//druhý parameter - získajte id $actor $target = "965" ;
// tretí param. Kto dostane oznámenie? V našom dev prostredí je to jeho admin používateľ s ID 965. Vo vašom prostredí budete s najväčšou pravdepodobnosťou chcieť získať ID z vášho objektu alebo z poľa používateľov.
$predmet = "Predmet oznámenia" ;
// Predmet e-mailových aj kontextových upozornení $body = ;
//Text správy v e-mailoch.
$template = "" ;
// Ak potrebujete použiť konkrétny súbor šablóny jomsocial, môžete ho definovať tu.$params = new CParameter("" ) ;
// Chceme vytvoriť ďalší objekt params a priradiť k nemu údaje bez toho, aby sme museli formálne definovať triedu CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;
$actor = CFactory::getUser();
- $link = "http://www.google.com" ; ); $params = new CParameter("" ) ;
- $params -> set ("herec" , $actor -> getDisplayName () ) ;
- // možno použiť ako (actor) tag $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ;
- // Odkaz na značku (herca) $params -> set ("url" , $link ) ;
//url celej aktivity. Používa sa pri umiestnení kurzora myši na avatar v okne upozornení. Dá sa použiť aj ako (url) tag v odchádzajúcich e-mailoch. Uistite sa, že ste definovali premennú $link:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "Toto je správa tela upozornenia" , "" , $params) ; $params = nový CParameter(- Chceme vytvoriť nový objekt params a priradiť k nemu údaje bez toho, aby sme museli formálne definovať triedu.
$params->set("herec", $actor->getDisplayName());- Vaše oznámenie by malo mať vždy herca. Tento parameter možno odovzdať šablóne ako značku (herca). V oznamovacom okne definuje používateľa, ktorý vykoná akciu.
$params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - Adresa URL herca je zvyčajne adresa URL herca. Vo vyskakovacom okne s upozornením pridá odkaz na prvok (herec).$params->set("url", $link);
- Toto je najdôležitejší parameter, ktorý musíte vždy správne nastaviť. V oznamovacom okne sa tento parameter používa nad obrázkom avatara. V e-mailovom upozornení odráža miesto, kde došlo k aktivite.
V tomto príklade nastavíme premennú $link, na ktorú pristane
www.google.com"
takže môžete vidieť, ako to funguje
V oznamovacom okne pri umiestnení kurzora myši nad avatar si všimnite, že sa spustil parameter (url) a pridal odkaz na google cez avatar. Je to zámerné, pretože sme to tak urobili :)
]
V tom istom okne, keď umiestnite kurzor myši na odkaz herca. Toto je časť, v ktorej (herec) zopakoval používateľovi, ktorý vykonáva akciu, pričom (actor_url)“ sa postaral o to, aby bol objekt správne prepojený
Pozrime sa, čo sa stane vo fronte e-mailov
A nakoniec skutočný e-mail, ktorý sa odosiela koncovému používateľovi
Úspech
Doteraz sme vytvorili tri (3) parametre, ktoré sa úspešne používajú v okne upozornení a e-mailoch.
Podobne môžete definovať „
- (cieľ) - ak to potrebujete
- (cieľová_url), ak ju potrebujete vo svojom upozornení.
- (title) – Bežne sa používa na označenie objektu, ktorý vygeneroval oznámenie. Príklad: „Používateľ X uverejnil novú fotku v albume Y.“ Album Y je názov tu
- (title_url) – Rovnako ako v prípade predchádzajúcich, adresa URL objektu, ktorý vygeneroval upozornenie.
- (správa) - Tento parameter možno použiť na nastavenie (a odozvu) správy v tele e-mailu JomSocial.
Zobrazovanie správ používateľovi je pomerne bežná akcia, ktorú by mala webová aplikácia vykonávať. Môže sa vyskytnúť pri spracovávaní formulárov, môžu to byť chybové hlásenia, správy, ktoré vám oznamujú, že sa máte zaregistrovať, keď sa používateľ pokúsi o prístup k zakázanej časti lokality a v mnohých ďalších prípadoch.
Vytváranie a výstup správ sú veľmi často rozdelené do rôznych HTTP požiadaviek. Spravidla je vhodné použiť presmerovanie po spracovaní formulárov (aby sa predišlo problémom s tlačidlami Späť a Obnoviť), ale zároveň je prirodzeným momentom pre vytvorenie správy práve moment spracovania formulárov a vykonania sprievodných akcií. to. prečo? Predstavte si, že text správy by mal vyzerať asi takto: „Počet objednaných jednotiek pre položku ‚Podložka pod myš‘ sa úspešne zmenil zo 7 na 12.“ Po presmerovaní, možno na úplne inú stránku, pokiaľ ide o funkčnosť, bude ťažké zistiť, čo sa urobilo predtým.
Najčastejšie sa správy zobrazujú v žiadosti POST, ktorá spracováva formulár - to nie je dobré, slová „táto stránka je neaktuálna“ ničia život (keď sa používateľ rozhodne vyskúšať tlačidlo Späť).
Niekto používa presmerovanie a vzdáva sa priateľských správ.
Zároveň existuje jednoduchý a zrejmý spôsob, ako zlepšiť život. Napriek očividnosti som z nejakého dôvodu nikdy nevidel nikoho, kto by to používal - aspoň keď som sa pozrel na zdroje iných ľudí.
Takže máme problém - správa musí „žiť“ v rôznych požiadavkách. Potrebujeme mechanizmus na prenos textu správy na stránku, ktorá by ho mala zobraziť. Pravdepodobne ste si už spomenuli na relácie.
Áno, vo všeobecnosti máte pravdu. Iné metódy, napríklad prostredníctvom globálnej premennej, neumožňujú ukladanie údajov v prípade, že je použité presmerovanie (pozn. Maxim Naumenko). Navyše sa zvyčajne uistím, že každá obrazovka v aplikácii má možnosť spolu s ďalšími informáciami zobrazovať správy, ktoré boli vygenerované na predchádzajúcich obrazovkách. Je to pohodlné, pretože nie je potrebné pripravovať samostatné obrazovky na zobrazovanie správ a používateľ nemusí znova klikať myšou. Ale v skutočnosti tu musí dizajnér myslieť - zdôrazniť oblasť, v ktorej by sa objavili správy.
Myšlienka je veľmi jednoduchá a dá sa implementovať pomocou niekoľkých tried.
Prvá vec, ktorá vás napadne, je vytvoriť triedu Message, ktorá by v skutočnosti predstavovala správu v našom jednoduchom diagrame tried. Správa sa musí dať v relácii sama uložiť, ako aj zobraziť na obrazovke.
class Správa ( /** * Obsah správy. */ var $content; /** * Konštruktor na inicializáciu textu správy. * * @param content content message */ function Message($content) ( $this->content = $ content ) /** * Napíšte správu do relácie */ funkcia send() ( $_SESSION["session_messages"] = $this->content; ) /** * Výstup správy na stránku */ funkcia na stránku. () ( echo. " - " . $this->content .
";
}
}
Premenná $_SESSION sa používa na prístup k relácii.
Všimnite si, že $_SESSION je pole, používame iba jeden prvok tohto poľa s indexom „session_message“.
V tomto prípade máme čo do činenia s „polom polí“ – to, čo ukladáme do elementu „session_message“ je pole, toto je zoznam prenášaných správ (samozrejme, môže ich byť viacero).
Ak ste vlákno nenašli, je čas oprášiť časti manuálu venované reláciám a poliam.
Možno máte otázku. Prečo sú tu potrebné triedy? Dalo by sa vystačiť s dvomi funkciami. Ale pozrime sa ďalej. Možno budeme musieť vytvoriť správy s rôznymi typmi (informácie, chyby, upozornenia) a určiť príjemcov správy.
Upozorňujeme, že v súčasnosti nie je do relácie vložený samotný objekt, ale iba text správy. OOP nám umožňuje neskôr zmeniť správanie metódy send() bez zmeny kódu klienta, ktorý k tejto metóde pristupuje (napríklad v budúcnosti môžeme do relácie zapísať celý objekt Message, ak má veľa polí).
Predstavme si, že by sme to urobili pomocou funkcií. Pravdepodobne by sme mali funkciu message_send($txt) a tiež funkciu message_to_page($txt). Teraz musíme pridať možnosť rôzneho správania pre rôzne typy správ. Zmena volania funkcie: message_send($txt, $druh), message_to_page($txt, $druh). Pri hľadaní takýchto funkcií budete musieť prečesať celý kód aplikácie a vykonať opravy.
Tomu sa dá predísť predvídaním situácie vopred tak, že správu predstavíte ako asociatívne pole: $msg[‘txt’], $msg[‘kind’], potom bude vo volaniach funkcií len jeden parameter. Cítite, ako sa toto snaží stať sa triedou?
OOP vám teda dáva možnosť dopriať si ten luxus, že nemusíte všetko premýšľať dopredu.
Ďalšia trieda – Inbox – je určená práve na to.
class Inbox ( /** * Pole prijatých správ. */ var $messages = array(); /** * V konštruktore dostaneme všetky prijaté správy * a vymažeme ich z relácie. */ funkcia Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++)
{
$this->správy = nová správa($messages[$i]);
) ) /* vymaže pole správ */ $_SESSION["session_messages"] = array();< $co; $i++)
{
$this->) /** * Zobrazenie obsahu priečinka Doručená pošta na stránke.
*/ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Správa zo systému:
"; ) pre ($i = 0; $i
správy[$i]->ToPage();
)))
Teraz si predstavte, že vytvárate komplexný portál, kde je na stránkach spravidla niekoľko blokov a každý môže obsahovať samostatnú aplikáciu.
Tu narážame na dve ťažkosti:
* Chcel by som, aby sa zoznam správ zobrazoval v konkrétnej časti stránky a už ste na to našli vhodné miesto.
Problém je v tom, že príkaz $inbox->toPage() musíte spustiť presne v momente, ktorý by zodpovedal pozícii zoznamu správ na stránke. Ak chceme zmeniť pozíciu tohto zoznamu, budeme musieť ísť do kódu, ale nie je dobré na to neustále meniť rám portálu. Najlepším riešením by bolo urobiť výstup správ vo forme samostatného modulu, o ktorom vieme len to, že ho treba pripojiť k frameworku.
To znamená, že sa oslobodíte od prísnej postupnosti spúšťania modulov. Skutočne, keďže výsledok výstupu doručenej pošty nezávisí od prevádzky systému (v tomto kroku už máme všetky údaje v relácii), tak prečo tá extra zložitosť?
* Aby ste zachovali vzhľad (dizajn) zoznamu správ, musíte sa postarať o HTML kód, ktorý je pevne zakódovaný v metódach toPage() tried Message a Inbox. Zvyčajne budete musieť zmeniť kód PHP, aby ste zmenili dizajn.
Ak sa chcete pokúsiť vyriešiť prvý problém, môžete vytvoriť vyrovnávaciu pamäť, ktorá ukladá výsledok výstupu doručenej pošty.
Možno budeme mať stále niekoľko podobných vecí (ako Inbox) a musíme vytvoriť systém vyrovnávacej pamäte. Aby sme si neplietli, koho výstup je koho, prídeme asi na pomenovanie bufferov. Niekde uložíme poradie, v súlade s ktorým sa majú buffery vypisovať – najlepšie do externého súboru, aby sme uľahčili zmeny.
Tento pokus o riešenie nám už dáva myšlienku použiť XML ako prostriedok na ukladanie prechodných údajov. A použitie štýlov XSLT pomôže vyriešiť druhý problém.
Nebudem sa venovať tomu, čo je XML a čo je XSLT. Ak nie ste oboznámení s týmito vecami, zvon.org je dobré miesto, kde začať hľadať.
Cieľom je generovať nie HTML kód, ale XML štruktúru v metódach toPage(). Stránkový dokument bude vytvorený ako reťazec s XML kódom (bude slúžiť ako „buffer“) a v poslednej fáze skriptu použijeme XSL transformáciu.
Najprv si predstavme, čo by malo byť výsledkom hlavnej časti kódu.
minúta 57 sekunda: 45
Čo to je, sa dá celkom ľahko uhádnuť – dve správy a formulár. Upozorňujeme, že PHP skript potrebuje iba pripraviť takýto reťazec – je to veľmi jednoduché. Okrem toho nie je dôležité poradie hlavných značiek - môžete ich umiestniť napríklad na začiatok, ako to bude vhodné pre programátora. Ako to implementovať. Bez toho, aby ste čokoľvek menili, môžete použiť ukladanie do vyrovnávacej pamäte, výstup XML namiesto HTML kódu a na konci jednoducho zachytiť výstup do reťazca. Potom však stratíme flexibilitu – napríklad niekedy chcete vypísať ladiace informácie priamo na stránku (pomocou ozveny). Vývojári PHP zároveň pracujú na module DOM, ktorý ponúka pokročilejší spôsob vytvárania a odovzdávania stromových dokumentov. Ak chceme implementovať DOM, budeme musieť prerobiť celú aplikáciu so zmenou výstupu reťazcov na vytváranie prvkov DOM. Preto uprednostňujem ukladanie XML reprezentácie objektov v rámci samotných objektov, pričom postupne zostavujem spoločný XML dokument. Nie je to také ťažké, chce to len malú úpravu. Uvidíte, že táto technika nie je striktne viazaná na konkrétny spôsob ukladania údajov XML, čo vám umožní prejsť na používanie DOM s minimálnym úsilím. V prvom rade si všimnite, že každý z našich objektov má metódu toPage(). Táto podobnosť by nás mala prinútiť zamyslieť sa nad zavedením novej spoločnej rodičovskej triedy. Nechajte každú triedu, ktorá môže vytvárať časti dokumentu XML pre stránku, dediť od triedy, ktorá sa postará o XML reprezentáciu objektu. Nazvime to Outputable.
class Outputable ( /** * XML kontajner (reťazec). */ var $output = ""; /** * Zadajte obsah kontajnera a vymažte kontajner. * * @return reťazec s údajmi XML */ funkcia getOutput () ( $ out = $this->output; $this->output = ""; return $out; ->output .= $string . "n" ) /** * Metóda "Abstract" */ funkcia toPage( ) ( ) )
Metóda toPage() je prázdna - v tomto prípade je potrebná ako indikátor toho, ako by mali externé triedy „matriošky“ komunikovať s vnútornou triedou. Tu by sme však mohli ponúknuť predvolenú implementáciu, ak by sme si všimli, že existuje veľa objektov, ktoré sa na stránke zobrazujú rovnakým spôsobom.
Triedy Message a Inbox sa mierne zmenia – teraz by mali obe dediť z Outputable a zmenia sa aj metódy toPage()
Správa.php
class Message extends Outputable ( /** * Obsah správy. */ var $content; /** * Konštruktor na inicializáciu textu správy. * * @param content content message */ function Message($content) ( $this->content = $obsah; ) /** * Napíšte správu do relácie */ funkcia send() ( $_SESSION["session_messages"] = $this->content; ) /** * Výstup správy na stránku ( $ this->appendOutput("".$this->content.""" ) ) )
class Inbox extends Outputable ( /** * Pole prijatých správ. */ var $messages = array(); /** * V konštruktore prijímame všetky prijaté správy * a odstraňujeme ich z relácie. */ funkcia Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->správy = nová správa($messages[$i]);< $co; $i++) { $this->) ) /* vymaže pole správ */ $_SESSION["session_messages"] = array();
) /** * Zobrazenie obsahu priečinka Doručená pošta na stránke.
*/ funkcia toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i
správy[$i]->toPage();
$this->appendOutput($this->správy[$i]->getOutput());
Hlavná inovácia je v objekte $global_content, ktorého názov hovorí sám za seba. V tomto prípade patrí do triedy Outputable v reálnych úlohách by ste pravdepodobne vytvorili samostatnú triedu pre obsah stránky.
Ak sa pozriete pozorne, obsah skriptu sa prakticky nezmenil - rovnaká schránka, rovnaká toPage(). Pridaná inštrukcia, ktorá zobrazuje obsah zoznamu správ v obsahu stránky. Pre spestrenie sú teraz vygenerované dve správy.
Aby ste sa mohli pozrieť na výsledok, ostáva už len pripraviť XSL šablónu.
style.xsl
Príklad XSLT
čo sme dosiahli?
Predovšetkým môžete s väčšou istotou prevziať komplexné projekty - je zabezpečená skutočná nezávislosť modulov. Poradie, v ktorom sú výsledky umiestnené na stránke, sa teraz riadi pomocou externej šablóny XSL a nezávisí od poradia, v ktorom sú moduly spustené.
Akýkoľvek modul, ktorý generuje XML dáta ako výsledok svojej práce, môže byť použitý v projekte. To je mimochodom jedna z výhod oproti šablónovým enginom, v ktorých tvorba dát pozostáva zo sekvencie volania metód (priradenie a pod.) konkrétneho enginu, pre ktoré neexistuje spoločný štandard.
Ďalšou výhodou je ľahké ladenie. Ak spustíte skript, všimnete si, že každá stránka obsahuje výstup ladenia – prototyp XML, ktorý výrazne zjednodušuje ladenie aplikácií.
Ešte niečo, na čo musíte myslieť, je, ako vytvoriť objekty správ. Nie vždy je vhodné použiť nové priamo v klientskom kóde. Ale možno je to téma na samostatný článok.
Nakoniec cval o vyhliadkach:
* pop-up okná so zoznamom dôležitých správ
* „stránky odosielateľa“ a „cieľové stránky“ v správach
* protokolovanie správ do databázy
* tlačidlo "zobraziť históriu mojich akcií"
* štatistická analýza akcií používateľov v rámci relácií
* „inteligentní asistenti“ vo webových aplikáciách
Nakoniec som si uvedomil: Nikoho lepšieho ako moju manželku som nenašiel. Ostáva už len nájsť si ženu
PHP AJAX CRUD: vytváranie, mazanie, úprava záznamov v databáze MySQLV tomto článku sa dozvieme, ako pridávať, upravovať a odstraňovať záznamy v databáze MySQL pomocou PHP. Použili sme obslužný program JQuery, ktorý odosiela požiadavku AJAX do skriptu na strane servera. Obsluha aktualizuje zoznam záznamov.
AJAX formulár na odosielanie žiadostí o vytvorenie, vymazanie, úpravuPri pridávaní záznamu formulár odošle dáta do PHP skriptu cez požiadavku AJAX. Ak je pridanie úspešné, zoznam záznamov sa znova načíta.
Funkcie JQuery AJAX pre databázový dotaz CRUDVo funkcii JQuery AJAX máme prepínacie prípady pridávať úpravy a mazať. Tieto prípady generujú rôzne reťazce údajov dotazov a odpovedí v závislosti od akcií databázy.
function showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) funkcia cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(správa) $("#frmAdd").show(); callCrudAction(akcia,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, typ: "POST", success:function(data)( switch(akcia) (case "add": $("#comment-list-box").append(data); break ; prípad "upraviť": $("#správa_" + id + " .obsah-správy").html(údaje $("#frmAdd").show();
prestávka;case "delete": $("#message_"+id).fadeOut();
prestávka;
Prečo Vodafone kráča v stopách MTS a zavádza regionalizáciu?
Bitdefender Antivirus: Efektívny Defender bez otázok
Význam slova neúspešný
Recenzia Samsung Galaxy A7 (2017): nebojte sa vody a šetrite Oplatí sa kúpiť samsung a7
Vytvorenie zálohy firmvéru v systéme Android