Profile2 est un module qui utilise des entités pour créer des profils distincts du compte d'utilisateur.
Depuis mon module, je veux pouvoir afficher un formulaire pour éditer les entités de profil. Peut-être en utilisant drupal_get_form ou peut-être l'API de Profile2 ou toute autre méthode.
Quelle est la meilleure manière de s'occuper de ça?
J'ai fait quelque chose comme ça récemment. Puisque le profil utilise des champs, cela rend les choses assez simples. Pour le formulaire, vous pouvez faire quelque chose comme ceci:
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;
}
Étant donné que tout le formulaire de profil est uniquement les champs qui sont attachés au profil, vous pouvez simplement attacher les champs vous-même au formulaire, en utilisant Drupal API principales:
field_attach_form
ajoute les champs au formulaire.field_attach_validate
gère la validation.field_attach_submit
pour gérer l'ajout des valeurs à l'entité (profil).profile2_save
.Après avoir parcouru le code du module profile2, j'ai constaté qu'il fournit une fonction wrapper pour attacher les champs au formulaire et enregistrer le formulaire. C'est plus simple, mais ce faisant, vous perdez un peu de contrôle. Pour l'utiliser, vous devez utiliser le profile2_attach_form
. Cette opération gérera également la validation et la sauvegarde des données.
Pour utiliser le code ci-dessus, vous devriez pouvoir le c/p, renommer le formulaire et remplacer profile_machine_name
avec le nom de machine réel du profil pour lequel vous souhaitez afficher le formulaire.