Widget mobile-friendly per lookup record con ricerca AJAX e interfaccia touch-optimized per Xataface.
- ✅ Touch-optimized: Target touch 44px (iOS standard)
- ✅ Ricerca AJAX: Caricamento dinamico risultati con ricerca multi-parola (AND)
- ✅ Focus automatico: Casella ricerca attiva all'apertura elenco
- ✅ Mobile-first: Font-size 16px per evitare zoom iOS
- ✅ Responsive: Adattamento automatico mobile/tablet/desktop
- ✅ Select2: Libreria moderna e performante
- ✅ Sicurezza: Prepared statements e validazione input
- ✅ Dark mode: Supporto tema scuro (opzionale)
[_modules]
modules_mobile_lookup=modules/mobile_lookup/mobile_lookup.phpRiavvia PHP o pulisci cache Xataface per caricare il modulo.
In tables/TuaTabella/fields.ini:
[fkCliente]
widget:type=mobile_lookup
widget:table=BBGFATTClienti
widget:keycol=cod
widget:labelcol=rag
widget:placeholder="Seleziona cliente..."[fkAgente]
widget:type=mobile_lookup
widget:table=BBGFATTAgenti
widget:keycol=cod
widget:labelcol=nome
widget:searchFields=nome,cognome,codice
widget:placeholder="Cerca agente per nome o codice..."
widget:minimumInputLength=2[fkRicambio]
widget:type=mobile_lookup
widget:table=BBGRicambi
widget:keycol=id
widget:labelcol=descrizione
widget:searchFields=descrizione,codice
widget:filters[categoria]=$fkCategoria
widget:placeholder="Seleziona ricambio..."I filtri con $nomeCampo vengono risolti dinamicamente dal valore di altri campi nel form.
| Parametro | Obbligatorio | Default | Descrizione |
|---|---|---|---|
widget:table |
✅ Sì | - | Nome tabella per lookup |
widget:keycol |
No | id |
Colonna chiave primaria |
widget:labelcol |
No | nome |
Colonna etichetta visualizzata |
widget:searchFields |
No | labelcol |
Campi ricerca (comma-separated) |
widget:placeholder |
No | "Seleziona..." |
Placeholder input |
widget:minimumInputLength |
No | 0 |
Min caratteri per ricerca |
widget:preloadOptions |
No | selected |
Preload iniziale: selected | first100 | none |
widget:allscreen |
No | 0 |
Modalità fullscreen su mobile (1 = overlay a schermo intero) |
widget:filters[campo] |
No | - | Filtri fissi o dinamici ($) |
La ricerca AJAX replica la logica della lookup standard Xataface (RecordBrowser / QueryBuilder):
- La stringa digitata viene spezzata in parole (separatori: spazi)
- Ogni parola deve comparire in almeno un campo tra
widget:searchFields(OR tra campi) - Tutte le parole devono essere soddisfatte (AND tra parole)
Esempio con widget:searchFields=cod,desc_breve,descrizione,codFornitore:
| Query utente | Record tubolare 120 x 40 |
|---|---|
tubol 120 |
✅ Trovato (tubol in descrizione, 120 in descrizione) |
tubol 120 (v1.0.0) |
❌ Cercava %tubol 120% come stringa unica |
Consiglio: elencare tutti i campi utili in widget:searchFields, non solo labelcol.
Puoi sovrascrivere gli stili in css/custom.css:
/* Touch target più grande */
.select2-container--default .select2-selection--single {
height: 52px !important;
}
/* Dropdown con bordo colorato */
.xf-mobile-lookup-dropdown {
border: 2px solid #0056b3;
}- Verifica che il modulo sia attivato in
conf.ini - Controlla console browser per errori JS
- Verifica permessi
viewsulla tabella lookup
- Verifica
widget:searchFieldsincluda i campi giusti (codice, descrizione, ecc.) - Testa URL AJAX:
?-action=mobile_lookup_search&-table=NomeTabella&-search=tubol%20120&-searchFields=descrizione,cod - Controlla log PHP e permessi
viewsulla tabella target - Dalla v1.1.0 la ricerca multi-parola usa AND tra token (come lookup nativa)
- Pulisci cache browser
- Verifica che
mobile-lookup.csssia caricato (Dev Tools > Network) - Font-size input deve essere >= 16px per evitare zoom iOS
| Caratteristica | Lookup Standard | Mobile Lookup |
|---|---|---|
| Mobile-friendly | ❌ No | ✅ Sì |
| Touch targets | Piccoli | 44px iOS standard |
| Ricerca | Client-side (multi-parola) | AJAX server-side (multi-parola) |
| Focus ricerca all'apertura | Manuale | Automatico |
| Paginazione | No | Sì (30 record/pagina) |
| Zoom iOS | Sì (font <16px) | No (font 16px) |
| Responsive | Limitato | Full responsive |
| Performance | OK | Ottimizzata |
- Select2 versione: 4.1.0-rc.0 (da CDN)
- Compatibilità: Xataface 2.x, PHP 7.0+
- Database: Usa connessione nativa Xataface
df_db() - Sicurezza: Validazione parametri, sanitizzazione SQL, check permessi
- Performance grid/edit: usare
widget:preloadOptions=selected(default) ononeper evitare preload massivo di opzioni in form con molte righe
- Supporto multi-select
- Template custom per risultati
- Cache risultati ricerca
- Infinite scroll invece di paginazione
- Supporto immagini nei risultati
Questo progetto è distribuito con licenza GNU GPL v2, compatibile con Xataface.
I contributi sono benvenuti! Leggi CONTRIBUTING.md per le linee guida.
Per segnalare bug o richiedere nuove funzionalità, apri una issue su GitHub.
Se questo modulo ti è stato utile, considera di mettere una stella ⭐ al repository!
Realizzato con ❤️ da Paolo Bonzini
