# XForms

XForms è un linguaggio basato su XML, sviluppato dal W3C per rappresentare e raccogliere form all'interno dei documenti XML, XHTM-TDT e SVG.

## Caratteristiche

XForms definisce cos'è un form e quali funzioni deve svolgere. Permette inoltre di specificare quali dati inserire nei diversi campi (per esempio: indirizzo email, nome, cognome). Il modo in cui XForms invia e riceve i dati, inclusa la possibilità di sospendere e riprendere la compilazione di un form, è definito da XSP.
XForms è suddiviso in tre livelli:
* Presentazione: comprende gli elementi per definire componenti dei form XML come per esempio pulsanti e dati in input.
* Logico: stabilisce le relazioni tra i campi di un form (per esempio, consente di attivare alcune funzioni solo se prima sono attivati i valori di altri campi).
* Dati: gestisce le informazioni di un form permettendo di definire il modello dei dati e di effettuare validazioni.
XForms è indipendente dal dispositivo e può essere usato per esempio con browser e palmari. È anche possibile aggiungere elementi XForms direttamente in altre applicazioni XML come VoiceXML, WML e SVG(Scalable Vector Graphics).

## Scopo

Lo scopo di XForms è quello di raccogliere informazioni, creando un'interfaccia grafica che interagisce direttamente con l'utente ricavando i dati richiesti. XForms permette di legare in un unico form le diverse interazioni raccolte.

## Differenze tra Form-HTML e Form-XForms

Nei form HTML la struttura dati non ha un vero e proprio ordine e la funzione e la presentazione non vengono distinte. In XForms la funzione e la presentazione vengono invece distinte e ciò produce diversi vantaggi:
* riuso: i form di XForms possono essere riusati indipendentemente dall'informazione che essi raccolgono.
* indipendenza dal dispositivo: i controlli dell'interfaccia utente indicano caratteristiche generiche, in modo da poter essere utilizzati da dispositivi con caratteristiche diverse.
* accessibilità: la separazione della presentazione dal contenuto permette di presentare gli stessi dati in più modi nel caso in cui si usino diverse modalità di interazione.
* correttezza: i dati ricevuti da un XForm sono sempre ben formati, facili da validare e da elaborare.
La codifica del modello dati avviene attraverso XML e viene vista come una struttura di nodi che trasportano dati. Questo permette la modifica dei dati attraverso due modi: utilizzando dei widget collegati ai nodi oppure collegando i dati a uno o più nodi. I dati XForms possono essere elaborati direttamente utilizzando le tecnologie XML, mentre il processore XForms estende le modifiche ai valori a tutti i widget che potrebbero essere collegati allo stesso nodo in modo Model-view-controller.

## Corrispondenze e differenze tra un form HTML e un form XML

Questo esempio presenta un form HTML per registrare tre informazioni: appellativo, nome e cognome.
Il form può essere tradotto in XForms all'interno di un documento XHTML nel modo seguente:
All'interno di questo codice sono presenti elementi quali:
* <xforms:model>: definisce quale tipo di form va usato nell'interfaccia.
* <xforms:submission>: definisce il modo in cui i dati dovranno essere inviati utilizzando il metodo POST di HTTP.
* <xforms:input model="Form" ref="name">: indica quale informazione dovrà essere inserita all'interno dello spazio presente nell'interfaccia (in questo caso, il nome).
Internamente al <body> si hanno tre controlli, <xforms:select1>, <xforms:input> e <xforms:submit>, appartenenti allo stesso form. Nella visualizzazione con browser, <xforms:select1> può essere rappresentato con Radio button e <xforms:input> con una casella di testo.
XForms permette di distinguere all'interno del form diversi tipi di input:
* Stringhe
* Numeri
* Valori booleani

## Estensioni form XForms

Un form offre agli utenti un'interfaccia strutturata per immettere o modificare informazioni che possano essere elaborate al di fuori di essa. XForms utilizza form XML mediante l'inclusione di form HTML portando estensioni come:
* Modello dati: contiene dati codificati XML al di fuori dell'interfaccia
* Tipi di dati: i valori testuali nel modello di dati possono essere dichiarati come dati specifici
* Eventi: si basa sugli eventi XML, l'obiettivo è quello di rappresentare elementi di XML
* Widget: ha a disposizione un ricco set di widget abbinati all'ultima versione di HTML, ovvero HTML.5
* Ripetizioni: serie di controlli del form contenitore ed è l'unico sistema tecnologico che supporta gruppi di Widget

## Tipi di dati

XForms offre un numero limitato di tipi di dati e supporta i tipi semplici incorporati di XML schema. Il modello di dati di un form può essere condizionato da uno schema esterno contenente tipi di dati semplici e complessi, garantendo sia l'aggiornamento ai valori dei dati che il cambiamento della struttura.
* tipi di dati semplici: sono relativi a quegli elementi che non possono contenere altri elementi. Per esempio, l'elemento testo non prevede attributi e contiene al suo interno soltanto sequenze di caratteri
* tipi di dati complessi: si riferiscono a elementi che possono contenere altri elementi. Per esempio, l'elemento libro può contenere elementi capitolo.

## Eventi

I sistemi di form gestiscono eventi che vengono attivati o in un form interno o sotto il controllo dell'utente. Gli eventi possono causare l'espansione di un form o portare delle modifiche ai valori. Si definisce DOM Eventi, la struttura e le regole di elaborazione per gli eventi del browser.

## Widget

I widget di XForms e HTML5 hanno la stessa funzione ma nomi diversi. XForms può utilizzare i widget HTML5.
| XForms | HTML5 | Dettagli |
| input | input | Il widget di input di XForms abilita l'immissione di dati in formato libero |
| output | output | widget di output per la visualizzazione dei dati elaborati |
| trigger | input, button | L'attributo type input sull'elemento deve essere impostato su button |
| <upload> | <input type="file"> | Per il caricamento di file o dati del dispositivo |
| <submit> | <input type="submit"> | Per l'invio dei dati del form Testo della cella |
| <select> | <select multiple="multiple"> o più <input type="checkbox"> | Per la selezione di una, nessuna o più opzioni |
| <select1> | <select> o più <input type="radio"> | Per la selezione di una sola opzione tra le varie |

## Ripetizioni

I form devono visualizzare dati ripetuti che possono essere modificati con azioni, come la ripetizione di righe in una tabella del database. XForms per tali ripetizioni introduce l'elemento REPEAT, un modello di Widget interno che viene posizionato per ogni porzione del blocco dati a cui REPEAT è connesso. Le prime versioni di HTML non supportano le ripetizioni mentre XForms sì.

## Requisititi per un processore XForms

Un processore XForms deve soddisfare vari requisiti oltre a quelli di un processore di form HTML. Essi sono:
* Gestione dei dati XML, inclusi caricamento e trasmissione.
* Distinzione di valori tra dati XML e dati HTML.
* Supporto per i widget XForms.
* Supporto per l'elemento REPEAT.
* Implementazione delle azioni XForms.
* Supporto per eventi XForms.