Hi,

Thank you for this easy to use module. I'd like to a for a way to auto close the modal on user submition if the form doesn't have errors. Can you please provide some advise?

I have search in the web and I get to the ctools_modal_command_dismiss() function but I'm not sure where to put it.

Thank you

Julian

Comments

julianmancera’s picture

Hi

I have found a solution, it needs this code change in the ctools_automodal.module line 127 function ctools_automodal_get_form:

$commands = ctools_modal_form_wrapper($form_id, $form_state);
    if ($form_state['executed']) {
      $commands = array(ctools_modal_command_dismiss());
    }else {
	    if (empty($commands)) {
	      $commands[] = ctools_modal_command_loading();
	      if (!empty($_GET['destination'])) {
	        $commands[] = ctools_ajax_command_redirect($_GET['destination']);
	      }
	    }
    }

Please let me know you comments. The other posibility is in the submition function for the form add a form_state['command'] array variable that allows to control wether to close the modal or maintain the user there for further user operations.

Let me know your comments

Julian Mancera

HakS’s picture

Status: Active » Needs work

Hi julianmancera

Unfortunately it does not work for me, form still stays open when submit after applying changes.

I tested it putting this code inside an implementation of hook_menu_alter:

$items['node/add/article']['modal'] = TRUE;

That's the core node add form.

I was trying it on an (almost) clean installation.

HakS’s picture

Actually, it seems to work if form is not an administrative form. I created a custom form and it worked, but I don't know if that would be part of this issue, because I noticed that administrative forms on modal windows behave quite strange.

EDIT: If you allow other users to use that modal administrative form (in my case that means allowing anonymous to add articles), when submit an ajax error happens http://d.pr/i/IjA9

Marko B’s picture

Issue summary: View changes

There is no need for that, you are using it wrong You can do it all with form rebuild and ctools_modal_command_dismiss(); and ajax_render, I also added $commands[] = ctools_ajax_command_redirect(''); so you redirect when you submited a form to a page you want.

function custom_form($form, &$form_state)
{
 $form = array();
  $form['something'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter'),
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
 if ( $form_state['submitted']){
        $commands[] = ctools_modal_command_dismiss();
         $commands[] = ctools_ajax_command_redirect('<front>');
    print ajax_render($commands);
    exit;
 }
  return $form;
}

function custom_form_submit(&$form, &$form_state) {

  $form_state['rebuild'] = TRUE;

}
Marko B’s picture

Status: Needs work » Fixed

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.

capellic’s picture

@MarkoB, thanks for your code, however I had to add these two module_load_include() calls in order for the ctools_modal_command_dismiss() and ctools_ajax_command_redirect() to be found:

module_load_include('inc', 'ctools', 'includes/modal');
module_load_include('inc', 'ctools', 'includes/ajax');
sukh.singh’s picture

@capellica, the proper way to add these files are as follow

ctools_include('ajax');
ctools_include('modal');

add this to the function which you are using against the ctools ajax menu link

ongraph’s picture

You can put ctools_modal_command_dismiss(); after successful form submission
Here is coding example of ctools modal auto close with form submission

function custom_module_form($js = NULL) {
  // Fall back if $js is not set.
  if (!$js) {
    return drupal_get_form('custom_form');
  }

  ctools_include('modal');
  ctools_include('ajax');
  ctools_add_js('ajax-responder');
  $form_state = array(
     'title' => t('Modal example'),
     'ajax' => TRUE,
  );
  $output = ctools_modal_form_wrapper('custom_form', $form_state);
  if (!empty($form_state['executed'])) {
		$output[] = ctools_modal_command_dismiss(); //Close modal automatically
		$output[] = ctools_ajax_command_reload(); //reload parent window 
  }
  print ajax_render($output);
  drupal_exit();
}
ugintl’s picture

The code from #1 is working, but the page is not updated with the changes automatically. I have to refresh the page to make the changes.