Submitted by dyesdyes on
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).
Bon alors, j’ai à peu près
Permalien Soumis par dyesdyes le 28 Octobre, 2010 - 14:16
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']);
et pour drupal 7 comment on
Permalien Soumis par slatrach le 28 Octobre, 2010 - 23:39
et pour drupal 7 comment on procède,
merci
Je dois avouer ne pas du tout
Permalien Soumis par dyesdyes le 29 Octobre, 2010 - 01:19
Je dois avouer ne pas du tout connaître les modifications de drupal 7.
Pour chercher, utilise des mots comme "custom user_login_block" ou "custom form template.php" avec drupal 7 en plus.
Hello dyesdyes, Ta deuxième
Permalien Soumis par drupalfrance le 31 Octobre, 2010 - 14:08
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
Permalien Soumis par dyesdyes le 1 Novembre, 2010 - 13:23
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
Permalien Soumis par drupalfrance le 2 Novembre, 2010 - 12:13
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.
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 lehook_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 commandedrupal_add_js()
(que tu peux mettre dans tonhook_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....merci pour ta réponse c’et
Permalien Soumis par slatrach le 2 Novembre, 2010 - 15:42
merci pour ta réponse c'et claire!
et pour la mise en forme du formulaire de connexion quel fichier faut modifier pour mettre le bouton submit juste après le mot de passe et non pas a la ligne (drupal 7)
merci
Je ferais encore une fois un
Permalien Soumis par drupalfrance le 2 Novembre, 2010 - 16:50
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 :(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).
Alors là MERCI, explication
Permalien Soumis par dyesdyes le 2 Novembre, 2010 - 21:56
Alors là MERCI, explication claire, nette et précise.
Un grand merci pour tout ! J'essaye tout ça !
Encore merci !
Le sujet m’intéresse
Permalien Soumis par Laila le 4 Mars, 2013 - 17:03
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?