[development] Help needed to convert a module to D7 with AJAX in forms

Ken Winters kwinters at coalmarch.com
Fri Mar 5 15:36:15 UTC 2010


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 at 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.forms.inc?view=markup&pathrev=DRUPAL-7--1 
> >
>
> 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 at randyfay.com
> +1  970.462.7450
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.drupal.org/pipermail/development/attachments/20100305/dbab93a9/attachment.html 


More information about the development mailing list