Переопределение формы регистрации пользователя в Drupal 6 - PullRequest
3 голосов
/ 02 августа 2010

Я хочу иметь возможность настроить форму регистрации пользователя в Drupal 6

Я нашел тысячи учебных пособий, которые показывают мне, как переопределить структуру, в которой вы можете выводить форму целиком, но я хочу перемещать элементы формы и т. Д., И я не могу, кажется, найти лучший способ сделать это

Ответы [ 5 ]

9 голосов
/ 03 августа 2010

Чтобы расширить ответ Джереми, вам нужно изучить 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, чтобы узнать, как активировать его для регистрационных форм.

3 голосов
/ 02 августа 2010

Используя hook_form_alter, вы можете делать с формой все, что захотите.

Например, изменение веса может изменить положение на странице.

Если вы попробуете:

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

заменив MYMODULE именем вашего модуля.

Вы увидите структуру формы, там вы можете изменить значения для изменения, метки описания весов и т. Д.

2 голосов
/ 19 августа 2010

В модуле сначала используйте 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]); ?>, оно распечатает поле и убедится, что оно работает как положено. Например, если вы хотите напечатать поле name в массиве $ form, просто используйте <?php print drupal_render($form['name']); ?>.

Вам не нужно печатать каждое поле! Просто напечатайте поля, которые вы хотите переместить куда-нибудь (которые, с базовой формой регистра Drupal, составляют около 3: имя, адрес электронной почты и отправить). Чтобы напечатать все остальные поля, просто завершите свой шаблон с <?php print drupal_render($form); ?>.

Важно, чтобы вы не забыли об этом, поскольку переменная $ form содержит вещи, которые абсолютно необходимы для работы вашей формы (например, токен и т. Д.). Поэтому хорошее стандартное поведение при шаблонировании формы - сначала распечатать этот фрагмент кода внизу шаблона.

Это полный пример небольшого шаблона формы регистра, с некоторым базовым html:

<code><?php 
  // What is in that $form var ? To check, uncomment next line
  // print '<pre>' . print_r($form, 1) . '
'; ?>
<? php print drupal_render ($ form ['name']); ?> <? php print drupal_render ($ form ['mail']); ?>
<? php print drupal_render ($ form ['submit']); ?>
<? php print drupal_render ($ form); ?>
0 голосов
/ 13 сентября 2011

Вам просто нужно включить модуль профиля, который даст доступ для размещения большего количества полей в форме регистрации.

Прочтите этот простой учебник, который будет очень полезен для начинающих в Drupal.

http://planetghost.com/add_more_fields_to_sign_up

0 голосов
/ 02 августа 2010

возможно это поможет: http://drupal.org/node/44910

...