[Risolto] Problema Ajax Dopo Delete

Ciao ragazzi,

sono alle prese con “delete” e l’ajax che ne sussegue…

mi spiego meglio:

sò qual’è il giro che fà il delete, cancellando il model selezionato e tornando alla pagina senza ricaricarla appunto,

ma il mio dubbio è un altro, ovvero, anche dopo aver letto questo wiki il flusso è stato confermato.

ma per ovvi motivi l’esempio del wiki riporta in ajax una semplice stringa del tipo “Cancellazione effettuate correttamente” etc etc…ma se io dovessi ritornare un’intera pagina, o vista per l’appunto ceh è necessario stampare dentro un div della pagina madre, qual’è il modo migliore per farlo?

…io dalla mia ho praticamente preso l’html della view desiderata l’ho popolata tramite php e poi “printata” in modo da farla catturare…

per dirla tutta all’interno della mia vista ci sono due “pulsanti” che attivano la chiamata ajax che poi riprinta la stessa view…e sono

[list=1][]il delete standard di Yii[]un pulsante che associa l’utente alla pratica in esame[/list]ora il problemone è che se associo l’utente tutto è ok, ma se poi vado subito dopo l’operazione a cancellarne uno magari associato precedentemente torna blank e non visualizza niente…(ma se refresho la pagina e cancello tutto funziona)

domanda:

[list=1][]è possibile, in fase di settaggio dell’attributo “update” delle opzioni ajax “url-decodificare” il data di ritorno?[es. ‘update’=>‘js:urldecode(data)’] ?[]possibile che essendoci due eventi nella stessa view che a fine “lavoro” comunque riportano lo stesso html ma aggiornato, portino problemi che richiedano l’uso di moetodi tipo “live” o “on” di jQuery?[/list]

grazie in anticipo, scusate la lunghezza ma volevo spiegare la cosa, spero di esermi fatto capire.

ps, vi posto l’immagine che spiega com’è divisa la vista che associa l’utente alla pratica e volendo ne toglie altri tramite l’elenco… https://docs.google…MjZKejllSVUzZ0E

Io non ci ho capito niente.

allora,

la pagina contiene una vista “pratica.php” al suo interno c’è un tab che raccoglie la vista “esecutori.php”.

gli esecutori sono utenti che possono essere associati alla pratica.

quindi il tab "ESECUTORI" conterrà la lista degli esecutori già associati alla pratica e la possibilità di associarne altri.

come si vede dall’immagine

ora, sia la cancellazione che l’associazione avviene in ajax.

quindi cancellando un untete dalla lista non ci sono problemi perchè Yii si prende cura di tutto e ricarica la vista.

mentre per avere lo stesso risultato con l’associazione(insert e ricaricamento in ajax) ho scritto un ajaxButton così:


			<legend>Aggiungi esecutore alla verifica</legend>

			<span id="select_esecutore_container">

				<?php 

				print CHtml::dropDownList( 

					'select_esecutore', null,

					Esecutori::getListaEsecutori($model->sequ_idverifica),

					array('id'=>'select_esecutore'));

				?>

			</span>

			<?php	

			print "&nbsp;";

			//*** ASSOCIA ESECUTORE Ajax

			print CHtml::ajaxButton(

				'Associa esecutore',

				Yii::app()->createUrl("verifiche/associaEsecutoreVerifica"),

				array(

					'success'=>'function(data){

							$(\'#esecutori_tab\').html(

							decodeURIComponent((data+\'\').replace(/\\+/g, \'%20\')));

						}',

					'type'=>'POST',

					'data'=>array(

						'associa_esecutore'=>'js:$(\'#select_esecutore\').val()',

						'id_verifica'=>$model->sequ_idverifica),

				)

			);

			?>

se ci fate caso sull’attributo “success” di ajax nel pulsante c’è “function(data)…”, data in questo caso è praticamente un HTML url-encoded…della stessa vista “esecutori.php” (di fatto la riaggiorna con i nuovi dati) infatti lo decodifico.

Il problema è che una volta “associato” un nuovo utente, lui lo aggiunge e riprinta la vista correttamente, solo che se poi cancello un utente dall’elenco torna blank.

quindi: come è possibile gestire due eventi ajax nella stessa vista?

grazie.

Devi scusarmi ma continuo a non capire. Cosa intendi con “se poi cancello un utente dall’elenco torna blank”. Cosa torna blank, e dove?

Sarebbe molto semplice dire:

  • cosa voglio fare;

  • cosa mi aspettavo;

  • cosa invece ho ottenuto;

Se non fai questa distinzione, continui a focalizzarti su qualche soluzione esotica senza capire davvero quale sia il problema.

Ok, capisco che ho messo troppa carne sul fuoco, e ti ringrazio di seguire questo post…

faccio un passo indietro,

ti rispondo punto per punto:

  • cosa voglio fare: creare una vista che presenti due cose,

[indent][list=1][]una lista di utenti[]la possibilità di aggiungerne altri [/list][/indent]

  • cosa mi aspettavo: mi aspettavo che fosse possibile creare entrambi i flussi (cancellazione e associazione degli utenti) utilizzando ajax

  • cosa invece ho ottenuto: ho ottenuto una pagina che non riesce a far coesistere entrambe i flussi ajax.

domanda: come è possibile creare una pagina che possa ospitare due eventi ajax?

i due eventi ajax sono la cancellazione degli utenti, presente ad ogni riga della tabella della lista degli utenti, e poi l’associazione dell’utente tramite un “ajaxButton”.

Spero di essermi spiegato stavolta,

comunque Grazie ancora!

Ciao,

firebug cosa ti dice? tutto normale o evidenzia errori/avvisi etc?

Provo a spiegarmi meglio: ogni tanto arrivano persone poco avvezze al gergo informatico che ci dicono "il pc non funziona". Ovviamente noi non capiamo. Io in questo momento non sto capendo. Non ho informazioni per farlo.

L’unica cosa che posso intuire, è che tu abbia una vista che modifichi con due eventi ajax. Questa vista, però, viene modificata via ajax e quando si scatena un evento, le modifiche dell’altro vengono perse. Per risolvere la cosa, devo fare in modo che la vista si costruisca sempre indipendentemente da quale sia l’evento ajax scatenato.

prova ad utilizzare nel success:

$.fn.yiiGridView.update("id-tua-cgridview");

oppure la soluzione più semplice è far ricaricare la pagina con window.location.reload().

grazie ragazzi,

alla fine il problema, è al 90% dovuto al fatto che il mio “ajaxButton” và a sostituire completamente l’html della vista compromettendo evidentemente qualche elemento, o comunque cambiando dinamicamente i riferimenti degli elementi del DOM.

comunque ho “risolto” lasciando soltanto il delete come evento ajax, mentre l’altro evento l’ho trasformato in un semplice link con i parametri in get.

cmq ora proverò le vostre idee e nel caso vi farò sapere.

Ciao Markux,

effettivamente la tua soluzione funziona!


$.fn.yiiGridView.update("esecutori_grid")

ma siccome l’update presuppone che ci sia già presente nella pagina la griglia da aggiornare,

io potenzialmente ho delle pratiche in cui non ci sono utenti associati:




if(<ci sono utenti>){

...stampa la grid...

}else{

'non ci sono utenti associati'

}



quindi l’update funziona per le griglie già presenti, ma purtroppo io non sempre ce le ho…

Scusate il doppio post,

cmq ho provato a sviluppare anche l’altro consiglio, quello de reload(),

alla fine ho optato proprio per quest’ultimo, e tutto funziona.

ecco di nuovo il mio ajaxButton che nel success fà un rerfresh della pagina:


                    	//*** ASSOCIA ESECUTORE Ajax

                    	print CHtml::ajaxButton(

                            	'Associa esecutore',

                            	Yii::app()->createUrl("verifiche/associaEsecutoreVerifica"),

                            	array(

                                    	'success'=>'function(){

	                                			window.location.hash = \'#esecutori_tab\';

	                                			window.location.reload(true);

                                    		}',

                                    	'type'=>'POST',

                                    	'data'=>array(

                                            	'id_esecutore'=>'js:$(\'#select_esecutore\').val()',

                                            	'id_verifica'=>$model->sequ_idverifica),

                            	)

                    	);



l’unico accorgimento che ho inserito è l’aggiunta dell’attributo “hash” dell’oggetto “Location” per far sì che refreshando la pagina mi si posizioni nel tab desiderato, vedi qui per specifiche sull’oggetto location.

…comunque Grazie a tutti, :rolleyes:

ciao!