Salve a tutti.
Premetto che non sono un esperto di javascript.
Per la gestione di un menu (dinamico) sto cercando di realizzare uno script per che permetta di spostare (drag & drop) degli elementi di una lista annidata (con infiniti livelli teorici).
Una volta spostati i vari elementi deve essere possibile serializzare i dati del menù, in particolare:
id della voce
ordine della voce
id_padre della voce
Questi dati serializzati vengono successivamente passati ad uno script PHP che si occupa di aggiornare la struttura del menu salvandola sul DB.
Ho trovato su internet due script già pronti.
Il primo permette di spostare in modo corretto tutti gli elementi della lista.
Il secondo è un'implementazione basata sul primo script che aggiunge la possibilità di serializzare i dati.
Il problema è che nel secondo script per introdurre la serializzazione è stato creato un piccolo bug nel sistema di drag & drop.
Vi posto il link con una demo del secondo script e vi spiego come riprodurre il bug:
http://jquerystuff.net/random/nested-sortable/
per riprodurre il bug:
Spostare "Item 12" e renderlo sotto-elemento di "Item 11". (fin qui tutto ok)
Ora provate a spostare "Item 10" sotto "Item 11" rendendolo un sotto-elemento (il problema è proprio che non dovreste riuscirci).
Posto anche un'immagine esplicativa:
Nel primo script (quello senza serializzazione) il problema non si verifica.
Vi metto anche il link del primo script per chi volesse verificare:
http://www.gimiti.com/kltan/demo/jTree/
Confrontando i due script sono riuscito a trovare la parte di codice che crea problemi:
La differenza è ben visibile nelle due righe commentate.Codice PHP:/*Codice funzionante del primo script */
else if (e.pageX > off.left + opts.childOff) {
$(".jTreePlacement").remove();
if ($(this).find("ul").length == 0)
$(this).append('<ul>'+str+'[/list]');
else
$(this).find("ul").prepend(str);
}
*/
/* codice con serializzazione che crea problemi */
else if (e.pageX > off.left + opts.childOff) {
$(".jTreePlacement").remove();
if ($(this).find("ul").length == 0){
var newVal = $(this).prev("li").next("li").attr("id").split("item_"); // new line
$(this).append('<ul id="parent-'+newVal[1]+'">'+str+'[/list]'); // amended code
}else{
$(this).find("ul").prepend(str);
}
}
Il problema è che quelle due righe sono indispensabili per la serializzazione.
Eppure quell prev().next() non mi convince moltissimo :/
Qualcuno ha qualche idea su come si potrebbe risolvere?
Oppure avete in mente un modo alternativo per serializzare?
Sono consapevole di aver scritto un post lungo ma ritengo che questo script una volta sistemato possa essere utile a molti, rigrazio in anticipo chiunque darà un'occhiata al codice.
Saluti Stefano


Rispondi quotando
