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