Zobrazování zpráv uživateli ve webových aplikacích. Parametry dotazu PHP-Swagger JQuery AJAX funkce pro CRUD databázový dotaz

3,3 tis

Zobrazování zpráv uživateli je poměrně běžná akce, kterou by webová aplikace měla provádět. Může k němu dojít při zpracování formulářů, mohou to být chybové zprávy, zprávy, které vám říkají, že se máte zaregistrovat, když se uživatel pokusí o přístup k omezené části webu, a v mnoha dalších případech.

Velmi často je vytváření a výstup zpráv rozdělen do různých HTTP požadavků. Zpravidla je vhodné použít přesměrování po zpracování formulářů (abyste předešli problémům s tlačítky Zpět a Obnovit), ale zároveň je přirozeným okamžikem pro vytvoření zprávy právě okamžik zpracování formulářů a provádění akcí doprovázejících to. Proč? Představte si, že text zprávy by měl vypadat nějak takto: „Počet objednaných jednotek pro produkt ‚Mouse Pad‘ byl úspěšně změněn ze 7 na 12.“ Po přesměrování, možná na úplně jinou stránku z hlediska funkčnosti, bude další bolest hlavy zjišťovat, co bylo provedeno předtím.

Nejčastěji se zprávy zobrazují v požadavku POST, který zpracovává formulář - to není dobré, slova „tato stránka je zastaralá“ ničí život (když se uživatel rozhodne vyzkoušet tlačítko Zpět).

Někdo používá přesměrování a vzdává se přátelských zpráv.

Přitom existuje jednoduchý a zřejmý způsob, jak zlepšit život. Navzdory samozřejmosti jsem to z nějakého důvodu nikdy neviděl nikoho používat - alespoň když jsem se podíval na zdroje jiných lidí.

Máme tedy problém – zpráva musí „žít“ v různých požadavcích. Potřebujeme mechanismus pro přenos textu zprávy na stránku, která by jej měla zobrazit. Pravděpodobně jste si již vzpomněli na sezení.

Ano, obecně máte pravdu. Jiné metody, například prostřednictvím globální proměnné, neumožňují ukládání dat v případě použití přesměrování (pozn. Maxim Naumenko). Navíc se obvykle ujišťuji, že každá obrazovka v aplikaci má možnost spolu s dalšími informacemi zobrazovat zprávy, které byly vygenerovány na předchozích obrazovkách. To je výhodné, protože není třeba připravovat samostatné obrazovky pro zobrazování zpráv a uživatel nemusí znovu klikat myší. Ale ve skutečnosti zde musí designér myslet - zvýraznit oblast, ve které by se zprávy objevily.

Myšlenka je velmi jednoduchá a lze ji implementovat pomocí několika tříd.

První věc, která vás napadne, je vytvořit třídu Message, která by ve skutečnosti představovala zprávu v našem jednoduchém diagramu tříd. Zpráva musí být schopna uložit se v relaci a také se sama zobrazit na obrazovce.

class Message ( /** * Obsah zprávy. */ var $content; /** * Konstruktor pro inicializaci textu zprávy. * * @param content content message */ function Message($content) ( $this->content = $ content ; ) /** * Napište zprávu do relace. */ funkce send() ( $_SESSION["session_messages"] = $this->content; ) /** * Odešle zprávu na stránku. */ funkce toPage() ( echo " - " . $this->content ."
"; } }

Pro přístup k relaci se používá proměnná $_SESSION.

Všimněte si, že $_SESSION je pole, používáme pouze jeden prvek tohoto pole s indexem ‚session_message‘.

V tomto případě máme co do činění s „polem polí“ – to, co ukládáme do prvku „session_message“ je pole, to je seznam přenášených zpráv (samozřejmě jich může být několik).

Pokud jste vlákno nenašli, je čas oprášit části manuálu věnované relacím a polím.

Možná máte otázku. Proč jsou zde kurzy potřebné? Bylo by možné vystačit se dvěma funkcemi. Ale podívejme se dál. Možná budeme muset vytvořit zprávy s různými typy (informace, chyba, varování) a určit příjemce zprávy.

Upozorňujeme, že v tuto chvíli není do relace vložen samotný objekt, ale pouze text zprávy. OOP nám umožňuje později změnit chování metody send() beze změny kódu klienta, který k této metodě přistupuje (například v budoucnu můžeme do relace zapsat celý objekt Message, pokud má mnoho polí).

Představme si, že bychom to provedli pomocí funkcí. Pravděpodobně bychom měli funkci message_send($txt) a také funkci message_to_page($txt). Nyní musíme přidat možnost různého chování pro různé typy zpráv. Změna volání funkce: message_send($txt, $druh), message_to_page($txt, $druh). Při hledání takových funkcí budete muset pročesávat celý kód aplikace a provádět opravy.

Tomu se lze vyhnout předvídáním situace předem tím, že zprávu předložíte jako asociativní pole: $msg[‘txt’], $msg[‘kind’], pak bude ve volání funkcí pouze jeden parametr. Cítíte, jak se to snaží stát se třídou?

OOP vám tedy dává možnost dopřát si luxusu nemyslet na vše dopředu.

Další třída - Inbox - je určena právě pro toto.

class Inbox ( /** * Pole přijatých zpráv. */ var $messages = array(); /** * V konstruktoru získáme všechny přijaté zprávy * a odstraníme je z relace. */ funkce Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->zprávy = nová zpráva($messages[$i]); ) ) /* vymaže pole zpráv */ $_SESSION["session_messages"] = array(); ) /** * Zobrazení obsahu složky Doručená pošta na stránce. */ funkce toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Zpráva ze systému:
"; ) pro ($i = 0; $i< $co; $i++) { $this->zprávy[$i]->ToPage(); )))

Vyzkoušejte náš systém zasílání zpráv.

Vytvořme si velmi jednoduchý příklad, který bude reagovat na odeslání formuláře nahlášením počtu sekund v aktuální minutě.

Veškerou práci s poli a relacemi jsme schovali do tříd a konečný kód vypadá jednoduše a krásně.

Vytvořte adresář na svém webovém serveru, poté v něm vytvořte tyto tři soubory a vyzkoušejte skript. Upozorňujeme, že s tlačítky Zpět a Obnovit nejsou žádné problémy.

Nyní si představte, že vytváříte komplexní portál, kde je na stránkách zpravidla několik bloků a každý může obsahovat samostatnou aplikaci.

Zde narážíme na dvě potíže:

* Přál bych si, aby se seznam zpráv zobrazoval v konkrétní části stránky a už jste pro to našli dobré místo.
Problém je v tom, že musíte spustit příkaz $inbox->toPage() přesně v okamžiku, který by odpovídal pozici seznamu zpráv na stránce. Pokud chceme změnit pozici tohoto seznamu, budeme muset jít do kódu, ale není dobré k tomu neustále měnit rám portálu. Nejlepším řešením by bylo udělat výstup zpráv ve formě samostatného modulu, o kterém víme pouze to, že je potřeba jej propojit s frameworkem.
To znamená, že se osvoboďte od přísného sledu spouštění modulů. Ve skutečnosti, protože výsledek výstupu Inbox nezávisí na provozu systému (v tomto kroku již máme všechna data v relaci), tak proč ta další složitost?
* Abyste zachovali vzhled (design) seznamu zpráv, musíte se postarat o HTML kód, který je pevně zakódován v metodách toPage() tříd Message a Inbox. Obvykle budete muset změnit kód PHP, abyste mohli změnit design.

Chcete-li se pokusit vyřešit první problém, můžete vytvořit vyrovnávací paměť, která uloží výsledek výstupu Doručená pošta.

Možná budeme mít stále několik podobných věcí (jako Inbox) a musíme vytvořit systém vyrovnávací paměti. Aby nedošlo k záměně čí výstup je čí, dojdeme asi k pojmenování bufferů. Někde uložíme sekvenci, podle které se mají buffery vypisovat – nejlépe do externího souboru pro usnadnění změn.

Tento pokus o řešení nám již dává myšlenku použití XML jako prostředku pro ukládání mezilehlých dat. A použití stylů XSLT pomůže vyřešit druhý problém.

Nebudu se zabývat tím, co je XML a co XSLT. Pokud nejste obeznámeni s těmito věcmi, zvon.org je dobré místo, kde začít hledat.

Cílem je generovat nikoli HTML kód, ale strukturu XML v metodách toPage(). Stránkový dokument bude vytvořen jako řetězec s kódem XML (bude sloužit jako „buffer“) a v poslední fázi skriptu použijeme transformaci XSL.

Nejprve si představme, co by mělo být výsledkem hlavní části kódu.

minuta 57 sekunda: 45

Co to je, lze celkem snadno uhodnout – dvě zprávy a formulář. Upozorňujeme, že PHP skript potřebuje pouze takový řetězec připravit – je to velmi jednoduché. Pořadí hlavních tagů navíc není důležité - můžete je umístit například na začátek, jak to programátorovi vyhovuje. Jak to implementovat. Můžete, aniž byste cokoli měnili, používat ukládání do vyrovnávací paměti výstupu, vydávat XML místo HTML kódu a nakonec jednoduše zachytit výstup do řetězce. Pak ale ztratíme flexibilitu – například někdy chcete vypsat ladicí informace přímo na stránku (pomocí echa). Vývojáři PHP zároveň pracují na modulu DOM, který nabízí pokročilejší způsob vytváření a předávání stromových dokumentů. Pokud budeme chtít implementovat DOM, budeme muset předělat celou aplikaci, změnit výstup řetězců na tvorbu prvků DOM. Proto dávám přednost ukládání XML reprezentace objektů v rámci samotných objektů, sekvenčním sestavením společného XML dokumentu. Není to tak těžké, chce to jen malou úpravu. Uvidíte, že tato technika není striktně vázána na konkrétní způsob ukládání dat XML, a to vám umožní přejít na použití DOM s minimálním úsilím. Nejprve si všimněte, že každý z našich objektů má metodu toPage(). Tato podobnost by nás měla přimět přemýšlet o zavedení nové společné rodičovské třídy. Nechte každou třídu, která dokáže vytvořit části dokumentu XML pro stránku, dědit od třídy, která se postará o XML reprezentaci objektu. Říkejme tomu Outputable.

class Outputable ( /** * XML kontejner (řetězec). */ var $output = ""; /** * Zadejte obsah kontejneru a vymažte kontejner. * * @return řetězec s daty XML */ funkce getOutput () ( $ out = $this->output; $this->output = ""; return $out; ) /** * Přidejte část k obsahu kontejneru. * * @param řetězec řetězec, který chcete přidat * / function appendOutput($string) ( $this ->output .= $string . "n"; ) /** * metoda "Abstract". */ function toPage() ( ) )

Metoda toPage() je prázdná – v tomto případě je potřeba jako indikátor toho, jak mají externí třídy „matrjoška“ komunikovat s vnitřní třídou. Zde bychom však mohli nabídnout výchozí implementaci, pokud bychom si všimli, že existuje mnoho objektů, které se na stránce zobrazují stejným způsobem.

Třídy Message a Inbox se mírně změní – měly by nyní obě dědit z Outputable a změní se také metody toPage()
Zpráva.php

class Message extends Outputable ( /** * Obsah zprávy. */ var $content; /** * Konstruktor pro inicializaci textu zprávy. * * @param content obsah zprávy */ funkce Zpráva($content) ( $this->content = $content; ) /** * Napište zprávu do relace. */ funkce send() ( $_SESSION["session_messages"] = $this->content; ) /** * Odešle zprávu na stránku. * / function toPage() ( $this->appendOutput("".$this->content.""); ) )

class Inbox extends Outputable ( /** * Pole přijatých zpráv. */ var $messages = array(); /** * V konstruktoru přijímáme všechny přijaté zprávy * a odstraňujeme je z relace. */ funkce Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->zprávy = nová zpráva($messages[$i]); ) ) /* vymaže pole zpráv */ $_SESSION["session_messages"] = array(); ) /** * Zobrazení obsahu složky Doručená pošta na stránce. */ funkce toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->zprávy[$i]->toPage(); $this->appendOutput($this->zprávy[$i]->getOutput()); ) $this->appendOutput(""); ))

Metoda výstupu se změnila – nyní, namísto přímého výstupu na stránku, je externí reprezentace prozatím uložena v Outputable, která „sedí“ v každém z objektů. Metoda appendOutput() slouží jako náhrada za konstrukci echo(). K získání výstupu objektu se používá metoda getOutput().

Nyní se podívejme, jaká je klientská část kódu, která vyřeší stejný problém jako dříve.
index.php

Hlavní inovace je v objektu $global_content, jehož název mluví sám za sebe. V tomto případě patří do třídy Outputable, v reálných úlohách byste pravděpodobně vytvořili samostatnou třídu pro obsah stránky.

Pokud se podíváte pozorně, obsah skriptu se prakticky nezměnil - stejná schránka, stejná toPage(). Přidána instrukce, která zobrazuje obsah seznamu zpráv v obsahu stránky. Pro zpestření jsou nyní vygenerovány dvě zprávy.

Abyste se mohli podívat na výsledek, zbývá už jen připravit XSL šablonu.
styl.xsl

Příklad XSLT

zpráva

Čeho jsme dosáhli?

Především se můžete s větší jistotou ujmout komplexních projektů – je zajištěna skutečná nezávislost modulů. Pořadí, ve kterém jsou výsledky umístěny na stránce, je nyní řízeno pomocí externí šablony XSL a nezávisí na pořadí, ve kterém jsou moduly spouštěny.

V projektu lze použít jakýkoli modul, který generuje data XML jako výsledek své práce. To je mimochodem jedna z výhod oproti šablonovým enginům, ve kterých se tvorba dat skládá ze sekvence volání metod (assign apod.) konkrétního enginu, pro které neexistuje společný standard.

Další výhodou je snadné ladění. Pokud skript spustíte, všimnete si, že každá stránka obsahuje výstup ladění – prototyp XML, který výrazně zjednodušuje ladění aplikací.

Ještě něco, na co musíte myslet, je, jak vytvořit objekty zpráv. Ne vždy je vhodné používat new přímo v klientském kódu. Ale to je možná téma na samostatný článek.

Nakonec cval o vyhlídkách:

* vyskakovací okna pro seznam důležitých zpráv
* "stránky odesílatele" a "cílové stránky" ve zprávách
* protokolování zpráv do databáze
* tlačítko "zobrazit historii mých akcí"
* statistická analýza akcí uživatelů v rámci relací
* „inteligentní asistenti“ ve webových aplikacích

Přehled

Vestavěný oznamovací systém, vůbec první v Joomle, umožňuje vaší aplikaci informovat uživatele (nebo skupinu uživatelů) o různých různých událostech. Oznámení považujte za důležitá upozornění, která by si uživatel rád přečetl, a sledujte je.
Oznámení lze generovat všude. Ve vaší komponentě nebo zásuvných modulech a později zobrazené v systému upozornění JomSocial.
Tento tutoriál vám ukáže jak, ale protože nemáme představu o žádné komponentě třetí strany, kterou bychom mohli použít:) příklady budou provedeny na komunitním pluginu, který se spustí při události onAfterProfileUpdate
Pokud nevíte, jak vytvořit plugin, který se při této události spustí, doporučujeme vám zkontrolovat tento návod

Přesto jej implementujte do vaší komponenty

Jak je uvedeno v přehledu tohoto tutoriálu, budeme generovat upozornění pomocí komunitního pluginu.
Pravděpodobně budete chtít vytvořit oznámení uvnitř komponenty nebo pluginu. Následující návod bude fungovat v kterémkoli z těchto případů. Musíte pouze určit, ve kterém bodě vašeho kódu bude oznámení vytvořeno a stačí načíst soubor JomSocial Core Libraries.

vyžadovat_jednou JPATH_ROOT . "/components/com_community/libraries/core.php" ;

Následující návod vysvětlený níže bude fungovat dobře i pro vaše rozšíření

Příprava vývojového prostředí

1. Budeme předpokládat, že jste již vytvořili ukázkový plugin typu komunity, který se spustí, když uživatel změní svůj profil
Pokud ne, můžete si stáhnout prázdný ukázkový plugin z , nainstalovat jej do Joomly a povolit plugin. Jmenuje se Komunita – příklad oznámení
2. Přejděte do své databáze a vyprázdněte tyto dvě tabulky, aby neměly vůbec žádné záznamy

A) prefix_community_notification
b) prefix_community_mailq

3. Mít alespoň dva (2) uživatele na svých testovacích místech a znát jejich ID

V dřívějších verzích Joomly začínala uživatelská ID vždy od zadaného čísla (62, 42). V Joomle 3 bude toto číslo náhodné, tedy obrázek našeho testovacího prostředí, protože na vašem konci bude určitě jiné.

První oznámení

Otevřete soubor php pluginu, který bude umístěn v ROOT/plugins/community/example
V rámci funkce onAfterProfileUpdate() nahraďte

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

Jak je znázorněno na příkladu, oznámení add api má 7 parametrů

  • $cmd - je typ upozornění. V tomto souboru můžete vidět všechny typy oznámení. ROOT/components/com_community/libraries/notificationtypes.php počínaje nebo kolem řádku 53. Doporučujeme použít typ upozornění system_messaging.
  • $actor - je osoba, která provádí akci
  • $target - je osoba nebo skupina lidí, která obdrží oznámení
  • $předmět – je předmět upozornění, a to jak ve vyskakovacím okně upozornění, tak v názvu e-mailu
  • $body - je tělo e-mailové notifikační zprávy
  • $template - pokud potřebujete použít konkrétní šablonu, můžete ji definovat zde. Jinak může být tento parametr prázdný
  • $params - vlastní definované parametry
  • Když tohle všechno víme, pojďme definovat proměnné, které budeme používat
    Změňte kód pluginu na:

    $user = CFactory::getUser(); $cmd = "system_messaging" ; // první parametr, typ aktivity $actor = $user -> id ; //druhý parametr - získání id $actor $target = "965" ; // třetí param. Kdo obdrží oznámení? V našem vývojářském prostředí jeho uživatel admin s ID 965. Ve vašem prostředí budete s největší pravděpodobností chtít získat ID ze svého objektu nebo z pole uživatelů. $předmět = "Předmět oznámení" ; // Předmět e-mailových i vyskakovacích upozornění $body = ; //Tělo zprávy v e-mailech. $template = "" ; // Pokud potřebujete použít konkrétní soubor šablony jomsocial, můžete jej definovat zde. $params = new CParametr("" ) ; // Chceme vytvořit další objekt params a přiřadit mu data, aniž bychom museli formálně definovat třídu CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Nyní se přihlaste s libovolným uživatelem a změňte informace v profilu. Pojďme do databáze, abychom viděli, co se stalo.
    Přejděte do tabulky prefix_community_notifications a sledujte nový záznam

    Přejděte do tabulky prefix_community_mailq a podívejte se na nový záznam

    Gratulujeme! - Úspěšně jste vytvořili své první vlastní oznámení, které bylo odesláno prostřednictvím e-mailu a interního systému oznámení JomSocial


    Potenciální kód Bloat

    Výše uvedený příklad je v pořádku a funguje, ale obecně se nedoporučuje jej takto používat. Místo toho by se to dalo napsat takto

    $actor = CFactory::getUser(); $params = new CParametr("" ) ; CNotificationLibrary:: add ( "system_messaging" , $actor -> "Toto je zpráva těla upozornění" , "" , $params ) ;

    To je mnohem čistší a snadněji sledovatelné, přičemž v zásadě děláte totéž jako výše uvedený kód.

    Vlastní parametry oznámení

    Notifikační API lze rozšířit o jakýkoli parametr, který chcete přidat.
    Tyto parametry lze předat buď do šablony e-mailu, oznámení a samozřejmě do jazykového souboru.

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = new CParametr("" ) ; $params -> set ("actor" , $actor -> getDisplayName () ) ; // lze použít jako (actor) tag $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Odkaz na (herec) tag $params -> set ("url" , $link ) ; //url celé aktivity. Používá se při najetí myší na avatar v oznamovacím okně. Může být také použit jako (url) tag v odchozích e-mailech. Ujistěte se, že jste definovali proměnnou $link:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "Toto je zpráva v těle upozornění" , "" , $params) ;

    • $params = nový CParametr( ); - Chceme vytvořit nový objekt params a přiřadit mu data, aniž bychom museli formálně definovat třídu.
    • $params->set("herec", $actor->getDisplayName()); - Vaše oznámení by vždy mělo mít herce. Tento parametr lze předat šabloně jako značku (actor). V oznamovacím okně definuje uživatele, který provádí akci.
    • $params->set("url_actora", "index.php?option=com_community&view=profile&userid=" . $actor->id); - Adresa URL herce je obvykle adresa URL herce. Ve vyskakovacím okně s upozorněním přidá odkaz na prvek (actor).
    • $params->set("url", $link); - Toto je nejdůležitější parametr, který musíte vždy správně nastavit. V oznamovacím okně se tento parametr používá nad obrázkem avatara. V e-mailovém upozornění se opakuje místo, kde došlo k aktivitě.

    V tomto příkladu nastavíme proměnnou $link na přistání www.google.com takže můžete vidět, jak to funguje

    Přidání jazykového řetězce a použití parametrů

    Parametry, které jsme právě nastavili, jsou k dispozici pro použití v našich jazykových souborech.
    Umožňuje definovat jazykové klíče změnou " CNotificationLibrary::add() API

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

    Jazykový soubor by měl vypadat takto

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(herec) aktualizoval profil" PLG_COMMUNITY_EXAMPLE_BODY = "Dobrý den, administrátore \n Tímto e-mailem vás informujeme, že (herec) aktualizoval profil \n\n Pokud chcete přejít na Google, klikněte sem \n a href=" _QQ_" (url)"_QQ_">(url)"

    V tomto příkladu jsme použili značku (actor) a (url) k předání dat do šablony oznámení i e-mailu. Podívejme se, jak to vypadá.
    V oznamovacím okně, když umístíte kurzor na avatar, si všimněte, že je spuštěn parametr (url) a přidá se odkaz na google přes avatar. Je to záměrné, protože jsme to tak udělali :)


    ]

    Ve stejném okně, když umístíte kurzor na odkaz herce. Toto je část, kde (actor) ozval uživatele, který provádí akci, zatímco (actor_url)“ se postaral o to, aby byl objekt správně propojen


    Podívejme se, co se stane ve frontě e-mailů


    A nakonec skutečný e-mail, který je zasílán koncovému uživateli


    Úspěch
    Doposud jsme vytvořili tři (3) parametry, které se úspěšně používají v oznamovacím okně a e-mailech.

  • (actor) - Vrací uživatelské jméno uživatele, který provádí akci
  • (actor_url) - Dává atribut (herci)
  • (url) – Není povinné, ale měli byste ho mít vždy v oznámení. Je to hlavní adresa URL, na které došlo k akci, o které jsme informováni.
  • Podobně můžete definovat "

    • (cíl) - pokud to potřebujete
    • (target_url), pokud ji v oznámení potřebujete.
    • (title) – Běžně se používá k označení objektu, který vygeneroval oznámení. Příklad: „Uživatel X zveřejnil novou fotku do alba Y.“ Album Y je název zde
    • (title_url) – Stejně jako u předchozích, adresa URL objektu, který generoval oznámení.
    • (zpráva) - Tento parametr lze použít k nastavení (a echo) zprávy v těle e-mailu JomSocial.

    Nakonec jsem si uvědomil: nemohl jsi najít nikoho lepšího než svou ženu. Nezbývá, než si najít ženu

    PHP AJAX CRUD: vytváření, mazání, editace záznamů v databázi MySQL

    V tomto článku se naučíme přidávat, upravovat a mazat záznamy v databázi MySQL pomocí PHP. Použili jsme obslužnou rutinu JQuery, která odesílá požadavek AJAX skriptu na straně serveru. Obsluha aktualizuje seznam záznamů.

    AJAX formulář pro zasílání požadavků na vytvoření, smazání, editaci

    Při přidávání záznamu formulář odešle data do PHP skriptu prostřednictvím požadavku AJAX. Pokud je přidání úspěšné, seznam položek se znovu načte.

    JQuery AJAX funkce pro CRUD databázový dotaz

    Ve funkci JQuery AJAX máme přepínací případy přidat editovat a mazat. Tyto případy generují různé datové řetězce dotazů a odpovědí v závislosti na akcích databáze.

    function showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) funkce cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(zpráva); $("#frmAdd").show(); ) funkce callCrudAction(action,id) ( $("#loaderIcon").show(); var queryString; switch(action) ( case "add" ": queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); break; case "edit": queryString = "action="+action+"&message_id="+ id + " &txtmessage="+ $("#txtmessage_"+id).val(); break; case "delete": queryString = "action="+action+"&message_id="+ id; break; ) jQuery.ajax(( url: "crud_action.php", data:queryString, typ: "POST", success:function(data)( switch(action) (case "add": $("#comment-list-box").append(data); break; case "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); přestávka; case "delete": $("#message_"+id).fadeOut(); přestávka; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), chyba:funkce ()() )); )

    PHP skript pro operace CRUD

    Následující kód provádí dotazy na databázi. Tento skript PHP po provedení akce CRUD aktualizuje záznamy v důsledku odpovědi AJAX.

    require_once("dbcontroller.php"); $db_handle = new DBController(); $akce = $_POST["akce"]; if(!empty($action)) ( switch($action) ( case "add": $result = mysql_query("INSERT INTO comment(message) VALUES("".$_POST["txtmessage"].")" ) ; if($result)($insert_id = mysql_insert_id(); echo " Edit Delete " . $_POST["txtmessage"] . " "; ) break; case "edit": $result = mysql_query("UPDATE komentář set message = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; break; case "delete": if ( !empty($_POST["message_id"])) ( mysql_query("DELETE FROM comment WHERE id=".$_POST["message_id"]); ) break; ) )

    Ve své aplikaci Zend píšu trochu API pro mobilní aplikace. Abych to mobilním vývojářům usnadnil, používám Swagger. Zatím vše funguje dobře, kromě jednoho požadavku GET.

    Kdy zavolám /user/messages/(sessionToken)? NumMessages = (numMessages) & pageNr = (pageNr) v prohlížeči získám požadované výsledky, ale když se pokusím nechat Swagger provést tento požadavek, předá se pouze sessionToken. Zkoušel jsem tyto anotace pro Swagger:

    /** * @SWG\Api(path="/user/messages/(sessionToken)?numMessages=(numMessages)&pageNr=(pageNr)", * @SWG\Operation(* method="GET", * Summary=" Dostane zprávy stránkované", * notes="", * type="string", * přezdívka="getUsermessagesPaged", * autorizace=(), * @SWG\Parameter(* name="sessionToken", * description="Token z aktivní uživatelské relace", * required=true, * type="string", * paramType="path", * allowMultiple=true *), * @SWG\Parameter(* name="numMessages", * description=" počet zpráv na stránce (numMessages & pageNr jsou ignorovány, pokud nejsou nastaveny obě)", * required=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\Parameter (* name="pageNr", * description="číslo stránky (numMessages & pageNr jsou ignorovány, pokud nejsou nastaveny obě)", * required=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\ResponseMessage(code=200, message="json (zprávy => "user_messages")"), * @SWG\ResponseMessage(code=400, message="json s chybou "nepřihlášen"" ) *) *) */

    Vidí někdo moji chybu?

    Jakákoli pomoc je vítána.

    S pozdravem

    Aktualizace. Jak bylo navrženo, změnil jsem oba paramTypes na „query“ a změnil jsem cestu:

    @SWG\Api(path="/user/messages/(sessionToken)",

    ale nepracoval jako 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": "Operace o uživatelích" ) ], "info" : ( "title": "Api pro mobilní přístup", "description": "Toto je xxx rozhraní API pro mobilní přístup.", "termsOfServiceUrl": null, "contact": "xxx", "license": null, "licenseUrl" : null, "_partialId": null, "_partials": , "_context": ( "komentář": "\/**\ * @SWG\\Info(\ * title="Mobile access api",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ *)\ *\/", "line": 3 } } } !}

    Zde je výstup /user:

    ( "basePath": "http://localhost/ias/public", "swaggerVersion": "1.2", "apiVersion": "1.0.0", "resourcePath": "/user", "apis": [ ( "path": "/user/balance/(sessionToken)", "operations": [ ( "method": "GET", "summary": "Získává uživatelskou rovnováhu", "přezdívka": "getUserdata", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Token z aktivní uživatelské relace" ) ], "responseMessages": [ ( "code": 200, "message": "json (zůstatek => "user_balance")" ), ( "code": 400, "zpráva ": "json s chybou "nepřihlášen"" ) ], "poznámky": "", "autorizace": () ) ]), ( "cesta": "/uživatel/přihlášení", "operace": [ ( "method": "POST", "summary": "Přihlásí uživatele do systému", "přezdívka": "loginUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "e-mail", "type": "string", "required": true, "allowMultiple": false, "description": "E-mail uživatele pro přihlášení" ), ( "paramType": "form", "name": "password", "type": "string", "required": true, "allowMultiple": false, "description": "Heslo pro přihlášení jako prostý text" ) ], "responseMessages": [ ( "code": 200, "message": "json s session_id, user_id, user_balance" ), ( "code": 400, "message": "json s chybou "žádný uživatel s daným e-mailem a heslem"" ), ( " code": 400, "message": "json s chybou "neplatný vstup"" ), ( "code": 400, "message": "json s chybou "no post request"" ) ], "notes": "" , "autorizations": () ) ] ), ( "cesta": "/uživatel/odhlášení", "operace": [ ( "metoda": "POST", "summary": "Odhlášení uživatele", "přezdívka" : "logoutUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, " allowMultiple": false, "description": "Token z aktivní uživatelské relace" ) ], "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, "message": "json s chybou "no post request"" ) ], "notes": "", "authorizations": () ) ]), ( "cesta": "/user/messages/( sessionToken)", "operations": [ ( "method": "GET", "summary": "Získává nové zprávy", "přezdívka": "getUsermessages", "type": "string", "parametry": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Token z aktivní uživatelské relace" ) ], "responseMessages": [ ( "code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400, "message": "json s chybou "nepřihlášen "" ) ], "notes": "", "autorizations": () ), ( "method": "GET", "summary": "Získává stránkování zpráv", "přezdívka": "getUsermessagesPaged", "type" : "string", "parameters": [ ( "paramType": "cesta", "name": "sessionToken", "type": "string", "required": true, "description": "Token z aktivní uživatelská relace" ), ( "paramType": "query", "name": "numMessages", "type": "string", "required": true, "description": "počet zpráv na stránce (numMessages & pageNr jsou ignorovány, pokud nejsou nastaveny obě)" ), ( "paramType": "query", "name": "pageNr", "type": "string", "required": true, "description": "pagenumber ( numMessages & pageNr jsou ignorovány, pokud nejsou nastaveny obě)" ], "responseMessages": [ ( "code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400 , "message": "json s chybou "nepřihlášen"" ) ], "notes": "", "autorizations": () ) ]), ( "cesta": "/user/userdata", "operace" : [ ( "method": "POST", "summary": "Uživatelská data příspěvků", "přezdívka": "postUserdata", "type": "string", "parametry": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Token z aktivní uživatelské relace" ), ( "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" ")" ), ( "code": 400, "message": "json s chybou

    Vypadá to jako chyba, že moje swagger-ui neposílá žádné parametry požadavku? Zde je příklad s jedním parametrem dotazu, sessionToken: (řízeno FireBug 2.0.6)

    GET /ias/public/user/balance HTTP/1.1 Host: 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.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set Připojení: keep-alive

    Odpověď byla:

    HTTP/1.1 400 Bad Request Date: Út, 25. listopadu 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 Připojení: close Content-Type: application/json; charset=utf-8

    Odpověď byla správná, protože nebyl předán žádný sessionToken.

    To vyžaduje práci, ale nepochází z swagger-ui:

    GET /ias/public/user/balance?sessionToken=HTTP/1.1 Hostitel: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Přijmout: 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 Připojení: keep-alive