Я недавно сделал что-то подобное. Поскольку в профиле используются поля, это упрощает задачу. Для формы вы можете сделать что-то вроде этого:
function my_profile_form($form, &$form_state) {
global $user;
if (!isset($form_state['profiles'])) {
$profile = profile2_load_by_user($user, 'profile_machine_name');
if (!$profile) {
$profile = profile_create(array(
'type' => 'profile_machine_name',
'uid' => $user->uid
));
}
$form_state['profiles'][$profile->type] = $profile;
}
// Use field attach form and handle the fields yourself:
field_attach_form('profile2', $profile, $form, $form_state);
// Or use profile2 API which is simpler
profile2_attach_form($form, $form_state);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
Поскольку вся форма профиля - это только поля, прикрепленные к профилю, вы можете просто присоединить поля к форме самостоятельно, используя основные API-интерфейсы Drupal:
field_attach_form
добавляет поля в форму.
field_attach_validate
обрабатывает проверку.
field_attach_submit
обрабатывает добавление значений к сущности (профилю).
- Наконец, вам нужно сохранить профиль объекта с помощью
profile2_save
.
Просматривая код модуля profile2, я обнаружил, что он предоставляет функцию-обертку для присоединения полей к форме и сохранения формы. Это проще, но при этом вы теряете немного контроля. Чтобы использовать это вам нужно использовать profile2_attach_form
. Выполнение этого также будет обрабатывать проверку и сохранение данных.
Чтобы использовать вышеуказанный код, вы должны иметь возможность переписать его, переименовать форму и заменить profile_machine_name
фактическим именем машины профиля, для которого вы хотите отобразить форму.