diff --git a/CHANGELOG.txt b/CHANGELOG.txt index d06d35715bf46a887acccf2834e01a1656da0084..a669b0ad1bf2b8a08ae3eb03f0eaa1219e3d69e9 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -7,6 +7,7 @@ Views 2.x o #323049 by yched: Allow Empty/Not Empty on select many to one. o #340701 by swentel: Restore allowing Views to set block caching mode. o #347892 by dww: Allow option in Boolean filters. + o #358314 by brmassa: Catch the exposed filter form so it doesn't process twice on a single view. Views 2.5 Bugs fixed: diff --git a/views.module b/views.module index 72e4f5d74c3dafe26421a88e3409566512a98736..e3d0b7c04aaaebab1eced5bfbadc4269e36299ed 100644 --- a/views.module +++ b/views.module @@ -934,6 +934,11 @@ function views_exposed_form(&$form_state) { $view = &$form_state['view']; $display = &$form_state['display']; + // Check if the form was already created + if ($cache = views_exposed_form_cache($view->name, $view->current_display)) { + return $cache; + } + $form_state['input'] = $view->get_exposed_input(); // Let form plugins know this is for exposed widgets. @@ -974,6 +979,10 @@ function views_exposed_form(&$form_state) { drupal_add_js('misc/jquery.form.js'); } views_add_js('dependent'); + + // Save the form + views_exposed_form_cache($view->name, $view->current_display, $form); + return $form; } @@ -1009,6 +1018,31 @@ function views_exposed_form_submit(&$form, &$form_state) { } } +/** + * Save the Views exposed form for later use. + * + * @param $views_name + * String. The views name. + * @param $display_name + * String. The current view display name. + * @param $form_output + * Array (optional). The form structure. Only needed when inserting the value. + * @return + * Array. The form structure, if any. Otherwise, return FALSE. + */ +function views_exposed_form_cache($views_name, $display_name, $form_output = NULL) { + static $views_exposed; + + // Save the form output + if (!empty($form_output)) { + $views_exposed[$views_name][$display_name] = $form_output; + return; + } + + // Return the form output, if any + return empty($views_exposed[$views_name][$display_name]) ? FALSE : $views_exposed[$views_name][$display_name]; +} + // ------------------------------------------------------------------ // Misc helpers