回答
使用hook_form_alter你可以做任何你想要的表單。
例如,改變重量可以改變頁面上的位置。
如果你嘗試:
MYMODULE_form_user_profile_form_alter(&$form, $form_state) {
// do your processing here
var_dump($form);
}
與模塊的名稱替換MyModule的。
您將看到表格的結構,可以改變在那裏值改變,標籤權重的描述等
最好的辦法也許這將幫助: http://drupal.org/node/44910
謝謝。我目前正在使用配置文件模塊,但我真正想要的是重寫表單的佈局,略多於css可以提供的。即我不想將字段分成單獨的字段集等 – Tim 2010-08-02 10:43:05
要在傑里米的答覆擴大,你會想學習Drupal的Form API和user_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。如果你想自己創建自定義字段,它將變得更加複雜,因爲你將不得不實現自己的驗證和提交處理程序。內容配置文件爲您處理:閱讀其自述文件,瞭解如何激活它以用於註冊表單。
在模塊中,首先使用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); ?>
是否有用戶註冊的默認模板? tpl.php?某處,所以我只能改變它? – PartySoft 2011-03-29 12:08:53
你只需要啓用檔案模塊,這將使訪問將更多的領域在註冊表單。
通過這個簡單的視頻教程,這將對Drupal的初學者非常有用。
- 1. Drupal帳戶註冊
- 2. php用戶表單註冊
- 3. 如何在Drupal 6.x中手動註冊用戶?
- 4. Drupal註冊用戶頁面?
- 5. Drupal自定義用戶註冊表格
- 6. Drupal 7定製用戶註冊表
- 7. 如何在drupal 7中註冊註冊表單?
- 8. 有多個用戶註冊頁面Drupal 6
- 9. 如何更改用戶註冊表單字段不同類型的用戶角色在Drupal 6
- 10. 在Drupal中掛鉤用戶註冊
- 11. Drupal:在註冊時修改用戶
- 12. Drupal 6註冊密碼字段丟失
- 13. Drupal 7用戶註冊表單中的唯一字段
- 14. drupal 7中的用戶註冊表單驗證
- 15. 如何使phplist註冊表單將用戶返回到Drupal?
- 16. 關於在Django用戶註冊表單
- 17. Drupal自定義註冊表單保存
- 18. 如何僅在用戶註冊之前顯示錶單註冊。
- 19. 註冊Drupal菜單路徑?
- 20. 寫入用戶策略註冊表項
- 21. 重寫註冊表文件在Windows
- 22. 如何在不使用API的情況下將用戶註冊到Drupal 6.x?
- 23. Drupal 7:用戶註冊頁面模板?
- 24. drupal 7配置用戶註冊過程
- 25. Drupal 7客戶端驗證註冊表單上?
- 26. 在Drupal中註冊後重定向
- 27. 掛鉤在drupal註冊表格
- 28. 如何添加語言切換用戶/註冊形式在Drupal 6
- 29. 在Drupal站點註冊
- 30. Django註冊表單,匿名用戶?
這是去哪裏?在主題目錄中的template.php? – Tim 2010-08-02 10:50:47
您需要將此代碼放置在自定義模塊中,在Drupal 7中,您可以在主題中執行類似的操作。 – googletorp 2010-08-02 11:20:34