views:

73

answers:

2

We're building a small sub-site that, on the front page, has a one input box form that users can submit. From there, they're taken to a page with a few more associated form fields (add more details, tag it, etc.) with the first main form field already filled in. This works splendidly, thus far.

The problem comes for users that are not logged in. When they submit that first form, they're taken to a (LoginToboggan based) login page that allows them to login. After they login, they redirect to the second form page, but the first main form field isn't filled in -- in other words, the form data didn't persist.

How can we store that data and have it persist across the access denied page?

A: 

I don't know if there is a good way to transfer form data from two entirely different forms in Drupal, especially in the context of access denied. The best choices I can find would be to:

  • Use the url to send the data for the field.
  • You could also save the data in the db, but it might be a bit tricky to extract the data again.
googletorp
+1  A: 

You could save the data in a cookie that would be passed to the page after the login page.

Assuming that you are using the Form API to create the form, and that you have a field called "fieldname" in the function to generate the form:

function my_form() {
  $form['fieldname'] = array (
    '#type'          => 'textfield',
    '#title'         => 'Some fieldname'
  );

  // Second field if you need to save another
  $form['fieldname2'] = array (
    '#type'          => 'textfield',
    '#title'         => 'Some other fieldname'
  );
}

Set the cookie(s) in the submit handler for your form:

function my_form_submit($form, &$form_state) {
  // Set the cookie with their data before they are redirected to login
  // Use the array syntax if you have one than one related cookie to save,
  //   otherwise just use setcookie("fieldname",...

  setcookie("saved_data[fieldname]", $form_state['values']['fieldname']);

  // Your other code
}

After they login and are redirected to page two of your form, you can read the value of the cookie(s) and if they exist, insert them into the default values of the fields:

function my_form() {
  if (isset($_COOKIE['saved_data[fieldname]'])) {
    $default_fieldname = $_COOKIE['saved_data[fieldname]'];
  }
  else {
    $default_fieldname = '';
  }

  // Same check for the second field
  if (isset($_COOKIE['saved_data[fieldname2]']))...

  $form['fieldname'] = array (
    '#type'          => 'textfield',
    '#title'         => 'Some fieldname',
    '#default_value' => $default_fieldname
  );

  // Second field if used
  $form['fieldname2'] = array (
    '#type'          => 'textfield',
    '#title'         => 'Some other fieldname',
    '#default_value' => $default_fieldname2
  );
}

The cookies(s) will be presented on each page load after they are set, so it doesn't matter if there are several failed login attempts or other page views in between. You should probably delete the cookies after they're used or set a short expiration time so that they are cleaned up automatically.

flamingLogos
But how would you trigger both the save and the retrieval in Drupal?
Michael T. Smith
Thanks. Thats a great answer!
Michael T. Smith
No problem. But I'll be the first to admit that after I come up with a workaround like that, I'll find a Drupal object (or DB table or function) that does exactly what I need. Good luck!
flamingLogos

related questions