Comment afficher un formulaire de profil à l'aide du module profile2

11

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?

Carlos Muñiz
la source

Réponses:

20

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 les API de base Drupal:

  • field_attach_form ajoute les champs au formulaire.
  • field_attach_validate gère la validation.
  • field_attach_submit à gère l'ajout de valeurs à l'entité (profil).
  • Enfin, vous devez enregistrer l'entité de profil à l'aide de 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 devez être en mesure de le c / p, de renommer le formulaire et de le remplacer profile_machine_namepar le nom de machine réel du profil pour lequel vous souhaitez afficher le formulaire.

googletorp
la source
Je ne comprends pas ce qui se passe ici. J'ai juste besoin d'afficher le formulaire Profile2. Est-ce possible?
Carlos Muñiz
lorsque j'utilise votre code dans mon module, cela me donne cette erreur: Erreur fatale: types d'opérandes non pris en charge dans C: \ wamp \ www \ working \ modules \ field \ field.attach.inc sur la ligne 550
Carlos Muñiz
@Charlie J'ai mis à jour ma réponse avec plus de détails et fourni une solution alternative et plus simple en utilisant l'API profile2.
googletorp
c'est ça googletorp !!! votre réponse a fonctionné avec une modification mineure: à la fin de la fonction, j'ai ajouté: retourner $ form qui était le seul moyen pour que je puisse l'afficher en l'appelant avec drupal_get_form (). S'il y avait une autre façon de l'afficher sans le formulaire de retour, alors expliquez-le, sinon merci beaucoup!
Carlos Muñiz
Je dois attendre 12 heures pour attribuer la prime :)
Carlos Muñiz