Form and gated content UPDATED from earlier:

I am using a simple Drupal form that collect user info before allowing the user access to donwloadable content. NOTE: This is using the form API and I am no longer using a modal; just using a regular page created by a hook. Here is the scenario:

&lt;?php

function my_form_menu() {
  $items = array();

  $items['form/userinfo'] = array( //this creates a URL that will call this form 
    'title' =&gt; 'Download Form', //page title
    'description' =&gt; 'A form that gathers user infomation',
    'page callback' =&gt; 'drupal_get_form', //this is the function that will be called w           hen the page is accessed.  for a form, use drupal_get_form
    'page arguments' =&gt; array('my_form'), //name of the form
   'access callback' =&gt; TRUE
 );

 return $items;
}

function my_form() {
 if (!empty($_COOKIE['Drupal_visitor_downloadbypass'])) {
 drupal_goto('this is where the pdf file will go'); // rest of the page will not execute because drupal_goto ends the request. 
}
 $form['name']['first'] = array(
'#type' =&gt; 'textfield',
'#title' =&gt; t('First name'),
 '#required' =&gt; TRUE,
 );
$form['name']['last'] = array(
'#type' =&gt; 'textfield',
'#title' =&gt; t('Last name'),
 '#required' =&gt; TRUE,
 );
$form['name']['title'] = array(
'#type' =&gt; 'textfield',
'#title' =&gt; t('title'),
 '#required' =&gt; TRUE,
 );

 $form['submit'] = array(
'#type' =&gt; 'submit',
'#value' =&gt; 'Submit',

 );

 return $form;
 }
   function my_form_submit($form, &amp;$form_state) {
 // $form_state['values']['example'] contains the submitted value of 'example' element. 
 user_cookie_save(array('downloadbypass' =&gt; 1));
  $form_state['redirect'] = 'this is where the pdf file will go';
  }


So here is my question: Now my form page is not showing up and I didnt change the hook except for the form name argument. The form will need to redirect back to the previous page and open the file in a new window upon submission.

Thanks!

phi
You didn't mention whether you are using ctools modal forms or a custom modal form. 

For general form API submissions, the submit handler will only be executed when the form validation has passed, including the regular CSRF checks. 

Suppose you have a form like this:

&lt;?php
function my_form() {
  if (!empty($_COOKIE['Drupal_visitor_downloadbypass'])) {
    drupal_goto('download/able/file.here'); // rest of the page will not execute because drupal_goto ends the request. 
  }
  $form['example'] = ...;// your form building goes here
  ..
  ..

  return $form;
}

function my_form_submit($form, &amp;$form_state) {
  // $form_state['values']['example'] contains the submitted value of 'example' element. 
  user_cookie_save(array('downloadbypass' =&gt; 1));
  $form_state['redirect'] = 'download/able/file.here';
}


If you are using a ctools modals, you can check the $form_state in your ctools form builder to do the same cookie check and redirect above. 

Your ctools form builder can be as follows. Note the $form_state check. 

&lt;?php
function my_ctools_form_wrapper($js = NULL) {
  ctools_include('ajax');
  ctools_include('modal');
  $form_state = array(
    'ajax' =&gt; TRUE,
    'title' =&gt; t('My Ajax Form'),
  );

  $output = ctools_modal_form_wrapper('my_form', $form_state);

  if (!empty($form_state['executed'])) { // is the form submitted ?

    // Add the responder javascript, required by ctools
    ctools_add_js('ajax-responder');

    // Create ajax command array, dismiss the modal window.
    $output = array();
    $output[] = ctools_modal_command_dismiss();
    $output[] = ctools_ajax_command_reload();
  }

  print ajax_render($output);
  exit();
}