danielebarchiesi@0
|
1 Views allows handlers to output form elements, wrapping them automatically in a form, and handling validation / submission.
|
danielebarchiesi@0
|
2 The form is multistep by default, allowing other modules to add additional steps, such as confirmation screens.
|
danielebarchiesi@0
|
3
|
danielebarchiesi@0
|
4 <h2>Implementation</h2>
|
danielebarchiesi@0
|
5 A views handler outputs a special placeholder in render(), while the real form with matching structure gets added in views_form().
|
danielebarchiesi@0
|
6 When the View is being preprocessed for the theme file, all placeholders get replaced with the rendered form elements.
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 The views handler can also implement views_form_validate() and views_form_submit().
|
danielebarchiesi@0
|
9 <pre>
|
danielebarchiesi@0
|
10 function render($values) {
|
danielebarchiesi@0
|
11 return '<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->';
|
danielebarchiesi@0
|
12 }
|
danielebarchiesi@0
|
13
|
danielebarchiesi@0
|
14 function form_element_name() {
|
danielebarchiesi@0
|
15 // Make sure this value is unique for all the view fields
|
danielebarchiesi@0
|
16 return $this->options['id'];
|
danielebarchiesi@0
|
17 }
|
danielebarchiesi@0
|
18
|
danielebarchiesi@0
|
19 function form_element_row_id($row_id) {
|
danielebarchiesi@0
|
20 // You could use values from $this->view->result[$row_id]
|
danielebarchiesi@0
|
21 // to provide complex row ids.
|
danielebarchiesi@0
|
22 return $row_id;
|
danielebarchiesi@0
|
23 }
|
danielebarchiesi@0
|
24
|
danielebarchiesi@0
|
25 function views_form(&$form, &$form_state) {
|
danielebarchiesi@0
|
26 // The view is empty, abort.
|
danielebarchiesi@0
|
27 if (empty($this->view->result)) {
|
danielebarchiesi@0
|
28 return;
|
danielebarchiesi@0
|
29 }
|
danielebarchiesi@0
|
30
|
danielebarchiesi@0
|
31 $field_name = $this->form_element_name();
|
danielebarchiesi@0
|
32 $form[$field_name] = array(
|
danielebarchiesi@0
|
33 '#tree' => TRUE,
|
danielebarchiesi@0
|
34 );
|
danielebarchiesi@0
|
35 // At this point, the query has already been run, so we can access the results
|
danielebarchiesi@0
|
36 foreach ($this->view->result as $row_id => $row) {
|
danielebarchiesi@0
|
37 $form_element_row_id = $this->form_element_row_id($row_id);
|
danielebarchiesi@0
|
38 $form[$field_name][$form_element_row_id] = array(
|
danielebarchiesi@0
|
39 '#type' => 'textfield',
|
danielebarchiesi@0
|
40 '#title' => t('Your name'),
|
danielebarchiesi@0
|
41 '#default_value' => '',
|
danielebarchiesi@0
|
42 );
|
danielebarchiesi@0
|
43 }
|
danielebarchiesi@0
|
44 }
|
danielebarchiesi@0
|
45
|
danielebarchiesi@0
|
46 // Optional validate function.
|
danielebarchiesi@0
|
47 function views_form_validate($form, &$form_state) {
|
danielebarchiesi@0
|
48 $field_name = $this->form_element_name();
|
danielebarchiesi@0
|
49 foreach ($form_state['values'][$field_name] as $row_id => $value) {
|
danielebarchiesi@0
|
50 if ($value == 'Drupal') {
|
danielebarchiesi@0
|
51 form_set_error($field_name . '][' . $row_id, "You can't be named Drupal. That's my name.");
|
danielebarchiesi@0
|
52 }
|
danielebarchiesi@0
|
53 }
|
danielebarchiesi@0
|
54 }
|
danielebarchiesi@0
|
55
|
danielebarchiesi@0
|
56 // Optional submit function.
|
danielebarchiesi@0
|
57 function views_form_submit($form, &$form_state) {
|
danielebarchiesi@0
|
58 // Do something here
|
danielebarchiesi@0
|
59 }
|
danielebarchiesi@0
|
60 </pre>
|
danielebarchiesi@0
|
61
|
danielebarchiesi@0
|
62 The form is multistep by default, with one step: 'views_form_views_form'.
|
danielebarchiesi@0
|
63 A "form_example" module could add a confirmation step by setting:
|
danielebarchiesi@0
|
64 <pre>
|
danielebarchiesi@0
|
65 $form_state['step'] = 'form_example_confirmation';
|
danielebarchiesi@0
|
66 </pre>
|
danielebarchiesi@0
|
67 in form_example_views_form_submit().
|
danielebarchiesi@0
|
68 Then, views_form would call form_example_confirmation($form, $form_state, $view, $output) to get that step.
|
danielebarchiesi@0
|
69
|
danielebarchiesi@0
|
70 <b>Important:</b> You can fetch the Views object in form_alter and validate / submit hooks from the form state:
|
danielebarchiesi@0
|
71 <pre>
|
danielebarchiesi@0
|
72 $view = $form_state['build_info']['args'][0];
|
danielebarchiesi@0
|
73 </pre>
|
danielebarchiesi@0
|
74
|
danielebarchiesi@0
|
75 <h2>Relevant Views functions</h2>
|
danielebarchiesi@0
|
76 <ul>
|
danielebarchiesi@0
|
77 <li>template_preprocess_views_view()</li>
|
danielebarchiesi@0
|
78 <li>views_form()</li>
|
danielebarchiesi@0
|
79 <li>views_form_views_form()</li>
|
danielebarchiesi@0
|
80 <li>views_form_views_form_validate()</li>
|
danielebarchiesi@0
|
81 <li>views_form_views_form_submit()</li>
|
danielebarchiesi@0
|
82 <li>theme_views_form_views_form()</li>
|
danielebarchiesi@0
|
83 </ul>
|
danielebarchiesi@0
|
84
|
danielebarchiesi@0
|
85 <h2>Hooks</h2>
|
danielebarchiesi@0
|
86 <ul>
|
danielebarchiesi@0
|
87 <li>hook_views_form_substitutions()</li>
|
danielebarchiesi@0
|
88 </ul>
|