
# Module `D.Form`

```ocaml
type 'a param = 'a form_param
```
```ocaml
val float : float param
```
```ocaml
val int : int param
```
```ocaml
val int32 : int32 param
```
```ocaml
val int64 : int64 param
```
```ocaml
val nativeint : nativeint param
```
```ocaml
val bool : bool param
```
```ocaml
val string : string param
```
```ocaml
val user : ('a -> string) -> 'a param
```
```ocaml
val make_post_uri_components : 
  ?absolute:bool ->
  ?absolute_path:bool ->
  ?https:bool ->
  service:
    ('get, 'post, Eliom_service.post, _, _, _, _, _, _, _, _) Eliom_service.t ->
  ?hostname:string ->
  ?port:int ->
  ?fragment:string ->
  ?keep_nl_params:[ `All | `Persistent | `None ] ->
  ?nl_params:Eliom_parameter.nl_params_set ->
  ?keep_get_na_params:bool ->
  'get ->
  'post ->
  string
  * (string * Eliommod_parameters.param) list
  * string option
  * (string * Eliommod_parameters.param) list
```
Same as `LINK.make_uri_components`, but also returns a list of post parameters.

```ocaml
val get_form : 
  ?absolute:bool ->
  ?absolute_path:bool ->
  ?https:bool ->
  ?a:[< Html_types.form_attrib ] attrib list ->
  service:
    (_,
      unit,
      Eliom_service.get,
      _,
      _,
      _,
      _,
      _,
      'gn,
      _,
      Eliom_service.non_ocaml)
      Eliom_service.t ->
  ?hostname:string ->
  ?port:int ->
  ?fragment:string ->
  ?keep_nl_params:[ `All | `Persistent | `None ] ->
  ?nl_params:Eliom_parameter.nl_params_set ->
  ?xhr:bool ->
  ('gn -> [< Html_types.form_content ] elt list) ->
  [> Html_types.form ] elt
```
The function `get_form service formgen` creates a GET `<form>` to `service`. The content of the `<form>` is generated by the function `formgen`, that takes the names of the service parameters as parameters. By default, the `action` attribute is a relative URL recomputed at each request with [`make_uri`](./Eliom_content-Html-D.md#val-make_uri).

By default, the form is realized such that the client-side Eliom application keeps running irrespectable of the usage of the form (cf. `Eliom_client.change_page`).

By contrast, if the optional parameter `~xhr:false` is given, the form is realized as a standard HTML form and submitting it discontinues the Eliom application. The `~xhr` parameter has no effect outside an Eliom application.

NB that the default value of `~xhr` is configurable through [`Eliom_config.set_default_links_xhr`](./Eliom_config.md#val-set_default_links_xhr).

The optional parameter `~a` allows one to add extra HTML attributes to the generated node.

See [`make_uri`](./Eliom_content-Html-D.md#val-make_uri) for description of other optional parameters.

```ocaml
val lwt_get_form : 
  ?absolute:bool ->
  ?absolute_path:bool ->
  ?https:bool ->
  ?a:[< Html_types.form_attrib ] attrib list ->
  service:
    (_,
      unit,
      Eliom_service.get,
      _,
      _,
      _,
      _,
      _,
      'gn,
      _,
      Eliom_service.non_ocaml)
      Eliom_service.t ->
  ?hostname:string ->
  ?port:int ->
  ?fragment:string ->
  ?keep_nl_params:[ `All | `Persistent | `None ] ->
  ?nl_params:Eliom_parameter.nl_params_set ->
  ?xhr:bool ->
  ('gn -> [< Html_types.form_content ] elt list Lwt.t) ->
  [> Html_types.form ] elt Lwt.t
```
Same as [`get_form`](./#val-get_form) but taking a cooperative function for `<form>` content generation.

```ocaml
val post_form : 
  ?absolute:bool ->
  ?absolute_path:bool ->
  ?https:bool ->
  ?a:[< Html_types.form_attrib ] attrib list ->
  service:
    ('get,
      _,
      Eliom_service.post,
      _,
      _,
      _,
      _,
      _,
      _,
      'pn,
      Eliom_service.non_ocaml)
      Eliom_service.t ->
  ?hostname:string ->
  ?port:int ->
  ?fragment:string ->
  ?keep_nl_params:[ `All | `Persistent | `None ] ->
  ?keep_get_na_params:bool ->
  ?nl_params:Eliom_parameter.nl_params_set ->
  ?xhr:bool ->
  ('pn -> [< Html_types.form_content ] elt list) ->
  'get ->
  [> Html_types.form ] elt
```
The function `post_form service formgen post_params` creates a POST `<form>` to `service` preapplied to the POST parameters `post_params`. The content of the `<form>` is generated by the function `formgen`, that takes the names of the service parameters as parameters. By default, the `action` attribute is a relative URL recomputed at each request with [`make_uri`](./Eliom_content-Html-D.md#val-make_uri).

The optional parameter `~a` allows one to add HTML attributes to the generated node.

See `Eliom_service.make` for a description of the `~keep_get_na_params` optional parameter ; see [`get_form`](./#val-get_form) for `~xhr` and see [`make_uri`](./Eliom_content-Html-D.md#val-make_uri) for other optional parameters.

```ocaml
val lwt_post_form : 
  ?absolute:bool ->
  ?absolute_path:bool ->
  ?https:bool ->
  ?a:[< Html_types.form_attrib ] attrib list ->
  service:
    ('get,
      _,
      Eliom_service.post,
      _,
      _,
      _,
      _,
      _,
      _,
      'pn,
      Eliom_service.non_ocaml)
      Eliom_service.t ->
  ?hostname:string ->
  ?port:int ->
  ?fragment:string ->
  ?keep_nl_params:[ `All | `Persistent | `None ] ->
  ?keep_get_na_params:bool ->
  ?nl_params:Eliom_parameter.nl_params_set ->
  ?xhr:bool ->
  ('pn -> [< Html_types.form_content ] elt list Lwt.t) ->
  'get ->
  [> Html_types.form ] elt Lwt.t
```
Same as [`post_form`](./#val-post_form) but taking a cooperative function for `<form>` content generation.

```ocaml
val input : 
  ?a:[< Html_types.input_attrib ] attrib list ->
  input_type:[< Html_types.input_type ] ->
  ?name:[< 'a Eliom_parameter.setoneradio ] Eliom_parameter.param_name ->
  ?value:'a ->
  'a param ->
  [> Html_types.input ] elt
```
Creates an `<input>` tag.

```ocaml
val file_input : 
  ?a:[< Html_types.input_attrib ] attrib list ->
  name:
    [< Eliom_lib.file_info Eliom_parameter.setoneradio ]
      Eliom_parameter.param_name ->
  unit ->
  [> Html_types.input ] elt
```
Creates an `<input>` tag for sending a file

```ocaml
val image_input : 
  ?a:[< Html_types.input_attrib ] attrib list ->
  name:
    [< Eliom_parameter.coordinates Eliom_parameter.oneradio ]
      Eliom_parameter.param_name ->
  ?src:uri ->
  unit ->
  [> Html_types.input ] elt
```
Creates an `<input type="image" name="...">` tag. The server receives the coordinates that the user clicked on.

```ocaml
val checkbox : 
  ?a:[< Html_types.input_attrib ] attrib list ->
  ?checked:bool ->
  name:[ `Set of 'a ] Eliom_parameter.param_name ->
  value:'a ->
  'a param ->
  [> Html_types.input ] elt
```
Creates a checkbox `<input>` tag. You can produce several checkboxes with the same name (and different values). The service must declare a parameter of type `set`.

```ocaml
val bool_checkbox_one : 
  ?a:[< Html_types.input_attrib ] attrib list ->
  ?checked:bool ->
  name:[ `One of bool ] Eliom_parameter.param_name ->
  unit ->
  [> Html_types.input ] elt
```
Creates a checkbox `<input>` tag of type bool. Only one checkbox with the same `name` is allowed.

```ocaml
val radio : 
  ?a:[< Html_types.input_attrib ] attrib list ->
  ?checked:bool ->
  name:[ `Radio of 'a ] Eliom_parameter.param_name ->
  value:'a ->
  'a param ->
  [> Html_types.input ] elt
```
Creates a radio `<input>` tag.

```ocaml
val string_radio_required : 
  ?a:[< Html_types.input_attrib ] attrib list ->
  ?checked:bool ->
  name:[ `One of string ] Eliom_parameter.param_name ->
  value:string ->
  unit ->
  [> Html_types.input ] elt
```
```ocaml
val button : 
  ?a:[< Html_types.button_attrib ] attrib list ->
  button_type:[< Eliom_form_sigs.button_type ] ->
  name:[< 'a Eliom_parameter.setone ] Eliom_parameter.param_name ->
  value:'a ->
  'a param ->
  Html_types.button_content elt list ->
  [> Html_types.button ] elt
```
Creates a `<button>` tag.

```ocaml
val button_no_value : 
  ?a:[< Html_types.button_attrib ] attrib list ->
  button_type:[< Eliom_form_sigs.button_type ] ->
  Html_types.button_content elt list ->
  [> Html_types.button ] elt
```
Creates a `<button>` tag with no value. No value is sent.

```ocaml
val textarea : 
  ?a:[< Html_types.textarea_attrib ] attrib list ->
  name:[< string Eliom_parameter.setoneradio ] Eliom_parameter.param_name ->
  ?value:string ->
  unit ->
  [> Html_types.textarea ] elt
```
Creates a `<textarea>` tag

```ocaml
type 'a soption =
  Html_types.option_attrib attrib list
  * 'a
  * Html_types.pcdata elt option
  * bool
```
```ocaml
type 'a select_opt = 
  | Optgroup of [ Html_types.common | `Disabled ] attrib list
    * string
    * 'a soption
    * 'a soption list
  | Option of 'a soption
```
The type for `<select>` options and groups of options.

- The field of type 'a in `soption` is the value that will be sent by the form.
- If the `Html_types.pcdata elt option` is not present it is also the value displayed.
- The string in `select_opt` is the label
```ocaml
val select : 
  ?a:[< Html_types.select_attrib ] attrib list ->
  ?required:Html_types.pcdata elt ->
  name:[ `One of 'a ] Eliom_parameter.param_name ->
  'a param ->
  'a select_opt ->
  'a select_opt list ->
  [> Html_types.select ] elt
```
Creates a `<select>` tag.

```ocaml
val multiple_select : 
  ?a:[< Html_types.select_attrib ] attrib list ->
  ?required:Html_types.pcdata elt ->
  name:[ `Set of 'a ] Eliom_parameter.param_name ->
  'a param ->
  'a select_opt ->
  'a select_opt list ->
  [> Html_types.select ] elt
```
Creates a multiple-selection `<select>` tag.
