Ciao,
premetto che il codice che sto scrivendo in parte funziona, ma ci sono degli aspetti che mi sfuggono e che non riesco a risolvere al momento, mi spiego meglio: avete presente phpmyadmin nella funzionalità "mostra" che crea di fatto una tabella in cui in ogni riga ci sono le celle che mostrano il contenuto del database, e che quando vi cliccate su ( doppio click ) apre un box di editing? Ebbene devo rifare la stessa cosa!
A parole è facile... mi sono andato a guardare il codice di phpmyadmin e ho visto che per realizzare la cosa, mette in fondo alla tabella un <div> con classe cEdit che si apre e mostra il contenuto della cella cliccata dentro una texarea.
All'inizio avevo pensato di realizzare un box dentro ogni cella della tabella, la cosa funziona, ma crea ovviamente un file html gigantesco, anche perché nella pagina ci sono molte altre cose, e la tabella in se può essere anche molto grande ( paginazione? Sì be dopo! ) in ogni caso è impensabile fare così almeno per un motivo.
Dato che devo comunque identificare la cella, il box che si apre e la textarea interna che riporta il contenuto della cella da modificare, ho bisogno per ogni cella della tabella di un certo numero di id e questo porta inevitabilmente ad un uso eccessivo della memoria.
In pratica faccio una cosa del genere:
Ovviamente le celle sono più di una per riga, ovviamente vengono create dinamicamente lato server, il numero 12 che identifica ogni elemento è arbitrario, è l'indice del loop in php che crea il tutto.codice HTML:<td class="click" id="url-12" > Questo il contenuto della cella <div style="display:none" id="pannello-url-12"> <textarea class="form-control" id="id-url-12">Questo il contenuto della cella</textarea> <p class="btn-group btn-group-sm" role="group"> <button type="button" class="btn btn-default" name="annulla-url-12">Annulla</button> <button type="button" class="btn btn-danger" name="salva-url-12">Salva</button> </p> </div> </td>
Questo sistema funziona pure ma come dicevo prima crea un problema che può causare molti altri problemi, oltre alla dimensione del file html generato, può creare problemi di memoria su sistemi non modernissimi.
Così mi sono andato a guardare come fa chi lo fa gia da anni, cioè phpmyadmin appunto e ho scoperto che non crea affatto un sistema di box per ogni cella, ma uno solo alla fine della tabella, che poi immagino sposti sopra la tabella cliccata a simulare visivamente per l'utente la posizione.
Vorrei fare la stessa cosa, e penso che la strada sia quella di gestire la posizione del mouse quando si fa doppio click sulla cella, in modo da sapere su quale cella si è fatto il doppio click e quindi posizionare il box di editing su quella cella.
Ma questo mi crea un altro problema: monitorare la posizione del mouse è facile, difficile è sapere sopra quale cella si trova, dovrei forse creare un elenco di posizioni ( x, y ) per ogni cella?
Ho notato che phpmyadmin mette nel box cEdit uno style con le posizioni top e left molto precide:
A seconda di dove si fa click cambia la posizione del box che si posiziona sulla giusta cella; ovvio che il sistema monitorizza la posizione del mouse e gestisce il posizionamento del box in funzione di questo, ma come?codice HTML:--- Le celle sono identificate così: <td class="data grid_edit click2 not_null " data-type="string" data-decimals="0"><span>http://armorgames.com/</span></td> --- in pratica non sono affatto identificate ----- Questo il campo di editing <div class="cEdit" style="display: none; top: 719.533px; left: 800.8px;"> ---- oppure <div class="cEdit" style="display: block; top: 660.667px; left: 1117.4px;">
Non sono riuscito a trovare all'interno di ogni file uno script js che riporti posizioni delle celle come si faceva con gli sprite per scoprire le collisioni nei videogames, insomma non so come faccia e l'altra unica alternativa che mi viene in mente a questo punto è aprire il box al centro dello schermo indipendentemente dalla posizione di ogni cella dove si clicca.
Bene! Dopo questa lunga chiacchierata ( un monologo ) avete qualche idea da mostrarmi?
Grazie.![]()