2010-08-02 34 views
3

我希望能夠自定義用戶註冊表單在Drupal 6重寫用戶註冊表單在Drupal 6

我發現數以千計的教程,告訴我如何重寫結構,即可以輸出形式作爲一個整體,但我想走動等表單元素,我不能很彷彿看到了這樣做

回答

3

使用hook_form_alter你可以做任何你想要的表單。

例如,改變重量可以改變頁面上的位置。

如果你嘗試:

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

與模塊的名稱替換MyModule的。

您將看到表格的結構,可以改變在那裏值改變,標籤權重的描述等

+0

這是去哪裏?在主題目錄中的template.php? – Tim 2010-08-02 10:50:47

+0

您需要將此代碼放置在自定義模塊中,在Drupal 7中,您可以在主題中執行類似的操作。 – googletorp 2010-08-02 11:20:34

0

最好的辦法也許這將幫助: http://drupal.org/node/44910

+0

謝謝。我目前正在使用配置文件模塊,但我真正想要的是重寫表單的佈局,略多於css可以提供的。即我不想將字段分成單獨的字段集等 – Tim 2010-08-02 10:43:05

9

要在傑里米的答覆擴大,你會想學習Drupal的Form APIuser_register()。總之,你建立一個關聯的數組;數組中的每個元素對應一個表單元素。

數組中的每個表單元素都是它自己的關聯數組。他們可以有一個類型:文本框,選擇菜單,複選框等:所有類型請參閱Form API reference

每個表單元素也可以有一個權重:這是你如何排列元素。編號較小的權重顯示在表單中較高編號的權重之前。

您可以使用的元素類型之一是fieldset:這將允許您將元素分組在一起。當您使用字段集時,它會用自己的權重值創建表單的一部分。

所以,讓我們說你有三個字段的表單:名稱公司E-mail地址名稱應該先出現,公司秒,電子郵件地址第三。您可以指定如下形式:

$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, 
); 

請注意#weight鍵。如果你想公司E-mail地址出現,你會設置$form['company']['#weight']到的東西比3

現在更高,讓我們說,你想組名稱公司到一個名爲字段集個人信息。您的表單現在看起來是這樣的:

$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, 
); 

注意名稱公司目前$form['personal']數組元素。

如果你想名稱顯示後公司在字段集,設置其#weight高於2.因爲名稱現在是具有#weight下一個字段的一部分E-電子郵件地址字段,即使您將$form['personal']['name']['#weight']設置爲4,也不會使名稱顯示在電子郵件地址之後。

因此,您要嘗試使用的是使用hook_form_alter()來更改user_register表單以更改某些表單元素的權重,創建您自己的字段集以及將某些表單元素移動到新創建的字段集中。

有一些方法可以在您的主題內做到這一點,但我更喜歡爲此創建自定義模塊。創建自定義模塊,並實現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']); 
    } 
} 

在更復雜的形式,從一個字段集搬東西到另一個可能會產生意想不到的結果提交表單時。這是因爲$form['name']$form['group']['name']不一樣,它與$form['other_group']['name']不一樣。您大可不必擔心user_register表單上的問題,但請查看#tree and #parents上的手冊頁以獲取更多信息。

這包括修改用戶註冊表中的現有字段:如果您想添加新字段,我強烈建議使用Content Profile。如果你想自己創建自定義字段,它將變得更加複雜,因爲你將不得不實現自己的驗證和提交處理程序。內容配置文件爲您處理:閱讀其自述文件,瞭解如何激活它以用於註冊表單。

2

在模塊中,首先使用hook_theme(),現在假設你的模塊的名稱是「d6_forms」:

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

這將使user_register形式找一個模板,在指定的文件夾。 因此,請確保在您的模塊文件夾中有一個名爲'templates'的文件夾,其中包含一個'user-register-form.tpl.php'文件。

您注意到在hook_theme()中,未提供模板文件(.tpl.php)的擴展名。這很正常,你不需要在那裏指定它。 但請確保模板具有該擴展名,並且它不只是名爲'user-register-form.php'!

在該模板文件中,您可以訪問$ form變量,因此在那裏打印它以查看那裏有哪些字段。 推薦使用devel模塊,因爲它能夠以一種奇特的方式打印大型Drupal數組(使用dpm())。 如果您沒有Devel模塊,或者不想使用它,這也適用於:<?php print '<pre>' . print_r($form, 1) . '</pre>'; ?>

要打印字段,只需使用<?php print drupal_render($form[field_name]); ?>,這將打印該字段並確保其按預期工作。 因此,例如,如果要打印$ form數組中的'name'字段,請使用<?php print drupal_render($form['name']); ?>

你不必打印每一個領域!只需打印您想要移動到某個地方的字段(使用基本的Drupal註冊表格,大約3:姓名,電子郵件地址&提交)。 要打印所有剩餘字段,只需以<?php print drupal_render($form); ?>結束您的模板。

重要的是你不要忘記這一點,因爲$ form var包含你的表單工作所需的東西(比如令牌等)。 模板化表單時的標準行爲就是先在模板的底部打印這段代碼。

這是一個小的登記表格模板的整個例子,有一些基本的HTML:

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

是否有用戶註冊的默認模板? tpl.php?某處,所以我只能改變它? – PartySoft 2011-03-29 12:08:53