• User

    Ordinamento manuale voci menu

    Ciao a tutti,

    ho un menu (con relativi sottomenu e sotto-sotto menu) in cui dovrei integrare uno script per ordinare i menu, i sottomenu oppure i sotto-sotto menu secondo l'ordine prestabilito manualmente dall'utente, un pò come avviene con Joomla.

    La mia tabella del DB si compone dei seguenti campi:
    ID - NOME - MACROCATEGORIA - CATEGORIA - LINK - ORDINE

    Più di tutto mi interessa capire come fare quando dal pannello d'amministrazione l'utente inserisce una voce con Ordine = 1 (ed è presupponibile che ci sia già un'altra voce precedentemente inserita con valore 1) e lo script deve essere in grado di scalare automaticamente le voci precedentemente inserite e "ricalcolare" il numero dell'ordine, in modo da non avere una numerazione con doppioni.

    Per quanto riguarda la SELECT che andrà ad estrarre i record dal database secondo l'ordinamento, non ho problemi.

    Grazie a tutti.


  • User Newbie

    Carino come problema...

    Ideuzza: Prendere l'ordine delle categorie sul $_POST, ordinarli per ordine dato dall'utente (i due elementi con numero uguale verranno messi vicini). A questo punto fai un foreach e inserisci gli id delle categorie ordinate in un nuovo array in modo tale da avere gli indici univoci.

    Provo a spiegarmi in codice 😄

    [php]
    /* supponiamo che i dati in post arrivino nell'array $_POST['cat_1'] = 1;
    con come chiave la categoria con l'id e come valore la posizione specificata.
    */
    asort($_POST, SORT_NUMERIC);
    foreach ($_POST as $cat => $ord) {
    $Order[] = $cat;
    }
    //a questo punto hai la variabile $Order con gli indici numerici univoci crescenti e come valore l'id della categoria passato nel form.
    [/php]

    Spero di averne pensata una giusta... e non sono sicuro funzioni 😛


  • User

    In questi casi puoi usare un altro approccio, quello di togliere all'utente la possibilità di inserire un numero e farlo muovere solo con le classiche freccie (sposta su, sposta giu).
    Vantaggio = cosi ti togli di mezzo la gestione di numeri uguali.
    Svantaggio = se hai tanti record e l'utente vuole spostare il 90esimo in prima posizione, deve eseguire 90 operazioni..
    Variante: puoi usare librerie javascript come script.aculo.us che gestiscono a meraviglia il drag/drop per cui l'utente sposta una cella quante posizioni vuole, in un colpo solo. Se poi ci combini un po di Ajax, lo show è servito (quando ho usato questa soluzione i clienti non vedevano l'ora di giocare con il pannello :D)

    Secondo approccio: l'utente anzichè scrivere valori progressivi (1,2,3,ecc) inserisce range.
    Per cui il primo valore sarà 1, il secondo 10, il terzo 20 e via dicendo.. cosi se dovra spostare il quinto record in seconda posizione, gli basterà dargli valore 9 e nel db dovrai limitarti ad aggiornare 1 solo dato.
    Soluzione "spiccia", con ovvi limiti (se all'area accede un admin va bene, ma se è un'area riservata agli utenti del sito hai voglia a spiegare la cosa.. e poi se sposta 1 record al giorno, a fine mese rischi di trovarti i range completi)


  • User

    Innanzitutto vi ringrazio per le pronte risposte.

    Per quanto riguarda la soluzione proposta da Takeno devo ancora testarla, per quanto propone infocurci la cosa è interessante, soprattutto per quanto riguarda il discorso del drag'n'drop di scriptacolous che ho già testato.
    Effettivamente è graficamente accattivante e molto usabile, tuttavia il mio problema che non sono riuscito ancora a superare è "dire" la differenza di ordinamento tra le Macrocategorie, le Categorie e le relative Sottocategorie.
    Perchè per quanto ho provato io (e la cosa è sicuramente migliorabile), il drag'n'drop non mi impedisce di spostare una Categoria prima di una Macrocategoria.

    Insomma, la cosa creerebbe un pò di possibile confusione.