Чтобы расширить ответ Джереми, вам нужно изучить API формы Drupal и user_register()
. Короче говоря, вы строите связанный массив; каждый элемент в массиве соответствует одному элементу формы.
Каждый элемент формы в массиве является своим собственным связанным массивом. Они могут иметь тип: текстовое поле, меню выбора, флажки и т. Д .: для всех типов см. справочник API форм .
Каждый элемент формы также может иметь вес: именно так вы упорядочиваете элементы. Веса с меньшим номером отображаются до веса с более высоким номером в форме.
Один из доступных вам типов элементов: fieldset
: это то, что позволит вам группировать элементы вместе. При использовании набора полей он создает раздел формы со своими собственными значениями веса.
Итак, допустим, у вас есть форма с тремя полями: Имя , Компания и Адрес электронной почты . Имя должно отображаться первым, Компания секунда, Адрес электронной почты третье. Вы можете указать форму так:
$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
. Если вы хотите, чтобы Компания появлялась после Адрес электронной почты , вы должны установить для $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,
);
Обратите внимание, что Name и Company теперь являются элементами массива $form['personal']
.
Если вы хотите, чтобы Имя отображалось после Компания в наборе полей, установите его #weight
выше 2. Поскольку Имя теперь является частью набора полей, который имеет #weight
меньше, чем адрес электронной почты поле, даже если вы установите $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
по большей части, но посетите страницу справочника по дереву # и # parent для получения дополнительной информации об этом.
Это касается изменения существующих полей в форме регистрации пользователя: если вы хотите добавить новые поля, я настоятельно рекомендую использовать Content Profile . Если вы хотите создать собственные поля самостоятельно, это будет намного сложнее, так как вам придется реализовать собственные обработчики проверки и отправки. Content Profile решает эту проблему за вас: посмотрите его README, чтобы узнать, как активировать его для регистрационных форм.