There are a great deal of articles out there on theming the Drupal User Login Form, but most don't give you granular control over each individual form element. Rather, you are restricted to mainly editing the css. Here is a way to have complete granular control over each element within the user login form...
1. Place this function either in a module or in your template.php:
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['pass'] = array(
'#type' => 'password',
'#required' => TRUE,
'#attributes' => array('tabindex' => '2'),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Log in'),
'#weight' => 2,
'#attributes' => array('tabindex' => '3')
);
$form['#validate'] = user_login_default_validators();
$form['#build_id'] = sprintf('form-%s', md5(uniqid(mt_rand(), TRUE)));
$form_state = array();
drupal_prepare_form($form_id, $form, $form_state);
drupal_process_form($form_id, $form, $form_state);
$out = new stdClass;
$out->form_start =
sprintf("<form method='post' accept-charset='UTF-8' action='%s'>",
url('user/login'));
$out->form_end = "</form>";
$out->name = drupal_render($form['name']);
$out->pass = drupal_render($form['pass']);
$out->submit =
drupal_render($form['form_id']) .
drupal_render($form['form_build_id']) .
drupal_render($form['submit']);
return $out;
}
2. In your .tpl.php file, output the fields
<?php
$login_form = get_user_login_form();
?>
<?php print $login_form->form_start; ?>
Username: <?php print $login_form->name; ?><br />
Password: <?php print $login_form->pass; ?><br />
<?php print $login_form->submit; ?>
<?php print $login_form->form_end; ?>
18 comments:
Fatal error: Call to undefined function sprint() in C:\AppServ\www\po\sites\all\themes\ad_the-morning-after\template.php on line 24
Line 24:
$form['#build_id'] = sprint('form-%s', md5(uniqid(mt_rand(), TRUE)));
Cauly,
Thanks. I have fixed this now.
Thanks a lot but it doesn't work for me, maybe I misunderstood something. In which .tpl.php file your code of step 2 is to be pasted ? I pasted it in a user_login.tpl.php file, is that correct ?
I'm fairly new to Drupal and have been unable to create a customizable login form for Drupal 6.x. Just for the sake of clarity, which .tpl.php file does the second step refer to?
Thanks.
First off all thank you for helping me alot in my drupal form !
I have a problem. How can this form can be customized to include the login welcome message from: http://drupal.org/node/92657
Here is the code:
function garland_user_bar() {
global $user;
$output = '';
if (!$user->uid) {
$output .= drupal_get_form('user_login_block');
}
else {
$output .= t('< p class= "user-info">Hi !user, welcome back.< /p >', array('!user' => theme('username', $user)));
$output .= theme('item_list', array(
l(t('Your account'), 'user/'.$user->uid, array('title' => t('Edit your account'))),
l(t('Sign out'), 'logout')));
}
$output = '< div id= "user-bar">'.$output.'< /div>';
return $output;
}
I know that the destionation for form must be like this:
$output .= drupal_get_form('get_user_login_form');
I dont know how to concatenate this into your form ! Thank you very much
it does not change anything as for me. Can you tell me what can be the reason ?
Thanks, works fine.
But how can I output the "forgot password" link?
I tried this method, and while I was able to get the intro text I wanted to show up before the login form, I ran into a couple of other problems.
The main factor causing them seems to be that Drupal doesn't recognize the output of this technique as being the "real" user login form, so things that should appear in that, like the links to create a new account or retrieve a login, or the "Remember Me" checkbox added by the Persistent Login module, don't show up in it.
It may be the fault of how I implemented it - the instructions said to place the second code snippet "In your .tpl.php file", which appears to be missing a filename. :-) I had already, before trying this method, tried a whole bunch that involved creating additional .tpl.php files with names like user_login.tpl.php, user_login_block.tpl.php, etc., and could not for the life of me get any of them to show up. And I can't just add it to page.tpl.php, because there's no way to get it to take its proper place in the left sidebar where the block is supposed to appear when the content of the left sidebar is just given as $left.
So I ended up creating a custom block for it. Maybe that caused the problem? Is there somewhere I could have put the code snippet which would have caused Drupal to treat it as the actual login block and include the appropriate elements?
Hi Brendon!
Thank you very much for this snippet.
It works good on my website, just few questions...
- How could i change the color of the textfield? I tried to add a '#class' in template.php but it did not work...
- There is a big space between "username:" and the textfield (between password and the textfield as well)...how could we correct this?
Thank you very much
Matt
Nice, it showed up on my site, positioned and themed it, but loggin in doesnt work..
For Drupal 6 users have a look at:
http://drupal.org/node/478328
One of the few solutions I found that works straight out the box!
^^ @Shawn, this solution is for D6 and WORKS. The solution you point to is not a very "Drupal Way," though this solution has it's issues.
However, all solutions (written up) that I've seen so far (form overrides) do not consistently validate. This method validates and submits, allowing login.
Works for me in Drupal 6. Thanks
an old post, but looks like the .tpl.php question is still not responded.
so here it is:
block-user-0.tpl.php
nice article... but how can i completely control(customize) the html tag output? and also how to include the "Create new account" and "Request new password" links with this code?
thanks
vic
Hope you don't mind me spamming a link, but I've just finished an article that covers a similar topic for Drupal 7.
It's called Get more sign-ups from Drupal 7: make ‘Create new account’ eye catching but also covers some general theming stuff.
Hopefully this is useful to someone!
Hey, this script does not print a error message or a succes message can u help about this matter?
thanks!
It's doesnt work because error message is not showing in my custom template but i'm redirect to the default login page to show the error message when user with bad login/ pass
Have you found a way to bypass this litte issue *
Thank you
Post a Comment