Eu fiz algo assim recentemente. Como o perfil usa campos, isso simplifica bastante as coisas. Para o formulário, você pode fazer algo assim:
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;
}
Como todo o formulário do perfil é apenas os campos anexados ao perfil, você pode simplesmente anexar os campos ao formulário, usando as APIs principais do Drupal:
field_attach_form
adiciona os campos ao formulário.
field_attach_validate
lida com a validação.
field_attach_submit
manipula a adição de valores à entidade (perfil).
- Por fim, você precisaria salvar a entidade do perfil usando
profile2_save
.
Depois de navegar no código do módulo profile2, descobri que ele fornece uma função de invólucro para anexar os campos ao formulário e salvar o formulário. Isso é mais simples, mas, ao fazer isso, você perde um pouco de controle. Para usar isso, você precisa usar o profile2_attach_form
. Isso também manipulará a validação e o salvamento dos dados.
Para usar o código acima, você deve poder c / p, renomeie o formulário e substitua profile_machine_name
pelo nome da máquina real do perfil para o qual deseja exibir o formulário.