Mise en "form" - le formulaire du login

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

<?php
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

<?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

<h1>Hello world!</h1>
<?php
    print_r(drupal_render($form));
?>

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

print "<pre>"; print_r(array_values($form));print "</pre>";

Cela donnera quelque chose du genre :

[13] => Array
        (
            [#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

function phptemplate_user_login($form) {
   //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

<div id="user_login">
<?php
// Enlever les commentaires pour voir les valeurs brutes
// print "<pre>"; print_r(array_values($form));print "</pre>";
    print_r(drupal_render($form['name']));
    print_r(drupal_render($form['pass']));
    print_r(drupal_render($form));
?>
</div>

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

<?php print $user_login_form; ?>

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)

anka (non vérifié) Says:

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

»

Haza Says:

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 :

<?php

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.

»

Anka (non vérifié) Says:

Bonjour Haza,

Merci pour ta réponse rapide et bien détaillée, cela fait plaisir.
Mais cependant je ne n'ai pas encore passé l'étape 3. J'ai désactivé l'affichage du bloc user login() dans l'admin et j'ai ajouté ce bout de code dans le fichier page.tpl.php:

<?php
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

»

Haza Says:

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 !)

function montheme_regions() {
  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

<div id="login">
  <?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.

»

Anka (non vérifié) Says:

Great,
Merci Haza, ça marche; par contre j'ai du changer la condition pour que ça fonctionne par:

 <?php
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

»

Haza Says:

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)

»

chi_asher@hotmail.com (non vérifié) Says:

Super,

J'y avais pas pensé, et zou le tour est joué et merci encore

Anka

»

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
CAPTCHA
Suite a de nombreux spam (plusieurs centaines/heure), je suis dans l'obligation d'imposer un captcha, en attendant de trouver une parade