3

I have a module in my Drupal 7 application called Feedback. It includes a form for submitting simple feedback. This form is submitted via AJAX, and I've already tested and verified the submission handling. In my feedback module, I had originally, via hook_menu, hard-coded the location of this form. I then decided that I wanted it to be more flexible - on a different content-type I have called Landing Page, a user may check a box to include the feedback form. When they do, I simply do a <?= render(drupal_get_form('feedback_form')); ?>, which pulls it in. The feedback form definition lives in a file called feedback.admin.inc, so I had to also put a <?php module_load_include('inc', 'feedback', 'feedback.admin'); ?> to get it to appear.

The form appears, but its AJAX handler is no longer working. Checking outgoing network traffic via Chrome, it appears that the AJAX request is being sent to the generic Drupal AJAX handler. So, when my function feedback_form is called within the feedback module, the form works correctly. When it's called outside that module, it does not. All of the functions related to this form are in the file feedback.admin.inc, which is being included, so I'm not sure what I'm missing.

For completeness, I've included the contents of feedback.admin.inc below, along with how it's being used in my Landing Page module. Any thoughts? Thanks.

feedback.admin.inc

<?php

function feedback_form($form, &$form_state) {

    $form = NULL;

    $form['first_name'] = array(
        '#type' => 'textfield',
        '#title' => 'First Name',
        '#required' => TRUE
    );

    $form['last_name'] = array(
        '#type' => 'textfield',
        '#title' => 'Last Name',
        '#required' => TRUE
    );

    $form['organization'] = array(
        '#type' => 'textfield',
        '#title' => 'Organization'
    );

    $form['email'] = array(
        '#type' => 'textfield',
        '#title' => 'Email',
        '#required' => TRUE
    );

    $form['telephone'] = array(
        '#type' => 'textfield',
        '#title' => 'Telephone',
        '#required' => TRUE
    );

    $form['comments'] = array(
        '#type' => 'textarea',
        '#title' => 'Comments',
        '#required' => TRUE
    );

    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Submit Feedback',
        '#ajax' => array(
            'callback' => 'ajax_feedback_form_submit'
        )
    );

    return $form;
}

function ajax_feedback_form_submit($form, &$form_state) {

    if (count(form_get_errors())) {
        $response_text = '<ul>';

        ##
        ## Add each validation error to response text
        foreach(form_get_errors() as $element => $error) {
            $response_text .= "<li>$error</li>";            
        }

        $response_text .= '</ul>';
        $header_text = 'There are errors with your feedback.';
        $error_state = TRUE;

        ##
        ## Remove message data from session so user is not reminded a second time
        unset($_SESSION['messages']['error']);
        if (!count($_SESSION['messages'])) {
            unset($_SESSION['messages']);
        }

    } else {
        ##
        ## Prepare feedback data for insertion
        $data = array(
            'first_name' => $form_state['values']['first_name'],
            'last_name' => $form_state['values']['last_name'],
            'organization' => $form_state['values']['organization'],
            'email' => $form_state['values']['email'],
            'telephone' => $form_state['values']['telephone'],
            'comments' => $form_state['values']['comments'],
            'created' => time()
        );

        ##
        ## Insert feedback record
        drupal_write_record('feedback', $data);

        $response_text = "Your feedback has been received.";
        $header_text = 'Feedback Received';
        $error_state = FALSE;
    }

    ##
    ## Return AJAX response for interpretation by Drupal.ajax JavaScript object
    return array(
        '#type' => 'ajax', 
        '#commands' => array(
            array(
                'command' => 'modal',
                'text' => $response_text,
                'headerText' => $header_text,
                'errorState' => $error_state
            )
        )
    );
}

landing page

<?php module_load_include('inc', 'feedback', 'feedback.admin'); ?>

<div class="column">
    <?= render(drupal_get_form('feedback_form')) ?> 
</div>

1 Answer 1

4

Your landing page module doesn't look like a module, it looks like a .tpl file. If that's the case, you want to include the form before the theming layer. If this is being passed through a theme() function in your landing page module, perform drupal_get_form before calling theme(). So inside landingpage.module:

function landingpage_feedback_page() {
  module_load_include('inc', 'feedback', 'feedback.admin');
  $vars['feedback_form'] = drupal_render(drupal_get_form('feedback_form'));
  return theme('landingpage_feedback_page', $vars);
}

// Implements hook_theme() to define your custom theme function and template file.
function landingpage_theme($existing, $type, $theme, $path) {
  $items['landingpage_feedback_page'] = array(
    'variables' => array('vars' => null),
    'template' => 'theme/feedback_page',
    'path' => drupal_get_path('module', 'landingpage'),
  );

  return $items;
}

And inside theme/feedback_page.tpl.php:

<div class="column">
    <?php print $feedback_form; ?>
</div>
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.