Note that the linked issue is marked critical (so it will be fixed before D7 is released) and already has a patch. Rather than change your form, first try applying the patch and see if that fixes it for you. - Ken Winters On Mar 5, 2010, at 10:33 AM, Randy Fay wrote:
Hi Tobias -
The problem is the drupal_goto() in your submit function. The submit function is being processed during the AJAX callback... and the drupal_goto() takes control away from the callback.
If I'm not mistaken, this behavior will change when http://drupal.org/node/684846 lands, but for now, you'll need to not do a drupal_goto() in your submit function.
-Randy
On Fri, Mar 5, 2010 at 4:19 AM, Tobias Quathamer <t.quathamer@gmx.net> wrote: Hi all,
I've run into a problem with D7 and AJAX-enabled forms. What I try to do is to have a selection list use options depending on another selection list. I've looked at the code of the AJAX examples module, but I could not find why my code is not working. A part of my code follows, the complete code can be found here (lines 356 onwards): <http://drupalcode.org/viewvc/drupal/contributions/modules/weather/weather.fo...
I've separated those function calls into their own file, they are not in the main .module file. Could this be a cause of problems? I would appreciate any hints or pointers.
Regards, Tobias
function weather_location_settings_form($form, &$form_state, $display_type, $display_number, $location_id=NULL) { $mode = 'edit'; // Handle the addition of a new location. if ($location_id == 'add') { $mode = 'add'; $location_id = NULL; } // If the location exists, get the settings. If it does not exist, // get the default location settings. $settings = weather_get_location_settings($location_id); $settings->places = weather_get_places($settings->country); $form['country'] = array( '#type' => 'select', '#title' => t('Country'), '#description' => t('Select a country to narrow down your search.'), '#default_value' => $settings->country, '#options' => drupal_map_assoc(weather_get_countries()), '#ajax' => array( 'callback' => 'weather_location_settings_form_callback', 'wrapper' => 'weather_place_replace', ), ); $form['place'] = array( '#type' => 'select', '#title' => t('Place'), '#description' => t('Select a place in that country for the weather display.'), '#default_value' => $settings->icao, '#options' => $settings->places, '#prefix' => '<div id="weather_place_replace">', '#suffix' => '</div>', ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save'), ); // Do not show the 'delete' button if not in 'edit' mode. if ($mode == 'edit') { $form['delete'] = array( '#type' => 'submit', '#value' => t('Delete'), '#submit' => array('weather_location_delete_submit'), ); } return $form; }
function weather_location_settings_form_callback($form, $form_state) { return $form['place']; }
-- Tobias Quathamer | Quidquid latine dictum sit, altum viditur. Hamburg, Germany | (Whatever is said in Latin sounds profound.)
-- Randy Fay Drupal Development, troubleshooting, and debugging randy@randyfay.com +1 970.462.7450