annotate sites/all/modules/views/help/api-forms.html @ 2:b74b41bb73f0

-- Google analytics module
author danieleb <danielebarchiesi@me.com>
date Thu, 22 Aug 2013 17:22:54 +0100
parents ff03f76ab3fe
children
rev   line source
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 '&lt;!--form-item-' . $this-&gt;options['id'] . '--' . $this-&gt;view-&gt;row_index . '--&gt;';
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-&gt;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-&gt;view-&gt;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-&gt;view-&gt;result)) {
danielebarchiesi@0 28 return;
danielebarchiesi@0 29 }
danielebarchiesi@0 30
danielebarchiesi@0 31 $field_name = $this-&gt;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-&gt;view-&gt;result as $row_id => $row) {
danielebarchiesi@0 37 $form_element_row_id = $this-&gt;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>