Hice algo como esto recientemente. Como el perfil usa campos, esto hace que las cosas sean bastante simples. Para el formulario, podría hacer algo como esto:
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;
}
Dado que todo el formulario de perfil es solo los campos que están adjuntos al perfil, simplemente puede adjuntar los campos usted mismo al formulario, utilizando las API principales de Drupal:
field_attach_form
agrega los campos al formulario.
field_attach_validate
maneja la validación.
field_attach_submit
maneja agregar los valores a la entidad (perfil).
- Por último, necesitaría guardar la entidad de perfil usando
profile2_save
.
Después de examinar el código del módulo profile2, descubrí que proporciona una función de contenedor para adjuntar los campos al formulario y guardar el formulario. Esto es más simple, pero al hacerlo, pierdes un poco de control. Para usar esto necesitas usar el profile2_attach_form
. Hacer esto también manejará la validación y el almacenamiento de datos.
Para usar el código anterior, debe poder c / p, cambiar el nombre del formulario y reemplazarlo profile_machine_name
con el nombre real de la máquina del perfil para el que desea mostrar el formulario.