Première étape : Surcharge du formulaire de login
Une surcharge s'effectue toujours dans le fichier template.php, si vous n'avez pas ce fichier, il suffit de le créer.
Avant de surcharger quelque chose, il faut bien savoir ce que l'on veux surcharger.
Dans notre cas, la fonction à surcharger se trouve dans le module "user" :
modules/user.module ligne 868
function user_login($msg = '') {
//…(plen de code pas joli)
return drupal_get_form('user_login', $form);
}
?>
Et voilà, c'est donc ceci qu'il nous faudra surcharger.
Dans notre template.php, rajoutons ceci :
template.php
function phptemplate_user_login($form) {
return _phptemplate_callback('user_login', array('form' => $form));
}
?>
Le return de la fonction fait peur ? _return_phptemplate_callback(‘user_login’,array(‘form’ => $form));? Oui, il fait peur, et c'est normal.
Pour faire plus simple, voici le pattern de ce return, on y vera plus clair après :
_return_phptemplate_callback(‘[le nom du fichier .tpl.php]’,array(‘[le nom de la variable envoyée au fichier .tpl.php]’ => [‘le nom de la variable retournée par la fonction appelante’]));
Donc ... on va créer un petit fichier nommé user_login.tpl.php
user_login.tpl.php
Si on se rend maintenant sur la page www.votre_site.com/user/login, on obtiendra
Plutôt pas mal pour un début, non ?
Etape 2 : Attaquons le formulaire en lui-même
Pour l'instant, on a rajouté un petit morceau au dessus du formulaire, on aurait pu faire de même pour en mettre un en-dessous, mais comment faire si on souhaite modifier plus en profondeur le formulaire en lui-même ?
Dans le fichier user_login.tpl.php, rajoutons cette petite ligne
user_login.tpl.php
Cela donnera quelque chose du genre :
(
[#type] => textfield
[#title] => Nom d'utilisateur
[#size] => 60
[#maxlength] => 60
[#required] => 1
[#attributes] => Array
(
[tabindex] => 1
)
[#description] =>
[#post] => Array
(
)
[#programmed] =>
[#tree] =>
[#parents] => Array
(
[0] => name
)
[#weight] => 0
[#processed] =>
[#input] => 1
[#autocomplete_path] =>
[#name] => name
[#id] => edit-name
[#value] =>
[#sorted] => 1
)
En plus long...
On va donc aller effectuer quelque changement là dedans,
template.php
//Suppression des champs descriptions
$form['pass']['#description'] = '';
$form['name']['#description'] = '';
//On change le nom du bouton submit
$form['submit']['#value'] = 'Chatouillez moi !';
return _phptemplate_callback('user_login', array('form' => $form, 'login_node' => $login_node ));
}
Et effectuons les modifications adéquates dans le user_login.tpl.php
user_login.tpl.php
Etape 3 : Finalisation
C'est bien beau tout ça, mais maintenant, comment on l'intégrer dans notre site ?
Simple, il suffit d'insérer ce qui suit dans notre page.tpl.php à l'endroit voulu.
page.tpl.php
Dernière chose important, il faut enlever, dans l'interface d'administration, toute intégration du formulaire de login dans un bloc (on vient de spécifié en dur l'emplacement dans notre page.tpl.php, on est plus lié à un bloc)
16 March, 2008 - 02:33
Bonjour,
00:26, j'i découvert ton site il y a deux heures et ai commencé àcomprendre pas mal de chose.
Concernant le fomulaire je n'ai pas encore passé l'étape 3:finalisation; j'ai dsactivé lintégration du formulaire le dans la page user_login.tpl.php.
Comment te prendrais tu pour afficher le fomulaire de login uniquement dans le front et dans un aure node par exemple: node/3, et en plus pour chaque noeud l'emplacement du formulaire change.
Faut 'il mettre la condition dans page.tpl.php?
Je pense ue c'est cette piste, qu'en pensez vous ?
Anka
- répondre
»16 March, 2008 - 12:26
Au niveau de l'étape 3, donc, dans le fichier page.tpl.php, tu peux mettre des conditions si tu souhaite afficher le formulaire de log-in uniquement sur certaine page ou sur le front uniquement.
Par exemple :
if ($is_front || (arg(1) == "node" && arg(2) == 3 ) ) {
print $user_login_form;
}
?>
On a donc "Si (Je_suis_sur_front OU (l'argument 1 = node ET l'argument 2 = 3) t'affiche le formulaire"
"arg" décompose les urls de drupal (clean url activé ou non, alias ou non, c'est pareil, il decompose toujours de la meme facon)
exemple avec une url du type : domaine.com/?q=node/1/edit
arg(1) = node
arg(2) = 1
arg(3) = edit
(et donc, si on a les clean url ou des alias activé, drupal recupere quand meme, de maniere transparente, les url en q=quelque/chose)
Je n'ai pas testé, mais il n'y a pas de raison que ca ne marche pas.
Par contre, qu'entend tu par "pour chaque noeud l'emplacement du formulaire change." ? Je ne vois pas trop là.
N'hésites pas si tu as encore des questions.
- répondre
»16 March, 2008 - 19:08
Bonjour Haza,
Merci pour ta réponse rapide et bien détaillée, cela fait plaisir.) dans l'admin et j'ai ajouté ce bout de code dans le fichier page.tpl.php:
Mais cependant je ne n'ai pas encore passé l'étape 3. J'ai désactivé l'affichage du bloc user login(
print $content;
if ($is_front || (arg(1) == "node" && arg(2) == 3 ) )
{?>
<div style="border: 1px solid #000; margin-left:134px;">
<?php
print $user_login_form;
} ?>
</div>
mais le formulaire de login n'apparait toujours pas en allant à la page :
http://localhost/site/?q=node/3
Je pense que j'ai sauté une étape; dois je avoir une page front.tpl.php ?
Lorsque j'ai écris:
"pour chaque noeud l'emplacement du formulaire change."
en fait c'est juste changer la position du formulaire au pixel près; c'est pour cela que dans le code ci dessus j'ai inséré une div avec une règle de style.
Je continue à chercheret tester
Je te remercie encore
- répondre
»16 March, 2008 - 19:44
Comme tu cherches vraiment a placer tres precisement ton bloc de login, je pense qu'il serait bon que tu ais une approche un peu différente.
Ce que je te propose :
- Tu conserve ce que tu as déjà fait
- Créer une nouvelle région "Login" (voir : http://www.web-42.com/content/declarer-des-nouvelles-regions )
Ce qui donnerait :
(attention au nom de la fonction, remplacer le "montheme" par le nom de ton theme !)
return array(
'left' => t('left sidebar'),
'right' => t('right sidebar'),
'content' => t('content'),
'header' => t('header'),
'footer' => t('footer'),
'login' => t('login'),
);
}
Et le code dans la page.tpl.php
<?php print $login; ?>
</div>
- Aller dans l'admin > Block, et mettre le "user login" dans la nouvelle région créer "login"
- Là, tu peux, via le lien "configure" decider sur quelle page va apparaitre ce block (super pratique, et plus simple à gérer)
- tu peux utiliser ton "user_login.tpl.php" pour themer le formulaire en lui même
- Et pour le reste, tu te retrouves avec une div que tu peux mettre où tu veux dans le page.tpl.php (le code que tu as insérer juste un peu plus haut), et tu peux donc jouer avec en css aussi, bien sur.
- répondre
»16 March, 2008 - 20:17
Great,
Merci Haza, ça marche; par contre j'ai du changer la condition pour que ça fonctionne par:
print $content;
if ($node->nid == 3 ) {?>
<div style="border: 1px solid #ff0000; margin-left:634px; width:250px;">
<?php
print $login;
}
if ($node->nid == 1 ) {?>
<div style="border: 1px solid #ff0000; "margin-left:234px; width:250px;">
<?php
print $login;
}
?>
</div>
Nickel, Merci encore
Est -il possible de mettre les textes "username" et "password" respectivement à gauche de leur champ de texte et non au dessus comme pour le formulaire de cette page? Est ce que Drupal donne la possibilité de cela; Je pense que c'est possible en modifiant une fonction du module mais j'avais lu quelque part:
"Règle numéro 1: on ne touche pas aux modules"
Qu'en penses tu ?
Anka
- répondre
»16 March, 2008 - 20:42
Oui, on touche pas aux modules ^^
Pour mettre les textes a gauche du champs textes, fait des essais en mettant un float:left sur les label, ca devrais marcher. C'est du css pur et dur, ca se fait sans trop de probleme. (les "input" sont rendu par defaut en block, dont il reviennent a la ligne, suffit de "casser" ça, et zou)
- répondre
»16 March, 2008 - 20:54
Super,
J'y avais pas pensé, et zou le tour est joué et merci encore
Anka
- répondre
»Poster un nouveau commentaire