TransWikia.com

Form and gated content

Drupal Answers Asked by DataGuy on November 17, 2021

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:

<?php

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

  $items['form/userinfo'] = array( //this creates a URL that will call this form 
    'title' => 'Download Form', //page title
    'description' => 'A form that gathers user infomation',
    'page callback' => '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' => array('my_form'), //name of the form
   'access callback' => 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' => 'textfield',
'#title' => t('First name'),
 '#required' => TRUE,
 );
$form['name']['last'] = array(
'#type' => 'textfield',
'#title' => t('Last name'),
 '#required' => TRUE,
 );
$form['name']['title'] = array(
'#type' => 'textfield',
'#title' => t('title'),
 '#required' => TRUE,
 );

 $form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',

 );

 return $form;
 }
   function my_form_submit($form, &$form_state) {
 // $form_state['values']['example'] contains the submitted value of 'example' element. 
 user_cookie_save(array('downloadbypass' => 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

One Answer

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:

<?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, &$form_state) {
  // $form_state['values']['example'] contains the submitted value of 'example' element. 
  user_cookie_save(array('downloadbypass' => 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.

<?php
function my_ctools_form_wrapper($js = NULL) {
  ctools_include('ajax');
  ctools_include('modal');
  $form_state = array(
    'ajax' => TRUE,
    'title' => 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();
}

Answered by AKS on November 17, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP