[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