[Résolu] [Résolu] [Résolu] Le formulaire user_login_block

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour chers membres de la communauté drupalienne,

J'aurais besoin d'un peu d'aide pour gérer un formulaire récalcitrant.

Objectif : Modifier le formulaire user_login_block en enlevant les labels, en mettant identifiant dans le input, en changeant le texte du submit et en remplaçant les 2 liens par un seul qui point sur /?q=user, pour la mise en forme, je chercherai avant de demander.

J'ai fait quelques recherches et j'ai abouti à un module et un problème. Le module compact_form répond à une partie de mes attentes (enlève les labels et les place dans les input, parfait). Seul soucis, si le javascript est désactivé, ça revient à la normale.

Alors je me suis lancé dans le code (attention ça fait peur !). J'ai "créé" un module pour faire un form_alter. (j'aurais pu utilisé le template.php mais je pense devoir modifier d'autres formulaires, alors autant découvrir comment on fait)

Pour l'instant j'ai : (module : modform)

function modform_form_user_login_block_alter(&$form, $form_state) {
$form['name']['#title'] = t('');
$form['pass']['#title'] = t('');
$form['submit']['#value'] = 'OK';
}

Ce qui "enlève" le label et met le bouton submit à "OK". Par contre pour insérer quelque chose dans les inputs, je bloque. J'ai essayé $form['name']['#value'] mais après le champ garde cette valeur pour le submit.

Donc voici mes questions :

1) ma manière de faire est-elle correcte pour l'instant ? Suis-je sur la bonne voie ?

2) #title a l'air de changer le label, est-ce bien ça ? Est-il possible de juste supprimer le label ?

3) Comment insérer un texte dans la balise input ?

4) Comment enlever les liens et en rajouter un ?

5) existe-il une page, un tableau qui recense les différents attributs des formulaires principaux ? Pour essayer de trouver le bon, j'ai utilisé print_r($form) mais j'ai pu trouvé que ceux ci-dessus, ce qui semblait référer aux liens était :

[links] => Array ( [#value] =>

    * Créer un nouveau compte
    * Demander un nouveau mot de passe

et bien sûr un $form['link']['value'] marchait pas vraiment.

Je vous remercie d'avance pour le temps que vous allez m'accorder (enfin j'espère).

Forum : 
Version de Drupal : 

Bon alors, j'ai à peu près trouvé comment tout changer nettement plus facilement. Je sais pas s'il était possible de faire avec la manière que j'ai commencée mais en voici une autre.

Dans template.php :

function nomtheme_theme() {
  return array(
      'user_login_block' => array(
      'arguments' => array('form' => NULL),
            'template' => 'user-login-block',
       ),
);
}

La ligne 'template' => 'user-login-block', fait que l'on va appeler la page user-login-block.tpl.php pour gérer le rendu.

Donc on crée dans le répertoire du thème user-login-block.tpl.php, puis on insère (code basique modifiable directement dedans (n'étant pas dans le core de drupal)) :

<div>
  <div class="form-item" id="edit-name-wrapper">
    <label for="edit-name">Username or e-mail: <span class="form-required" title="This field is required."></span></label>
    <input maxlength="60" name="name" id="edit-name" size="15" value="" tabindex="1" class="form-text required" type="text">
  </div>
  <div class="form-item" id="edit-pass-wrapper">
    <label for="edit-pass">Password: <span class="form-required" title="This field is required.">
</span></label>
    <input name="pass" id="edit-pass" maxlength="60" size="15" tabindex="2" class="form-text required" type="password">
  </div>
  <input name="op" id="edit-submit" value="<?php print $form['submit']['#value'];?>" tabindex="3" class="form-submit" type="submit">
  <div class="item-list">
    <ul>
      <li class="first"><a href="/user/register" mce_href="user/register" title="Create a new user account.">Create new account</a><br mce_bogus="1"></li>
      <li class="last"><a href="/user/password" mce_href="user/password" title="Request new password via e-mail.">Request new password</a><br mce_bogus="1"></li>
    </ul>
  </div>
  <input name="form_build_id" id="<?php print $form['form_build_id']['#id']; ?>" value="<?php print $form['form_build_id']['#value']; ?>" type="hidden">
  <input name="form_id" id="edit-user-login-block" value="user_login_block" type="hidden">
</div>

Il n'y a plus qu'à changer ce qu'on veut et rajouter du CSS et le tour est joué !
En espérant que ça serve à quelqu'un.

PS : Avec l'autre méthode, pour enlever les liens, on peut utiliser
unset($form['links']);

Hello dyesdyes,

Ta deuxième solution n'est pas super clean, je te la déconseille : en gros, tu as recréé un en dur dans ton template un formulaire qui existe déjà dans le code de Drupal, et maintenant ton formulaire est complétement "déconnecté" de Drupal.

Ta première idée était la bonne : pour modifier un formulaire existant, on fait un hook_form_alter(). La propriété que tu cherchais pour modifier la valeur par défaut d'un champ, c'est #default_value (et non #value qui donne une valeur fixe et permanente à un champ).

La technique serait exactement la même sur Drupal 7 (c. à d. faire un hook_form_alter(), qui n'a pas changé entre D6 et D7).

Vincent

Ok merci !

Quels sont les désavantages de la technique que j'ai utilisée (outre le fait que ça fasse sale) ?

Concernant les liens, comment faire pour en rajouter et en supprimer dans ce cas ?
j'avais essayé avec un #link mais sans succès.

Concernant un rajout de javascript, comment rajouter une fonction avec un onload="" sur le body sans le caler dans le page.tpl.php ? Car j'imagine que n'ayant pas accès au formulaire en brut, je vais devoir faire une fonction qui devra être chargée/activée au chargement de la page.

Pour trouver la valeur #default_value ou toute autre dont j'aurais besoin, existe-t-il un moyen de les afficher ou une page drupal les référençant ?
Concernant les liens, comment faire pour en rajouter et en supprimer dans ce cas ?
j'avais essayé avec un #link mais sans succès.

Merci pour ta réponse en tout cas.

Hello,

Le désavantage de ta solution est celui évoqué précédemment : tu fais deux fois la même chose, et les deux façons de faire sont déconnectées.

  • Imagine que tu installes un module qui modifie le formulaire de login (par exemple, en permettant de s'identifier avec un e-mail plutôt qu'un username). Ces modifications n'apparaîtront pas dans ton formulaire de login à toi puisque tu l'as codé en dur dans un template.
  • Si un développeur Drupal reprend ton code, il aura du mal à le comprendre, puisque tu n'as pas suivi la "bonne pratique".

Certes, au final, ta solution marche. C'est juste une question de bonne pratique, de ton niveau de connaissances de Drupal, et de choix personnel.

Pour modifier les liens apparaissant sous le formulaire de login, c'est toujours le hook_form_alter(). Pour introduire des bouts de HTML dans un formulaire (ici, des liens), Drupal utilise des champs spéciaux de type "markup". Ces champs sont déclarés avec la même syntaxe que les "vrais" champs de formulaire (textfield, radio...) même s'ils ne contiennent qu'un bout de code HTML brut. Regarde le code qui a servi à fabriquer le formulaire de login sur http://api.drupal.org/api/drupal/modules--user--user.module/function/use... et tu verras que les liens sont contenus dans un champ appelé $form['links']. Tu peux modifier ou supprimer ce champ comme tu as modifié les autres ($form['name'], $form['pass']...), avec le hook_form_alter().

Pour faire du JavaScript, y a deux solutions. Si ton JavaScript change la définition du formulaire (c. à d. rajoute, modifie, ou retire des champs dans le formulaire), alors il faut utiliser les propriétés #ahah des champs, mais c'est un peu une tannée... Si tu veux juste ajouter quelques améliorations "ergonomiques" qui ne changent pas la définition du formulaire (par exemple : vérifier qu'un champ n'est pas vide avant la soumission), alors tu crées ton fichier JS avec le code qui va bien et tu le références avec la commande drupal_add_js() (que tu peux mettre dans ton hook_form_alter() par exemple). Dans tous les cas, on ne met pas des bouts de JavaScript en plein milieu du HTML (que ce HTML contienne un formulaire ou autre chose), c'est ce qu'on appelle le JavaScript "non intrusif" (http://www.lyxia.org/blog/developpement/javascriptajax/bonnes-pratiques-...).

Pour connaître toutes les propriétés que tu peux utiliser sur un champ de formulaire (#default_value, #ahah...), faut consulter la doc : http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....

Je ferais encore une fois un hook_form_alter() pour modifier l'ordre des champs dans le formulaire (en changeant leur propriété #weight), de sorte que le bouton submit arrive JUSTE APRÈS le champ "mot de passe".

Le code à l'intérieur du hook_form_alter() ressemblera à ça :

<?php
$form
['name']['#weight'] = -3;
$form['pass']['#weight'] = -2;
$form['submit']['#weight'] = -1;
?>

(je mets des poids négatifs de sorte que les liens arrivent -- dont le #weight est 0 -- arrivent toujours APRÈS les autres champs)

Une fois que les champs sont dans le bon ordre, tu devrais t'en sortir en CSS (par exemple, en floatant à gauche le div qui contient le champ "mot de passe", ou qqchose comme ça).

Le sujet m'intéresse vivement, puisque je me retrouve dans le besoin de modifier la disposition des champs dans le bloc de 'connexion utilisateur'. ne pourrait-on pas le faire autrement? D'une manière à simplement retrouver le template de ce bloc pour ne modifier que le positionnement ou l'ordre des lignes de codes affichant les champs; ou plutôt simplement le formulaire responsable?
Je voulais donc demander: où trouver le template ou le formulaire responsable du bloc de connexion?