So zeigen Sie ein Profilformular mit dem Modul profile2 an

11

Profile2 ist ein Modul, das Entitäten verwendet, um Profile zu erstellen, die vom Benutzerkonto getrennt sind.

In meinem Modul möchte ich ein Formular zum Bearbeiten der Profilentitäten anzeigen können. Möglicherweise mit drupal_get_form oder der Profile2-API oder einer anderen Methode.

Was ist der beste Weg, um dies zu erreichen?

Carlos Muñiz
quelle

Antworten:

20

Ich habe vor kurzem so etwas gemacht. Da das Profil Felder verwendet, ist dies ziemlich einfach. Für das Formular könnten Sie so etwas tun:

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;
}

Da das gesamte Profilformular nur die Felder sind, die an das Profil angehängt sind, können Sie die Felder mithilfe der Drupal-Kern-APIs einfach selbst an das Formular anhängen:

  • field_attach_form Fügt die Felder dem Formular hinzu.
  • field_attach_validate übernimmt die Validierung.
  • field_attach_submit um das Hinzufügen der Werte zur Entität (Profil) zu handhaben.
  • Zuletzt müssten Sie die Profilentität mit speichern profile2_save.

Nach dem Durchsuchen des profile2-Modulcodes stellte ich fest, dass er eine Wrapper-Funktion zum Anhängen der Felder an das Formular und zum Speichern des Formulars bietet. Dies ist einfacher, aber dabei verlieren Sie ein wenig die Kontrolle. Um dies zu verwenden, müssen Sie die verwenden profile2_attach_form. Auf diese Weise wird auch die Validierung und Speicherung von Daten durchgeführt.

Um den obigen Code zu verwenden, sollten Sie in der Lage sein, ihn zu kopieren, das Formular umzubenennen und durch profile_machine_nameden tatsächlichen Computernamen des Profils zu ersetzen, für das Sie das Formular anzeigen möchten.

googletorp
quelle
Ich verstehe nicht, was hier passiert. Ich muss nur das Profil2-Formular anzeigen. Ist das möglich?
Carlos Muñiz
Wenn ich Ihren Code in meinem Modul verwende, wird folgende Fehlermeldung angezeigt: Schwerwiegender Fehler: Nicht unterstützte Operandentypen in C: \ wamp \ www \ working \ modules \ field \ field.attach.inc in Zeile 550
Carlos Muñiz
@Charlie Ich habe meine Antwort mit weiteren Details aktualisiert und eine alternative und einfachere Lösung mithilfe der profile2-API bereitgestellt.
googletorp
das ist es googletorp !!! Ihre Antwort funktionierte mit einer geringfügigen Änderung: Am Ende der von mir hinzugefügten Funktion gab ich $ form zurück, die die einzige Möglichkeit war, sie anzuzeigen, indem ich sie mit drupal_get_form () aufrief. Wenn es eine alternative Möglichkeit gab, es ohne das Rückgabeformular anzuzeigen, erklären Sie es bitte, ansonsten vielen Dank!
Carlos Muñiz
Ich muss 12 Stunden warten, um das Kopfgeld zu vergeben :)
Carlos Muñiz