2010-05-10 6 views
5

Im utilisant drupal 6.16. Le code ci-dessous pour hook_form_alter ne fonctionne pas. Im simplement essayer de changer le « Connexion » à « Se connecter » sur le bouton d'envoi du formulaire de connexion utilisateurhook_form_alter ne fonctionne pas

<?php 
//$Id$ 

function helloworld_form_alter($form_id,&$form) { 
    switch ($form_id) { 

     case 'user_login_form': 

    // Change 'Log in' to 'Sign in'. 
    $form['submit']['#value'] = t('Sign in'); 


     break; 
    } 
} 

Une manière de résoudre ce problème?

Aidez-nous s'il vous plaît. Merci.

Répondre

5

Je trouve plus facile à utiliser les fonctions de thème pour modifier les formes - dans le template.php de votre thème vient créer ceci:

function YOURTHEMENAMEHERE_user_login_form($form) { 
    $form['submit']['#value'] = t('Sign in'); 
    //dsm($form); 
    return drupal_render($form); 
} 

l'a commenté la ligne (GAD) est le Drupal devel module - que je avais recommande également l'installation. Une fois que vous avez installé ceci et défini des autorisations sur votre rôle d'administrateur pour que vous puissiez l'utiliser, vous obtenez un nouvel onglet qui vous montre exactement comment la page est construite et quelles matrices font quoi.

Suivez la piste dans les tableaux et vous pouvez presque tout thème sur votre site.

EDIT - oh ok: P La seule chose que je remarque, n'ayant pas utilisé ce hook auparavant, c'est que l'exemple dans l'API a 3 variables dans la fonction, mais vous en avez 2! Avoir un décalage signifie que vous êtes probablement nourris la mauvaise variable:

function modulename_form_alter(&$form, $form_state, $form_id) { 
    switch ($form_id) { 
    case 'contact_mail_page': 
    $form['submit']['#value'] = t('Sign in'); 
    break; 
    } 
} 
+0

Merci pour la réponse hfidgen. Eh bien, mon but n'est pas de changer le texte du bouton de connexion. Je faisais ça juste pour m'assurer que form_alter était appelé. Donc, j'ai besoin d'écrire du code pour form_alter. –

+0

heh np - J'ai fait une édition là-bas, est-ce que ça aide? – MrFidge

+0

La signature fixe devrait aider (+1), mais il doit également corriger les identifiants de formulaire qu'il vérifie - voir ma réponse séparée pour cela. –

6

Il y a deux erreurs dans votre code:

  1. Votre signature de la fonction est erroné, comme cela a déjà souligné hfidgen (+1). Il doit être yourModuleName_form_alter(&$form, &$form_state, $form_id), donc dans votre exemple le commutateur sur l'ID de formulaire ne se déclenchera jamais.
  2. Vous vérifiez pour la mauvaise forme id. Il y a deux étapes de ids vous devez vérifier dans ce cas, et les deux sont différents de celui que vous utilisez:
    1. user_login_block pour le petit formulaire de connexion disponible en tant que bloc (couramment utilisé sur la plupart des pages)
    2. user_login pour la page de connexion explicite (généralement sous « utilisateur/login »)

les deux formes sont pratiquement identiques dans la structure, de sorte que vous pouvez généralement changer à la fois dans le même hook_form_alter mise en œuvre - il suffit d'ajouter une autre déclaration de cas pour vérifier la deuxième version.

+0

Il semble nécessaire d'effacer les caches si hook_form_alter est créé après l'installation du module. – ndvo

0

Il est préférable de le faire avant de commencer toute modification de forme: Regardez le code source de votre formulaire et vérifiez la valeur du champ masqué id_formulaire - cela vous donne le form_id exact que vous devez utiliser.

3

Pour un changement aussi trivial, vous ne devriez pas écrire un module. Le prix que vous payez en termes de perte de performance et de temps perdu est simplement trop élevé pour l'objectif cible.

Vous pouvez effectuer un remplacement de chaîne qui affectera la chaîne traitée par la fonction t(). Ceci est fait le fichier de configuration settings.php du site.

Voici comment remplacer "Connexion" par "Connexion" ...

$conf['locale_custom_strings_en'] = array(
    'Log In'  => 'Sign In', 
); 

Ceci affectera uniquement les chaînes anglaises. N'hésitez pas à remplacer le _en avec un code de langue spécifique (_fr, _ja, _es) pour faire la même chose pour les autres langues.