Support for Drupal 7 is ending on 5 January 2025—it’s time to migrate to Drupal 10! Learn about the many benefits of Drupal 10 and find migration tools in our resource center.
Here is an example how to build unified login page in CTools Automodal. Note that we need to handle form building by ourselves but we are using ctools_automodal_get_page() to render the final output.
/**
* Implement hook_menu()
*/
function mymodule_menu() {
$items = array();
$items['user/m/signup'] = array(
'title' => 'Signup',
'page callback' => 'mymodule_unified_login_page',
'access callback' => 'user_is_anonymous',
'type' => MENU_NORMAL_ITEM,
'modal' => TRUE,
'menu_name' => 'user-menu',
);
return $items;
}
/**
* Menu callback for user/login creates a unified login/registration form.
* Inspired by logintobbogan's logintoboggan_unified_login_page().
* @see logintoboggan_unified_login_page()
*/
function mymodule_unified_login_page() {
global $user;
$ajax = FALSE;
if (substr(request_path(), -5) == '/ajax') {
$ajax = 'ajax';
}
// User is logged in already.
if ($user->uid) {
if ($ajax) {
$commands[] = ctools_modal_command_dismiss();
$commands[] = ctools_ajax_command_redirect('<front>');
print ajax_render($commands);
exit();
}
else {
drupal_goto('<front>');
}
}
// User is not logged in.
if ($ajax) {
ctools_include('modal');
ctools_include('ajax');
ctools_add_js('ajax-responder');
$form_state_1 = $form_state_2 = array(
'ajax' => $ajax,
'build_info' => array('args' => array()),
're_render' => FALSE,
'no_redirect' => TRUE,
);
$login_form = drupal_build_form('user_login', $form_state_1);
// Build the second form only when the first form isnt executed. Otherwise
// we will be redirected, because both form builders contains drupal_goto()
// for already logged-in users.
if (empty($form_state_1['executed'])) {
$register_form = drupal_build_form('user_register_form', $form_state_2);
}
// Handle submitted form.
if (!empty($form_state_1['executed']) || !empty($form_state_2['executed'])) {
$commands[] = ctools_modal_command_dismiss();
$commands[] = ctools_ajax_command_reload();
print ajax_render($commands);
exit();
}
// If there are messages for the form, render them.
if ($messages = theme('status_messages')) {
$messages = '<div class="messages">' . $messages . '</div>';
}
$variables = array(
'login_form' => drupal_render($login_form),
'register_form' => drupal_render($register_form),
);
return $messages . theme('mymodule_unified_login_page', $variables);
}
else {
$login_form = drupal_get_form('user_login');
$register_form = drupal_get_form('user_register_form');
$rendered_login_form = drupal_render($login_form);
$rendered_register_form = drupal_render($register_form);
$variables = array(
'login_form' => $rendered_login_form,
'register_form' => $rendered_register_form,
);
return theme('mymodule_unified_login_page', $variables);
}
}
/**
* Implemenation of hook_theme().
*/
function mymodule_theme($existing, $type, $theme, $path) {
return array(
'mymodule_unified_login_page' => array(
'variables' => array(
'login_form' => NULL,
'register_form' => NULL,
),
),
);
}
/**
* Theme function for unified login page.
* Inspired by logintoboggan theme_lt_unified_login_page()
* @see theme_lt_unified_login_page()
*/
function theme_mymodule_unified_login_page($variables) {
$output = '';
$login_form = $variables['login_form'];
$register_form = $variables['register_form'];
$output .= '<div id="login-message">' . t('You are not logged in.') . '</div>';
// Add the login and registration forms in.
$output .= '<div id="register-form">' . $register_form . '</div>';
$output .= '<div id="login-form">' . $login_form . '</div>';
$output .= '</div>';
return $output;
}
Comments
Comment #1
wojtha CreditAttribution: wojtha commentedBetter title
Comment #2
nikkubhai CreditAttribution: nikkubhai commentedThank you so much for this code. Worked perfectly.
I was thinking what could be the best way to display the modal automatically on pageload without clicking on the link. Can you help me?
Comment #3
wojtha CreditAttribution: wojtha commentedHi,
I will try to emulate the user click on the link.
To get more control when to display the form, it might be better to use http://drupal.org/project/splashify. I dont have experience with this one, but I was using its predecessor http://drupal.org/project/splash.
Comment #4
IA CreditAttribution: IA commentedThanks a lot for the code. It is still actual.