[development] core user_login customization -- getting breakout theming AND custom validator working at the same time?
Ben DJ
bendj095124367913213465 at gmail.com
Wed May 19 17:45:02 UTC 2010
i'm trying to:
custom theme my user_login form
AND
add a custom validation step to my user_login form
rather than re-inventing the wheel, i'm following the theming method @
"Theming the Drupal 6 User Login Form"
http://blog.aphexcreations.net/2009/04/theming-drupal-user-login-form.html
and the Authentication example @,
"Pro Drupal Development"
Ch6: External Login: Simple External Authentication
i'm confused about their combination -- specifically, getting the
themeable login form to USE the custom login authenticator.
so far i've:
added to a custom.module
...
function custom_theme() {
return array(
'user_login' => array(
'template' => 'user-login',
'arguments' => array('form' => NULL),
),
);
}
function custom_user_login(&$variables) {
$variables['rendered'] = drupal_render($variables['form']);
}
...
as well as the form element "breakout" function,
...
function get_user_login_form() {
$form_id = 'user_login';
$form = array();
$form['name'] = array(
'#type' => 'textfield',
'#maxlength' => USERNAME_MAX_LENGTH,
'#required' => TRUE,
'#attributes' => array('tabindex' => '1'),
...
$form['#validate'] = user_login_default_validators();
$form['#build_id'] = sprintf('form-%s', md5(uniqid(mt_rand(), TRUE)));
...
return $out;
}
...
in my user-login.tpl.php, i have
...
<div>
TESTING 1 2 3 TESTING 1 2 3
<?php $login_form = get_user_login_form(); ?>
<?php print $login_form->form_start; ?>
<div><?php print $login_form->name; ?></div>
<div><?php print $login_form->pass; ?></div>
<div><?php print $login_form->submit; ?></div>
<?php print $login_form->form_end; ?>
</div>
...
which DOES display correctly @ "user/login". that's good.
from "Pro Drupal Development", I'm adding a custom validation step ...
in my custom.module:
...
function custom_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'user_login':
case 'user_login_block':
// If the user login form is being submitted, add our validation
if (isset($form_state['post']['name'])) {
// Find the local validation function's entry so we can replace it
$array_key = array_search(
'user_login_authenticate_validate',
$form['#validate']
);
if ($array_key === FALSE) {
// Could not find it. Some other module must have run form_alter()
// We will simply add our validation just before the final validator
$final_validator = array_pop($form['#validate']);
$form['#validate'][] = 'custom_login_validate';
$form['#validate'][] = $final_validator;
} else {
// Found the local validation function. Replace with ours.
$form['#validate'][$array_key] = 'custom_login_validate';
}
}
break;
}
}
...
But, what gets used/displayed by my user-login.tpl.php continues to
use the 'standard' authenticator, NOT my custom one.
I suspect that's because of:
@ function custom_form_alter -->
$form['#validate'][$array_key] = 'custom_login_validate';
"versus"
@ function get_user_login_form -->
$form['#validate'] = user_login_default_validators();
They likely need to be sync'd up.
My question is -- how?
Any pointers appreciated.
Ben
More information about the development
mailing list