PHP AJAX CRUD: crea, elimina, modifica i record nel database MySQL. Parametri di query PHP-Swagger Scrupulous add message php

Panoramica

Il sistema di notifica integrato, il primo in assoluto in Joomla, consente alla tua app di tenere informato l'utente (o il gruppo di utenti) su vari eventi diversi. Pensa alle notifiche come avvisi importanti che l'utente sarebbe interessato a leggere e a tenerne traccia.
Le notifiche possono essere generate ovunque. Nel tuo componente o plugin e successivamente visualizzato all'interno del sistema di notifica JomSocial.
Questo tutorial ti mostrerà come, ma dal terzo non abbiamo idea di alcun componente di terze parti che potremmo usare :) gli esempi verranno eseguiti su un plug-in della community che verrà attivato all'evento onAfterProfileUpdate
Se non sai come creare un plugin che verrà attivato su questo evento, ti suggeriamo di consultare questa guida

Implementandolo comunque nel tuo componente

Come affermato nella panoramica di questo tutorial, genereremo notifiche utilizzando il plug-in della community.
Molto probabilmente vorrai creare notifiche all'interno del tuo componente o del tuo plug-in. Il seguente tutorial funzionerà in ognuno di questi casi. Devi solo determinare in quale punto del tuo codice verrà creata la notifica e caricare semplicemente il file JomSocial Core Libraries.

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

Seguendo il tutorial spiegato di seguito funzionerà perfettamente anche per la tua estensione

Preparazione dell'ambiente di sviluppo

1. Supponiamo che tu abbia già creato un plug-in di esempio di tipo community che verrà attivato quando l'utente modifica il proprio profilo
In caso contrario, puoi scaricare il plug-in di esempio vuoto da , installarlo in Joomla e abilitare il plug-in. È chiamato Comunità - Esempio di notifica
2. Passare al database e svuotare queste due tabelle, in modo che non contengano alcun record

A) prefix_community_notification
b) prefix_community_mailq

3. Avere almeno due (2) utenti nei siti di prova e conoscere i loro ID

Nelle versioni precedenti di Joomla, gli ID utente sono sempre iniziati da un numero specificato (62, 42) In Joomla 3, questo numero sarà casuale, quindi l'immagine del nostro ambiente di test perché sarà sicuramente diversa alla tua fine.

La prima notifica

Apri plug-in php che si troverà in ROOT/plugins/community/example
All'interno della funzione onAfterProfileUpdate() sostituire il

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

Come mostrato nell'esempio, l'API di aggiunta delle notifiche ha 7 parametri

  • $cmd - è il tipo di notifica. Puoi vedere tutti i tipi di notifica in questo file. ROOT/components/com_community/libraries/notificationtypes.php a partire da o intorno alla riga 53. Si consiglia di utilizzare il tipo di notifica system_messaging.
  • $attore - è la persona che compie l'azione
  • $target - è la persona o il gruppo di persone che riceveranno la notifica
  • $oggetto - è l'oggetto della notifica, sia nella finestra popup di notifica che nel titolo dell'e-mail
  • $body - è il corpo del messaggio di notifica e-mail
  • $template - se hai bisogno di un modello specifico da usare, puoi definirlo qui. In caso contrario, questo parametro può essere vuoto
  • $params - parametri personalizzati definiti
  • Sapendo tutto questo, definiamo le variabili che useremo
    Cambia il codice del tuo plugin in:

    $utente = Fabbrica::getUser(); $cmd = "sistema_messaggi" ; // primo parametro, tipo di attività $actor = $user -> id ; //second param - ottieni l'id di $actor $target = "965" ; // terzo param. Chi riceverà la notifica? Nel nostro ambiente di sviluppo, il suo utente amministratore con ID 965. Nel tuo ambiente, molto probabilmente vorrai ottenere l'ID dal tuo oggetto o da un array di utenti. $subject = "Oggetto notifica" ; // Oggetto di entrambe le notifiche e-mail e popup $body = ; //Corpo del messaggio nelle email. $modello = "" ; // Se è necessario utilizzare un file modello jomsocial specifico, è possibile definirlo qui. $params = new CParameter("" ); // Vogliamo creare un oggetto params aggiuntivo e assegnargli dei dati, senza dover definire formalmente una classe CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Ora accedi con qualsiasi utente e modifica il profilo informazione. Andiamo al database per vedere cosa è successo.
    Passare alla tabella prefix_community_notifications e osservare il nuovo record

    Passa alla tabella prefix_community_mailq e visualizza il nuovo record

    Congratulazioni! - Hai creato con successo la tua prima notifica personale che è stata inviata tramite e-mail e sistema di notifica JomSocial interno


    Potenziale codice gonfiato

    L'esempio sopra va bene e funziona, ma generalmente non è consigliabile usarlo in questo modo. Invece si potrebbe scrivere così

    $attore = CFactor::getUser(); $params = new CParameter("" ); CNotificationLibrary:: add( "system_messaging" , $actor -> "Questo è il messaggio del corpo della notifica" , "" , $params );

    Questo è molto più pulito e più facile da seguire mentre sostanzialmente fa assolutamente la stessa cosa di un codice mostrato sopra.

    Parametri di notifica personalizzati

    Un'API di notifica può essere estesa con qualsiasi parametro che desideri aggiungere.
    Questi parametri possono essere passati al modello di posta elettronica, alla notifica e, naturalmente, al file della lingua.

    $attore = CFactor::getUser(); $link = "http://www.google.com" ; $params = new CParameter("" ); $params -> set ("attore" , $attore -> getDisplayName () ) ; // può essere usato come tag (attore) $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Link per il tag (attore) $params -> set ("url" , $link ); //url dell'intera attività. Utilizzato quando si passa il mouse sopra l'avatar nella finestra di notifica. Può essere utilizzato come tag (url) anche nelle e-mail in uscita. Assicurati di aver definito la variabile $link:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "This is the notification body message" , "" , $params ) ;

    • $params = nuovo CParameter( ); - Vogliamo creare un nuovo oggetto params e assegnargli dei dati, senza dover definire formalmente una classe.
    • $params->set("attore", $attore->getDisplayName()); - La tua notifica dovrebbe sempre avere un attore. Questo parametro può essere passato al template come tag (attore). Nella finestra di notifica, definisce l'utente che esegue un'azione.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - L'URL dell'attore è solitamente l'URL di un attore. Nel popup di notifica, aggiunge il collegamento all'elemento (attore).
    • $params->set("url", $link); - Questo è il parametro più importante che devi sempre impostare correttamente. Nella finestra di notifica, questo parametro viene utilizzato sull'immagine dell'avatar. Nella notifica e-mail, fa eco alla posizione in cui si è verificata l'attività.

    Per questo esempio, imposteremo la variabile $link su atterra www.google.com così puoi vedere come funziona

    Aggiunta della stringa di lingua e utilizzo dei parametri

    I parametri che abbiamo appena impostato sono disponibili per essere utilizzati anche nei nostri file di lingua.
    Consente di definire le chiavi della lingua modificando il " CNotificationLibrary::add() API

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

    Il file della lingua dovrebbe essere simile a questo

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(attore) profilo aggiornato" PLG_COMMUNITY_EXAMPLE_BODY = "Ciao Admin \n Questa è la mail per informarti che (attore) ha aggiornato il profilo \n\n Se vuoi andare su Google, clicca qui \n a href=" _QQ_" (URL)" _QQ_">(URL)"

    In questo esempio, abbiamo utilizzato il tag (attore) e (url) per passare i dati a entrambi i modelli di notifica e di posta elettronica. Vediamo come sembra.
    Nella finestra di notifica quando passi con il mouse su avatar, nota il parametro (url) inserito e aggiunge il collegamento a google su avatar. È intenzionale, perché l'abbiamo fatto così :)


    ]

    Nella stessa finestra, quando si passa con il mouse sul collegamento dell'attore. Questa è la parte in cui (actor) fa eco all'utente che esegue un'azione, mentre (actor_url)" si occupa che l'oggetto sia collegato correttamente


    Vediamo cosa succede nella coda delle email


    E infine, l'e-mail effettiva che viene inviata all'utente finale


    successo
    Fino ad ora, abbiamo creato tre (3) parametri che vengono utilizzati con successo nella finestra di notifica e nelle e-mail.

  • (attore) - Restituisce il nome utente dell'utente che esegue l'azione
  • (actor_url) - Fornisce il attribuire all'(attore)
  • (url) - Non è obbligatorio, ma dovresti sempre averlo nella tua notifica. È l'URL principale in cui è avvenuta l'azione di cui siamo stati informati.
  • Allo stesso modo, puoi definire "

    • (bersaglio) - se ne hai bisogno
    • (target_url) se ne hai bisogno nella tua notifica.
    • (titolo) - Comunemente utilizzato per fare riferimento a un oggetto che ha generato la notifica. Esempio: "L'utente X ha pubblicato una nuova foto nell'album Y ." L'album Y è il titolo qui
    • (title_url) - Come per i precedenti, l'url di un oggetto che ha generato la notifica.
    • (messaggio) - Questo parametro può essere utilizzato per impostare (ed echo) il messaggio nel corpo dell'e-mail di JomSocial.
    3,3K

    La visualizzazione dei messaggi all'utente è un'azione abbastanza comune che un'applicazione web dovrebbe eseguire. Può accadere durante l'elaborazione di moduli, possono essere messaggi di errore, messaggi che dicono che è necessario registrarsi quando un utente tenta di accedere a una parte riservata del sito e in molti altri casi.

    Molto spesso, la creazione e l'output dei messaggi sono separati da diverse richieste HTTP. Di norma, è conveniente utilizzare un reindirizzamento dopo l'elaborazione dei moduli (per evitare problemi con i pulsanti Indietro e Aggiorna), ma allo stesso tempo il momento naturale per la creazione di un messaggio è proprio il momento dell'elaborazione dei moduli e compiere le azioni che lo accompagnano. Perché? Immagina che il testo del messaggio sia simile a questo: "Il numero di unità ordinate dell'articolo 'Mouse Pad' è stato modificato con successo da 7 a 12." Dopo un reindirizzamento, forse a una pagina completamente diversa in termini di funzionalità, sarà una testa in più per determinare cosa è stato fatto prima.

    Molto spesso, i messaggi vengono visualizzati nella richiesta POST che elabora il modulo: questo non va bene, le iscrizioni "questa pagina non è aggiornata" rovinano la vita (quando l'utente vuole provare il pulsante Indietro).

    Qualcuno usa un reindirizzamento, rinunciando ai messaggi amichevoli.

    Allo stesso tempo, esiste un modo semplice e ovvio per migliorare la vita. Nonostante l'ovvietà, per qualche motivo non ho mai visto nessuno usarlo, almeno quando ho guardato le fonti di altre persone.

    Quindi, abbiamo un problema: il messaggio dovrebbe "vivere" in diverse richieste. Abbiamo bisogno di un meccanismo per passare il testo del messaggio alla pagina che dovrebbe visualizzarlo. Probabilmente ti sei già ricordato delle sessioni.

    Sì, in generale hai ragione. Altri metodi, ad esempio, tramite una variabile globale, non consentono il salvataggio dei dati nel caso in cui venga utilizzato un reindirizzamento (osservazione di Maxim Naumenko). Inoltre, di solito mi assicuro che ogni schermata dell'applicazione abbia la possibilità, insieme ad altre informazioni, di visualizzare i messaggi generati nelle schermate precedenti. Ciò è conveniente perché non è necessario preparare schermate separate per la visualizzazione dei messaggi e l'utente non deve fare nuovamente clic con il mouse. Ma, davvero, qui il designer deve pensare - per evidenziare l'area in cui appariranno i messaggi.

    L'idea è molto semplice e può essere implementata con un paio di classi.

    La prima cosa che viene in mente è creare una classe Message, che, in effetti, rappresenterebbe un messaggio sul nostro semplice diagramma di classe. Il messaggio deve potersi salvare nella sessione, oltre che visualizzarsi sullo schermo.

    class Message ( /** * Contenuto del messaggio. */ var $content; /** * Costruttore per inizializzare il testo del messaggio. * * @param content message content */ function Message($content) ( $this->content = $content ; ) /** * Scrivi il messaggio alla sessione */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Invia il messaggio alla pagina */ function toPage() ( echo "-". $this->content . "
    "; } }

    La variabile $_SESSION viene utilizzata per accedere alla sessione.

    Nota che $_SESSION è un array, usiamo solo un elemento di questo array con l'indice 'session_message'.

    In questo caso, abbiamo a che fare con un "array di array" - ciò che memorizziamo nell'elemento 'session_message' è un array, questo è l'elenco dei messaggi trasmessi (potrebbero essercene diversi, ovviamente).

    Se non sei riuscito a trovare il thread, è il momento di rispolverare le sezioni del manuale su sessioni e array.

    Potresti avere una domanda. Perché le lezioni sono necessarie qui? Sarebbe possibile cavarsela con due funzioni. Ma guardiamo oltre. Potremmo aver bisogno di creare messaggi con vari tipi(info, errore, avviso), definire i destinatari del messaggio.

    Nota che dentro questo momento non l'oggetto stesso viene inserito nella sessione, ma solo il testo del messaggio. OOP ci consente di modificare il comportamento del metodo send() in futuro senza modificare il codice client che chiama questo metodo (ad esempio, in futuro, l'intero oggetto Message può essere scritto nella sessione se ha molti campi).

    Immaginiamo di farlo con l'aiuto delle funzioni. Probabilmente, avremmo una funzione message_send($txt), avremmo anche una funzione message_to_page($txt). Ora dobbiamo aggiungere la possibilità di comportamenti diversi per diversi tipi di messaggi. Le chiamate di funzione cambiano: message_send($txt, $kind), message_to_page($txt, $kind). Dovrai setacciare l'intero codice dell'applicazione alla ricerca di tali funzioni, apportando correzioni.

    Ciò può essere evitato anticipando la situazione presentando il messaggio come un array associativo: $msg['txt'], $msg['kind'], quindi ci sarà un solo parametro nelle chiamate di funzione. Senti come tende a trasformarsi in una classe?

    Bene, OOP ti dà il lusso di non dover pensare in anticipo alle cose.

    La classe successiva - Posta in arrivo - è proprio per questo scopo.

    class Inbox ( /** * Array di messaggi in arrivo. */ var $messages = array(); /** * Nel costruttore, recupera tutti i messaggi in arrivo * e li rimuove dalla sessione. */ function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->messaggi = new Messaggio($messaggi[$i]); ) ) /* cancella l'array di messaggi */ $_SESSION["session_messages"] = array(); ) /** * Visualizza il contenuto della Posta in arrivo sulla pagina. */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Messaggio dal sistema:
    "; ) per ($i = 0; $i< $co; $i++) { $this->messaggi[$i]->APagina(); ) ) )

    Testiamo il nostro sistema di messaggistica.

    Creiamo un esempio molto semplice che, in risposta all'invio di un form, riporterà il numero di secondi del minuto corrente.

    Abbiamo nascosto tutto il lavoro con array e sessioni all'interno delle classi e il codice finale sembra semplice e bello.

    Crea una directory sul server web, quindi crea questi tre file e prova lo script. Si noti che non ci sono problemi con i pulsanti Indietro e Aggiorna.

    Ora immagina di creare un portale complesso, dove, di norma, ci sono diversi blocchi sulle pagine e ognuno può contenere un'applicazione separata all'interno.

    Qui incontriamo due difficoltà:

    * Vorrei che l'elenco dei messaggi appaia in una certa parte della pagina e hai già trovato un buon posto per questo.
    Il problema è che devi eseguire il comando $inbox->toPage() esattamente nel momento che corrisponderebbe alla posizione dell'elenco dei messaggi sulla pagina. Se vogliamo cambiare la posizione di questo elenco, dovremo entrare nel codice, ma non è bene cambiare costantemente il framework del portale per questo. soluzione migliore sarebbe rendere l'output dei messaggi sotto forma di un modulo separato, di cui si sa solo che deve essere connesso al framework.
    Cioè, per sbarazzarsi della rigida sequenza di lancio dei moduli. Infatti, poiché il risultato dell'operazione di output della posta in arrivo non dipende dal funzionamento del sistema (on questo passaggio- abbiamo già tutti i dati nella sessione), allora perché la complessità aggiuntiva?
    * Per mantenere l'aspetto (design) dell'elenco dei messaggi, è necessario prendersi cura del codice HTML che abbiamo cablato nei metodi toPage() delle classi Message e Inbox. Di norma, dovrai modificare il codice PHP per modificare il design.

    Per provare a risolvere il primo problema, puoi creare un buffer che memorizzerebbe il risultato dell'output della Posta in arrivo.

    Forse avremo ancora alcune cose simili (a Inbox) e dobbiamo creare un sistema di buffer. Per non confondere dove si trova l'output, probabilmente arriveremo alla denominazione dei buffer. Avremo memorizzato da qualche parte la sequenza in base alla quale dovrebbe verificarsi l'output dei buffer, preferibilmente in un file esterno, in modo che sia più facile apportare modifiche.

    Già questo tentativo di soluzione ci dà l'idea di utilizzare XML come mezzo per archiviare dati intermedi. E l'uso degli stili XSLT aiuterà a far fronte al secondo problema.

    Non mi soffermerò su cos'è XML e cos'è XSLT. Se non hai familiarità con queste cose, zvon.org è un buon punto di partenza per imparare.

    L'idea è di formare non codice HTML, ma struttura XML nei metodi toPage(). Il documento della pagina verrà creato come una stringa con codice XML (funzionerà da "buffer") e nell'ultima fase dello script utilizzeremo la trasformazione XSL.

    Per cominciare, immagina quale dovrebbe essere il risultato del lavoro della parte principale del codice.

    minuto 57 secondo: 45

    Di cosa si tratta - è abbastanza facile intuirlo - due messaggi e un modulo. Nota che lo script PHP deve solo preparare questa stringa: è molto semplice. Inoltre, l'ordine dei tag principali non è importante: puoi metterlo per primo, ad esempio, poiché sarà conveniente per il programmatore. Come implementarlo. È possibile, quasi senza modificare nulla, utilizzare il buffering dell'output, l'output XML invece del codice HTML e alla fine catturare semplicemente l'output in una stringa. Ma poi perderemo in flessibilità, ad esempio, a volte vuoi visualizzare le informazioni di debug direttamente sulla pagina (usando echo). Allo stesso tempo, sviluppatori PHP stanno lavorando su un modulo DOM che offre un modo più avanzato di creare e passare documenti ad albero. Se vogliamo iniettare il DOM, dovremo riprogettare l'intera applicazione, modificando l'output delle stringhe per creare elementi DOM. Pertanto, preferisco archiviare la rappresentazione XML degli oggetti all'interno degli oggetti stessi, costruendo in sequenza il documento XML complessivo. Non è così difficile, è necessaria solo una piccola modifica. Vedrai che questa tecnica non è strettamente legata a un particolare modo di memorizzare i dati XML, e questo ti permetterà di passare all'uso del DOM "con poco spargimento di sangue". Prima di tutto, nota che ognuno dei nostri oggetti ha un metodo toPage(). Questa somiglianza dovrebbe farci pensare all'introduzione di una nuova classe genitore comune. Lascia che ogni classe che è in grado di creare parti del documento XML per la pagina erediti da una classe che si occuperà della rappresentazione XML dell'oggetto. Chiamiamolo Outputable.

    class Outputable ( /** * Contenitore XML (stringa). */ var $output = ""; /** * Indica il contenuto del contenitore e cancella il contenitore. * * @return stringa con dati XML */ function getOutput( ) ( $ out = $this->output; $this->output = ""; return $out; ) /** * Aggiunge una parte al contenuto del contenitore. * * @param string la stringa da aggiungere */ function appendOutput($string) ( $this ->output .= $string ."n"; ) /** * metodo "Abstract".*/ function toPage() ( ) )

    Il metodo toPage() è reso vuoto - in questo caso, è necessario come indicatore di come le classi "matrioska" esterne dovrebbero comunicare con la classe interna. Tuttavia, qui potrebbe essere suggerita un'implementazione predefinita se notiamo che ci sono molti oggetti che si visualizzano allo stesso modo sulla pagina.

    Le classi Message e Inbox cambieranno leggermente: ora entrambe dovrebbero ereditare da Outputable e anche i metodi toPage () cambieranno
    messaggio.php

    class Message extends Outputable ( /** * Contenuto del messaggio. */ var $content; /** * Costruttore per inizializzare il testo del messaggio. * * @param content message content */ function Message($content) ( $this->content = $content; ) /** * Scrivi il messaggio alla sessione */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Invia il messaggio alla pagina */ function toPage () ( $this->appendOutput("".$this->content.""); ) )

    class Inbox extends Outputable ( /** * Array di messaggi in arrivo. */ var $messages = array(); /** * Nel costruttore, recupera tutti i messaggi in arrivo * e li rimuove dalla sessione. */ function Inbox() ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->messaggi = new Messaggio($messaggi[$i]); ) ) /* cancella l'array di messaggi */ $_SESSION["session_messages"] = array(); ) /** * Visualizza il contenuto della Posta in arrivo sulla pagina. */ function toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->messaggi[$i]->toPage(); $this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput(""); ) )

    Il metodo di output è cambiato: ora invece di inviare direttamente alla pagina, la rappresentazione esterna viene memorizzata per il momento nell'Outputable, che "si trova" in ciascuno degli oggetti. Il metodo appendOutput() serve come una sorta di sostituzione per il costrutto echo(). Per ottenere l'output di un oggetto, viene utilizzato il metodo getOutput().

    Ora vediamo qual è la parte client del codice, che risolverà lo stesso compito di prima.
    indice.php

    L'innovazione principale è nell'oggetto $global_content, il cui nome parla da sé. In questo caso appartiene alla classe Outputable, nella vita reale probabilmente creeresti una classe separata per il contenuto della pagina.

    Se guardi da vicino, il contenuto dello script non è cambiato molto: la stessa casella di posta, lo stesso toPage(). Aggiunta un'istruzione che restituisce il contenuto dell'elenco dei messaggi al contenuto della pagina. Per una modifica, ora vengono generati due messaggi.

    Per vedere il risultato, resta solo da preparare il modello XSL.
    style.xsl

    Esempio XSLT

    Messaggio

    Cosa abbiamo ottenuto?

    Prima di tutto, puoi affrontare progetti complessi in modo più audace: è garantita la reale indipendenza dei moduli. L'ordine di impilamento dei risultati nella pagina è ora controllato da un modello XSL esterno e non dipende dall'ordine in cui i moduli vengono avviati.

    Qualsiasi modulo che genera dati XML come risultato del proprio lavoro può essere utilizzato in un progetto. A proposito, questo è uno dei vantaggi rispetto ai motori modello, in cui la creazione dei dati consiste nella sequenza di metodi di chiamata (assegnazione, ecc.) Di un particolare motore, che non hanno uno standard comune.

    Un altro vantaggio è la facilità di debug. Se esegui lo script, noterai che ogni pagina ha un output di debug, un prototipo XML che semplifica notevolmente il debug delle applicazioni.

    Un'altra cosa a cui pensare è come creare oggetti messaggio. Non è sempre conveniente usare new direttamente nel codice client. Ma, forse, questo è un argomento per un articolo a parte.

    Infine, una galoppata sulle prospettive:

    * finestre pop-up per un elenco di messaggi importanti
    * "Pagine mittente" e "Pagine di destinazione" nei messaggi
    * registrazione dei messaggi nel database
    * pulsante "mostra la cronologia delle mie azioni"
    * analisi statistica delle azioni dell'utente all'interno delle sessioni
    * "assistenti intelligenti" nelle applicazioni web

    nella mia applicazione zend scrivo alcune API per applicazioni mobili. Per semplificare le cose agli sviluppatori di dispositivi mobili, utilizzo Swagger. Finora funziona tutto bene, tranne una richiesta GET.

    Quando chiamo /user/messages/(sessionToken)? NumMessages = (numMessages) & pageNr = (pageNr) nel browser, ottengo i risultati desiderati, ma quando provo a consentire a Swagger di effettuare questa richiesta, viene passato solo il sessionToken. Ho provato queste annotazioni per Swagger:

    /** * @SWG\Api(path="/user/messages/(sessionToken)?numMessages=(numMessages)&pageNr=(pageNr)", * @SWG\Operation(* method="GET", * summary=" Ottiene i messaggi di paging", * notes="", * type="string", * nickname="getUsermessagesPaged", * permissions=(), * @SWG\Parameter(* name="sessionToken", * description="Il token da una sessione utente attiva", * required=true, * type="string", * paramType="path", * allowMultiple=true *), * @SWG\Parameter(* name="numMessages", * description=" numero di messaggi sulla pagina (numMessages e pageNr vengono ignorati se non sono impostati entrambi)", * required=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\Parameter (* name="pageNr", * description="pagenumber (numMessages e pageNr vengono ignorati se non sono impostati entrambi)", * required=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\ResponseMessage(code=200, message="json (messages => "user_messages")"), * @SWG\ResponseMessage(code=400, message="json con errore "non connesso"" ) *) *) */

    Qualcuno vede il mio errore?

    Qualsiasi aiuto è benvenuto.

    Cordiali saluti

    Aggiornamento. Come suggerito, ho cambiato entrambi i paramTypes in "query" e ho cambiato il percorso:

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

    ma non ha lavorato come combattente.

    xdebug in Eclipse PDT mostra:

    RequestURI => /ias/public/user/messages/(sessionToken)

    QueryParams => Zend\\Stdlib\\Parameters - *ArrayObject*storage => Array - =>

    json spavalderia:

    ( "apiVersion": "1.0.0", "swaggerVersion": "1.2", "apis": [ ( "path": "\/user", "description": "Operazioni sugli utenti" ) ], "info" : ( "title": "API di accesso mobile", "description": "Questa è l'API di accesso mobile xxx.", "termsOfServiceUrl": null, "contact": "xxx", "license": null, "licenseUrl" : null, "_partialId": null, "_partials": , "_context": ( "comment": "\/**\ * @SWG\\Info(\ * title="Mobile access api",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ *)\ *\/", "line": 3 } } } !}

    Ecco l'output di /user:

    ( "basePath": "http://localhost/ias/public", "swaggerVersion": "1.2", "apiVersion": "1.0.0", "resourcePath": "/user", "apis": [ ( "path": "/user/balance/(sessionToken)", "operations": [ ( "method": "GET", "summary": "Ottiene userbalance", "nickname": "getUserdata", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Il token di una sessione utente attiva" ) ], "responseMessages": [ ( "code": 200, "message": "json (balance => "user_balance")" ), ( "code": 400, "message ": "json con errore "non connesso"" ) ], "note": "", "autorizzazioni": () ) ] ), ( "percorso": "/utente/login", "operazioni": [ ( "method": "POST", "summary": "Registra user dentro system", "nickname": "loginUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "email", "type": "string", " required": true, "allowMultiple": false, "description": "L'indirizzo email dell'utente per l'accesso" ), ( "paramType": "form", "name": "password", "type": "string", " required": true, "allowMultiple": false, "description": "La password per l'accesso in chiaro" ) ], "responseMessages": [ ("code": 200, "message": "json with session_id, user_id, user_balance" ), ( "code": 400, "message": "json con errore "nessun utente con email e password fornite"" ), ( "code": 400, "message": "json con errore "input non valido" " ), ( "code": 400, "message": "json with error "no post request"" ) ], "notes": "", "authorizations": () ) ] ), ( "path": " /user/logout", "operations": [ ( "method": "POST", "summary": "Logs user out", "nickname": "logoutUser", "type": "string", "parameters": [( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Il token di una sessione utente attiva " ) ], "responseMessages": [ ( "code": 200, "message": "json (result => "deleted")" ), ( "code": 400, "message": "json con errore "no user_session con dato sid"" ), ( "code": 400, "message": "json con errore "input non valido"" ), ( "code": 400, "message": "json con errore "no post request" " ) ], "note": "", "autorizzazioni": () ) ] ), ( "percorso": "/utente/messaggi/(sessionToken)", "operazioni": [ ( "metodo": "GET" , "summary": "Ottiene nuovi messaggi", "nickname": "getUsermessages", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", " type": "string", "required": true, "allowMultiple": false, "description": "Il token di una sessione utente attiva" ) ], "responseMessages": [ ( "code": 200, "message" : "json (messages => "user_messages")" ), ( "code": 400, "message": "json con errore "non connesso"" ) ], "notes": "", "autorizzazioni": ( ) ), ( "method": "GET", "summary": "Ottiene i messaggi impaginati", "nickname": "getUsermessagesPaged", "type": "string", "parameters": [ ( "paramType": "path ", "name": "sessionToken", "type": "string", "required": true, "description": "Il token di una sessione utente attiva" ), ( "paramType": "query", "name ": "numMessages", "type": "string", "required": true, "description": "numero di messaggi sulla pagina (numMessages e pageNr vengono ignorati se non sono impostati entrambi)" ), ( "paramType": "query", "name": "pageNr", "type": "string", "required": true, "description": "pagenumber (numMessages e pageNr vengono ignorati se non sono impostati entrambi)" ) ], "responseMessages ": [ ("code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400, "message": "json con errore "non connesso"" ) ] , "notes": "", "autorizzazioni": () ) ] ), ( "path": "/user/userdata", "operazioni": [ ( "method": "POST", "summary": "Post userdata", "nickname": "postUserdata", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", " required": true, "allowMultiple": false, "description": "Il token di una sessione utente attiva" ), ( "paramType": "form", "name": "password", "type": "string" , "required": false, "allowMultiple": false, "description": "nuova password" ), ( "paramType": "form", "name": "address", "type": "string", "required ": false, "allowMultiple": false, "description": "nuovo indirizzo" ), ( "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 con errore "non connesso"" ) ], "notes": "", "autorizzazioni": () ) ] ), ( "path": "/user/userdata/(sessionToken)", "operazioni": [ ( "method": "GET", "summary": "Gets userdata", "nickname": "getUserdata", "type": "string", "parameters": [ ( "paramType": "path", "name ": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Il token di una sessione utente attiva" ) ], "responseMessages": [ ( "code ": 200, "message": "json (user => "userdata", user_limit => "userLimits")" ), ( "code": 400, "message": "json con errore "non connesso"" ) ], "note": "", "autorizzazioni": () ) ] ) ], "produce": [ "application/json" ] )

    Sembra essere un bug che il mio swagger-ui non stia inviando alcun parametro di richiesta? Ecco un esempio con un parametro query, sessionToken: (controllato da 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=imposta Connessione: keep-alive

    La risposta è stata:

    HTTP/1.1 400 Data richiesta errata: mar, 25 nov 2014 14:58:20 GMT Server: Apache/2.4.9 (Win32) PHP/5.5.12 X-Powered-By: PHP/5.5.12 Lunghezza contenuto: 25 Connessione: chiudi Content-Type: application/json; set di caratteri=utf-8

    La risposta era corretta perché non è stato passato alcun sessionToken.

    Questo ha bisogno di lavoro, ma non viene da swagger-ui:

    GET /ias/public/user/balance?sessionToken=HTTP/1.1 Host: localhost Agente utente: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Accetta: 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=imposta Connessione: keep-alive

    Alla fine ho capito: non c'è nessuno migliore di una moglie. Resta solo da trovare una moglie

    PHP AJAX CRUD: crea, elimina, modifica i record nel database MySQL

    In questo articolo impareremo come aggiungere, modificare ed eliminare i record in un database MySQL utilizzando PHP. Abbiamo utilizzato un gestore jQuery che invia una richiesta AJAX a uno script del server. Il gestore aggiorna l'elenco delle voci.

    Modulo AJAX per l'invio di richieste di creazione, cancellazione, modifica

    Quando si aggiunge un record, il modulo viene inviato dati PHP script tramite richiesta AJAX. In caso di aggiunta riuscita, l'elenco delle voci viene ricaricato.

    jQuery Funzioni AJAX per interrogare database CRUD

    Nella funzione jQuery AJAX, abbiamo un interruttore per aggiungere, modificare e rimuovere i casi. Questi casi generano stringhe di query e dati di risposta diversi a seconda delle azioni del database.

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

    Script PHP per operazioni CRUD

    Il codice seguente esegue le query del database. Questo script PHP, dopo aver eseguito un'azione CRUD, aggiorna i record come risultato della risposta AJAX.

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