2010-08-02 18 views
3

Je veux être en mesure de personnaliser le formulaire d'inscription de l'utilisateur dans Drupal 6Outrepasser le formulaire d'inscription de l'utilisateur dans Drupal 6

J'ai trouvé des milliers de tutoriels qui me montrent comment remplacer la structure dans laquelle vous pouvez produire le formulaire dans son ensemble, mais je veux déplacer des éléments de forme autour etc et je ne peux pas sembler tout à fait voir la meilleure façon de le faire

Répondre

3

en utilisant hook_form_alter vous pouvez faire ce que vous voulez une forme. Par exemple, le changement de poids peut changer la position sur la page par exemple.

Si vous essayez:

MYMODULE_form_user_profile_form_alter(&$form, $form_state) { 
// do your processing here 
var_dump($form); 
} 

remplaçant monModule avec le nom de votre module.

Vous verrez la structure du formulaire, vous pouvez modifier les valeurs là-dedans pour modifier, poids étiquettes descriptions etc.

+0

où cela va-t-il? dans template.php dans le répertoire du thème? – Tim

+0

Vous devez placer ce code dans un module personnalisé, dans Drupal 7, vous pouvez faire des choses comme ça dans votre thème. – googletorp

0

peut-être cela vous aidera: http://drupal.org/node/44910

+0

Merci. Im actuellement en utilisant le module de profil, mais ce que je veux vraiment est de contourner la mise en page du formulaire, un peu plus que ce que css peut offrir. C'est à dire que je ne veux pas regrouper les champs dans les fieldsets séparés, etc – Tim

9

développiez la réponse de Jeremy, vous allez vouloir étudier Drupal Form API et user_register(). En bref, vous construisez un tableau associé; chaque élément du tableau correspond à un élément de formulaire.

Chaque élément de formulaire dans le tableau est son propre tableau associé. Ils peuvent avoir un type: champ de texte, menu de sélection, cases à cocher, etc .: voir le Form API reference pour tous les types.

Chaque élément de formulaire peut également avoir un poids: c'est ainsi que vous commandez les éléments. Les poids inférieurs numérotés apparaissent avant les poids plus élevés numérotés dans le formulaire.

L'un des types d'éléments disponibles est fieldset: c'est ce qui vous permettra de regrouper des éléments. Lorsque vous utilisez un fieldset, il crée une section du formulaire avec ses propres valeurs de poids.

Alors, disons que vous avez un formulaire avec trois champs: Nom , Société et Adresse e-mail. Le Nom devrait apparaître en premier, Société deuxième, Adresse e-mail troisième. Vous pouvez spécifier la forme comme ceci:

$form['name'] = array(
    '#type' => 'textfield', 
    '#title' => t('Name'), 
    '#weight' => 1, 
); 
$form['company'] = array(
    '#type' => 'textfield', 
    '#title' => t('Company'), 
    '#weight' => 2, 
); 
$form['email'] = array(
    '#type' => 'textfield', 
    '#title' => t('E-mail address'), 
    '#weight' => 3, 
); 

Notez la clé #weight. Si vous vouliez Company à apparaître après Adresse e-mail, vous devez créer $form['company']['#weight'] à quelque chose de supérieur à 3.

Maintenant que vous vouliez groupe Nom et Société dans un fieldset appelé Informations personnelles.Votre forme ressemblerait maintenant quelque chose comme ceci:

$form['personal'] = array(
    '#type' => 'fieldset', 
    '#title' => t('Personal information'), 
    '#weight' => 1, 
); 
$form['personal']['name'] = array(
    '#type' => 'textfield', 
    '#title' => t('Name'), 
    '#weight' => 1, 
); 
$form['personal']['company'] = array(
    '#type' => 'textfield', 
    '#title' => t('Company'), 
    '#weight' => 2, 
); 
$form['email'] = array(
    '#type' => 'textfield', 
    '#title' => t('E-mail address'), 
    '#weight' => 3, 
); 

Notez que Nom et Company sont maintenant des éléments de tableau de $form['personal'].

Si vous voulez faire Nom apparaître après Company dans le fieldset, définissez son #weight supérieur à 2. Comme le nom fait maintenant partie d'un fieldset qui a une #weight inférieure à la E adresse mail champ, même si vous définissez $form['personal']['name']['#weight'] à 4, il ne ferait pas le Nom apparaître après Adresse e-mail.

Donc, ce que vous allez faire est d'utiliser hook_form_alter() pour modifier le formulaire user_register pour modifier les poids de certains éléments de formulaire, créer vos propres fieldsets et déplacer certains éléments de formulaire dans vos fieldsets nouvellement créés.

Il existe des moyens de faire cela dans votre thème, mais je préfère créer un module personnalisé pour cela. Créez votre module personnalisé, et mettre en œuvre hook_form_alter():

function test_form_alter(&$form, $form_state, $form_id) { 
    if ($form_id === 'user_register') { // Only modify the user registration form 
    // Before you can get down to business, you need to figure out the 
    // structure of the user registration form. Use var_dump or kpr to dump 
    // the $form array. 

    // Note: if you want to use kpr on the user registration form, give 
    // anonymous permission to see devel information. 
    // kpr($form); 

    // Move Name field to after E-Mail field 
    $form['name']['#weight'] = 2; 
    $form['mail']['#weight'] = 1; 

    // Group Name and E-mail together into a fieldset 
    $form['personal_info'] = array(
     '#type' => 'fieldset', 
     '#title' => t('Personal information'), 
    ); 

    $form['personal_info']['name'] = $form['name']; 
    $form['personal_info']['mail'] = $form['mail']; 

    // The last block only copied the elements: unset the old ones. 
    unset($form['name']); 
    unset($form['mail']); 
    } 
} 

Dans les formes plus complexes, faire avancer les choses d'un à l'autre fieldset pourrait donner des résultats inattendus lors de la présentation du formulaire. C'est parce que $form['name'] n'est pas le même que $form['group']['name'], ce qui n'est pas la même chose que $form['other_group']['name']. Vous n'avez pas à vous soucier de cela sur le formulaire user_register pour la plupart, mais consultez la page du manuel sur #tree and #parents pour plus d'informations à ce sujet. Cela concerne la modification des champs existants dans le formulaire d'inscription de l'utilisateur: si vous souhaitez ajouter de nouveaux champs, je recommande fortement d'utiliser Content Profile. Si vous voulez créer des champs personnalisés par vous-même, cela va devenir beaucoup plus complexe car vous devrez implémenter vos propres gestionnaires de validation et de soumission. Le profil de contenu gère cela pour vous: consultez son fichier README pour voir comment l'activer pour les formulaires d'inscription.

2

Dans un module, utilisez d'abord hook_theme(), en supposant maintenant le nom de votre module est « d6_forms »:

function d6_forms_theme() { 
    return array(
    'user_register' => array(
     'template' => 'templates/user-register-form', 
     'arguments' => array('form' => NULL), 
    ),   
); 
} 

Cela rendra le formulaire user_register look pour un modèle, dans le dossier spécifié. Assurez-vous donc que dans votre dossier de module, il y a un dossier appelé 'templates', avec un fichier 'user-register-form.tpl.php'.

Vous remarquez que dans hook_theme(), l'extension du fichier modèle (.tpl.php) n'est pas fournie. C'est normal, vous n'avez pas besoin de le spécifier ici. Assurez-vous cependant que le modèle a cette extension, et qu'il n'est pas simplement nommé 'user-register-form.php'!

Dans ce fichier de modèle, vous avez accès à la variable $ form, alors imprimez-là pour voir les champs qui s'y trouvent. Le module devel est recommandé, car il est capable d'imprimer de grands tableaux Drupal d'une manière sophistiquée (en utilisant dpm()). Si vous n'avez pas de module Devel, ou si vous ne voulez pas l'utiliser, cela fonctionne également: <?php print '<pre>' . print_r($form, 1) . '</pre>'; ?>.

Pour imprimer un champ, utilisez <?php print drupal_render($form[field_name]); ?>, cela affichera le champ et s'assurera que cela fonctionne comme prévu. Par exemple, si vous voulez imprimer le champ 'name' dans le tableau $ form, utilisez simplement <?php print drupal_render($form['name']); ?>.

Vous n'avez pas à imprimer tous les champs! Il suffit d'imprimer les champs que vous voulez déplacer quelque part (qui, avec un formulaire de base de registre Drupal, sont environ 3: nom, email & soumettre). Pour imprimer tous les champs restants, terminez simplement votre modèle avec <?php print drupal_render($form); ?>.

Il est important de ne pas oublier cela, car le $ form var contient des choses qui sont absolument nécessaires pour que votre formulaire fonctionne (comme un jeton, etc.). Un bon comportement standard lors de la mise en forme d'un formulaire consiste à imprimer ce code en premier au bas de votre modèle.

Ceci est un exemple complet d'un petit modèle de formulaire d'inscription, avec quelques html de base:

<?php 
    // What is in that $form var ? To check, uncomment next line 
    // print '<pre>' . print_r($form, 1) . '</pre>'; 
?> 

<div style="background-color:#ddd;padding:10px;"> 
    <?php print drupal_render($form['name']); ?> 
    <?php print drupal_render($form['mail']); ?> 
</div> 

<div> 
    <?php print drupal_render($form['submit']); ?> 
</div>     

<?php print drupal_render($form); ?> 
+0

Y a t-il un délai par défaut pour l'enregistrement de l'utilisateur? tpl.php? quelque part, donc je ne peux que changer cela? – PartySoft