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:
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: