danielebarchiesi@0: Views allows handlers to output form elements, wrapping them automatically in a form, and handling validation / submission. danielebarchiesi@0: The form is multistep by default, allowing other modules to add additional steps, such as confirmation screens. danielebarchiesi@0: danielebarchiesi@0:

Implementation

danielebarchiesi@0: A views handler outputs a special placeholder in render(), while the real form with matching structure gets added in views_form(). danielebarchiesi@0: When the View is being preprocessed for the theme file, all placeholders get replaced with the rendered form elements. danielebarchiesi@0: danielebarchiesi@0: The views handler can also implement views_form_validate() and views_form_submit(). danielebarchiesi@0:
danielebarchiesi@0:   function render($values) {
danielebarchiesi@0:     return '<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->';
danielebarchiesi@0:   }
danielebarchiesi@0: 
danielebarchiesi@0:   function form_element_name() {
danielebarchiesi@0:     // Make sure this value is unique for all the view fields
danielebarchiesi@0:     return $this->options['id'];
danielebarchiesi@0:   }
danielebarchiesi@0: 
danielebarchiesi@0:   function form_element_row_id($row_id) {
danielebarchiesi@0:     // You could use values from $this->view->result[$row_id]
danielebarchiesi@0:     // to provide complex row ids.
danielebarchiesi@0:     return $row_id;
danielebarchiesi@0:   }
danielebarchiesi@0: 
danielebarchiesi@0:   function views_form(&$form, &$form_state) {
danielebarchiesi@0:     // The view is empty, abort.
danielebarchiesi@0:     if (empty($this->view->result)) {
danielebarchiesi@0:       return;
danielebarchiesi@0:     }
danielebarchiesi@0: 
danielebarchiesi@0:     $field_name = $this->form_element_name();
danielebarchiesi@0:     $form[$field_name] = array(
danielebarchiesi@0:       '#tree' => TRUE,
danielebarchiesi@0:     );
danielebarchiesi@0:     // At this point, the query has already been run, so we can access the results
danielebarchiesi@0:     foreach ($this->view->result as $row_id => $row) {
danielebarchiesi@0:       $form_element_row_id = $this->form_element_row_id($row_id);
danielebarchiesi@0:       $form[$field_name][$form_element_row_id] = array(
danielebarchiesi@0:         '#type' => 'textfield',
danielebarchiesi@0:         '#title' => t('Your name'),
danielebarchiesi@0:         '#default_value' => '',
danielebarchiesi@0:       );
danielebarchiesi@0:     }
danielebarchiesi@0:   }
danielebarchiesi@0: 
danielebarchiesi@0:   // Optional validate function.
danielebarchiesi@0:   function views_form_validate($form, &$form_state) {
danielebarchiesi@0:     $field_name = $this->form_element_name();
danielebarchiesi@0:     foreach ($form_state['values'][$field_name] as $row_id => $value) {
danielebarchiesi@0:       if ($value == 'Drupal') {
danielebarchiesi@0:         form_set_error($field_name . '][' . $row_id, "You can't be named Drupal. That's my name.");
danielebarchiesi@0:       }
danielebarchiesi@0:     }
danielebarchiesi@0:   }
danielebarchiesi@0: 
danielebarchiesi@0:   // Optional submit function.
danielebarchiesi@0:   function views_form_submit($form, &$form_state) {
danielebarchiesi@0:     // Do something here
danielebarchiesi@0:   }
danielebarchiesi@0: 
danielebarchiesi@0: danielebarchiesi@0: The form is multistep by default, with one step: 'views_form_views_form'. danielebarchiesi@0: A "form_example" module could add a confirmation step by setting: danielebarchiesi@0:
danielebarchiesi@0:  $form_state['step'] = 'form_example_confirmation';
danielebarchiesi@0: 
danielebarchiesi@0: in form_example_views_form_submit(). danielebarchiesi@0: Then, views_form would call form_example_confirmation($form, $form_state, $view, $output) to get that step. danielebarchiesi@0: danielebarchiesi@0: Important: You can fetch the Views object in form_alter and validate / submit hooks from the form state: danielebarchiesi@0:
danielebarchiesi@0:   $view = $form_state['build_info']['args'][0];
danielebarchiesi@0: 
danielebarchiesi@0: danielebarchiesi@0:

Relevant Views functions

danielebarchiesi@0: danielebarchiesi@0: danielebarchiesi@0:

Hooks

danielebarchiesi@0: