CallBack DB
Per richieste di aiuto NON POSTATE QUI ma utilizzate i forum appositi nella sezione Supporto ed Aiuto.
Taggato: cancellazione, database, row, topic-237, topic-243
- Questo topic ha 11 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 12 anni, 1 mese fa da kolmogorov.
- AutorePost
- 3 Febbraio 2012 alle 09:03 #1669BlacksheepPartecipante
Salve a tutti e complimenti per il sito/forum,
mi sto avvicinando a jquery in questo periodo, sto facendo sia tutoria che leggendo dei testi, la mia domanda è la seguente:Vorrei creare uno script, che al momento allo scatenare di un submit, mi cancella una riga di Database, e “a lavoro” compiuto mi da un feedback, in modo tale da poter fare una seconda query che mi restituisce la tabella aggiornata.adesso ho fatto un’azione associata a un submit, che mi carica una pagina dove dentro c’e la query, la row viene cancellata, ma vorrei sapere quando, ovvero avere un calback di lavoro completato, anche perché se poi continuo a cliccare, la chiamata va a buon fine ma ovviamente la row non esiste più. Adesso ho fatto questo script(banale)$(document).ready(function(){$(‘:submit’).click(function(){$(‘#gallery’).load(‘testAjax #container’);});});Volevo sapere se per fare quello che ho in mente devo utilizzare $.ajax(), perché non mi è chiaro quando utilizzarlo.spero di essere stato chiaroGrazie4 Febbraio 2012 alle 00:54 #2001kolmogorovPartecipanteSalve Black,
la funzionalità che desideri implementare è molto comune. Le modalità per realizzare quello che cerchi sono svariate, ma sono accomunate dall’azione di una chiamata Ajax che appunto richiama una risorsa server-side (ad esempio la tua pagina php o qualunque cosa sia) che esegue delle operazioni di business, come, appunto, un’operazione su database. Ti consiglio di utilizzare la funzione ajax di jquery, che ti dà un’ampia scelta nei metodi da utilizzare per poter gestire la chiamata. All’interno del metodo success di $.ajax inserisci tutto il codice che ti serve per gestire la risposta che ti viene data dalla risorsa server-side che vai a chiamare. Ti consiglio di restituire almeno come messaggio di “feedback”, come da te nominato, dei dati in formato json, andando a settare il content-type della risorsa server-side e restituendo in output dei dati in json (dando la proprietà dataType:’json’ in $.ajax) , ad esempio un banale: {result: true } o {result: false}, ed andando a controllare nella funzione success la risposta:
success: function( data ) {
if (data.result == true ){
// allora fai una chiamata successiva per riavere i dati della tabella.
}
…
Comunque fossi in te, io eviterei di fare una seconda chiamata ajax una volta terminata con successo la prima chiamata, per ottenere i dati della tabella. Piuttosto incapsulerei all’interno del json che ti dà il risultato con successo, un ulteriore proprietà che è un array che contiene tutte le righe della tabella, del tipo: {result: true, table: [{ riga1}, {riga2}, …]}
Ovviamente questo è uno dei tanti modi… uno potrebbe anche dirti che non c’è bisogno di restituire il campo result e restituire un json con la proprietà table come array vuoto o pieno in caso di insuccesso o successo, ma sono ovviamente scelte che devi fare tu. Il concetto che devi comunque applicare, astraendo dai dettagli è che puoi gestire il tutto con $.ajax usando il metodo success ( ed anche error per gestire errori lato server).4 Febbraio 2012 alle 10:15 #2002BlacksheepPartecipantegrazie mille per la risposta, sei stato molto esauriente. quello che ho fatto io è stato questo:
l’obbiettivo era appunto eliminare un utente da una tabella ( una riga da una row)con un click di un pulsante ho richiamato il metodo loda, ch e chiama una pagina e fa una query al database e mi restituisce a video tutti l’utenti, ognuno con il proprio idcliccando su un utente chiamo un metodo ajax, e gli passo come parametro l’id, che viene poi preso in gestione da data con data:{id_utente : id } (forse qui potrei usare JSon? l’url che chiama ajax è un azione che mi fa la query al db, e mi elimina l’utente in base all’id che recuper con $_GET. al Complete dell’operazione richiamo l’azione che chiamo all’inizio con il pulsante proprio per rimostrarmi la lista aggiornata.Questo è quello che ho fatto e funziona, i miei dubbi sono appunti, il passaggio dei parametri, se è ok, oppure meglio usare json, se quando faccio l’azione associata al complete di Ajax, ha veramente concluso l’operazione ( cioè ha finito di eliminare la row?) e un altro dubbio che mi è venuto e più che altro non ho capito, che cosa è il parametro contextGrazie ancora, alcune domande possono essere banali, ma proprio da quelle che capisco4 Febbraio 2012 alle 12:03 #2003kolmogorovPartecipanteSalve, allora ti rispondo innanzitutto riguardo al context: se tu usi $(this)… all’interno del metodo success di $.ajax, allora farai riferimento ad un oggetto che è un oggetto di setting di ajax, per cui il this è quest’oggetto. Se tu invece indichi come context: this allora dentro il success, se fai: $(this) allora ti riferirai all’elemento che ha scatenato la chiamata $.ajax, ad esempio l’elemento DOM con la crocetta a cui hai associato un handler per l’evento click(..
se scrivi context: document.body, allora il $(this) usato dentro il success ti permette di accedere al body del documento. In definitiva settare il context ti permette di usare il this dentro success per accedere al DOM ed evitare di usare $(“selettore”) per accedere al dom, diciamo che è un modo più elegante, usi il $(this) invece che altro. Per quanto riguarda il complete del load e sapere se la row è stata cancellata o meno, la risorsa lato server potrebbe essere interrogata con successo e quindi viene chiamato il metodo success di $.ajax,però magari in realtà la riga non è stata cancellata nel database… Come fare? Ebbene, nella risposta che dà la risorsa lato server dopo la cancellazione, puoi includere un oggetto in json in cui indichi se la riga è stata cancellata o meno, ovvero setti a true ( o 1) se la delete sul db è avvenuta con successo. Poi dentro il success ti controlli questo json e se è ok ( con un if) , allora fai scattare la load, altrimenti visualizzi un alert di errore. Se hai problemi ad usare json puoi usare, male che vada un dataType: “text” ( o anche senza indicare dataType esplicitamente), ma fai dare sempre una risposta, ovvero una stringa dalla risorsa lato server che ti avvisa se la delete è avvenuta con successo o meno, e nel success controlli sempri questa stringa (sempre con un if). Se usi json fai una ajax con una post e dataType json (per istruire $.ajax che attendi una risposta in json). I dati che la risorsa lato server ti dà (sia che tu stia lavorando con json o con text), te li prendi usando il primo parametro di success, ovvero data:
success(data, textStatus, jqXHR){…4 Febbraio 2012 alle 12:23 #2004BlacksheepPartecipanteNon ho proprio ben capito.
Questo è la mia chiamata ajaxquando entro nel Complete, ha veramente cancellato? ovvero è andato a buon fine? dovrei aggiunger error, per gestire l’errore…non ho capito dove metteresti Json.grazie4 Febbraio 2012 alle 14:42 #2005kolmogorovPartecipanteVedendo il tuo codice, puoi gestire tutto con le callback success ed error, evitando di usare la complete di $.ajax. Se gestisci tutto in json e la tua risorsa lato server restituisce un json in questo formato: {result: true } o {result: false} allora usa una soluzione tipo questa:
http://pastebin.com/kSKD906C
Se invece eviti il json e lato server restituisci un testo “ok” se la cancellazione è filata liscia e “no” se andata male, allora puoi fare una cosa del genere:
http://pastebin.com/0GirQmSt6 Febbraio 2012 alle 15:26 #2006BlacksheepPartecipantegrazie ancora per la risposta, ho visto il codice che mi hai suggerito, quello che ancora non mi è chiaro (si sono duro) è dove impost
if(data.result === true)quando usare success e quando completese non erro, success è quando Tutto fila lisciomentre complete viene chiamata anche se intoppo in erroriGrazie ancora6 Febbraio 2012 alle 20:24 #2007kolmogorovPartecipanteCiao. Il controllo con l’if, lo metti dentro il metodo success, così come l’ho inserito nel codice su pastebin. Il metodo error viene chiamato in caso di errori gravi (es.: errori nel webserver). Il complete viene chiamato sia in caso di errore lato server (es.: errore nel webserver), sia nel caso in cui fili tutto liscio. Ma fossi in te per avere il tutto più leggibile utilizzerei l’error per gestire eventuali problemi lato server ed il success per gestire la risposta che il server ti dà se cancella con successo la riga ( il json che il server invia è {result: true })o se prova a cancellare la riga ma non ci riesce ( il server ti invia il json {result: false}). Il codice che ti ho scritto in pastebin è già pronto per l’uso. Fammi sapere.
7 Febbraio 2012 alle 10:47 #2008BlacksheepPartecipanteCiao, e rieccomi
ho fatto delle modifiche, la lista adesso la prendo subito, mentre l’obbiettivo di cancellare il record resta ovviamenteil codice è questo http://pastebin.com/izTZdRQkcalcola che ho moti Box, e all’interno di questi box ho un tasto che cancella il box inerente.ho creato la variabile box_selezionato, altrimenti dentro mi perdeva il riferimento, credo sia il famoso ambito. hai un’altra soluzione più elegante?per quanto riguarda il json, non mi entra nell’if, e se faccio un alert di data.result non mi mostra nessun alert.Grazie ancorasenza json tutto funziona9 Febbraio 2012 alle 12:59 #2009kolmogorovPartecipanteCiao, a mio avviso al click sull’elemento html che cancella l’utente, farei scattare la chiamata ajax per la cancellazione. Adesso, senza vedere il tuo html, potrei dirti che io metterei l’id dell’utente da cancellare da qualche parte, uno dei modi è quello ad esempio di metterlo in un input text nascosto a fianco del bottoncino in cui clicchi per cancellare l’utente ed prenderlo attraverso il traversing, ( o un metodo più elegante è quello si associare l’id al DOM del bottoncino cliccato usando la funzione .data di jquery, ma è un pò più complesso da fare..) Ad esempio una cosa del genere:$(‘.box_pagina’).prev(“.classe_input_hidden_con_id”).val();ti permette di avere l’id della riga da cancellare una volta che hai cliccato sul bottone che ha classe css di nome: box_pagina.Cosa ne pensi di una soluzione di questo genere?
http://pastebin.com/TC4Gmz4v
Controlla che il server restituisca un
content-type:application/json<br> quando risponde con il json. Se l'alert con cui hai provato non viene eseguito,vuol dire che non entri dentro il success. Controlla con firebug il content-type della risposta. <br>
- AutorePost
- Devi essere connesso per rispondere a questo topic.