profile2モジュールを使用してプロファイルフォームを表示する方法


11

Profile2は、エンティティを使用して、ユーザーアカウントとは別のプロファイルを作成するモジュールです。

モジュール内から、フォームエンティティを編集するためのフォームを表示できるようにしたいと考えています。おそらくdrupal_get_formまたは多分Profile2のAPIまたはその他のメソッドを使用します。

これについて最善の方法は何ですか?

回答:


20

私は最近このようなことをしました。プロファイルはフィールドを使用するので、これは物事をかなり単純にします。フォームの場合、次のようなことができます。

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

すべてのプロファイルフォームはプロファイルに添付されるフィールドのみであるため、DrupalコアAPIを使用して、自分でフィールドをフォームに添付することができます。

  • field_attach_form フィールドをフォームに追加します。
  • field_attach_validate 検証を処理します。
  • field_attach_submit エンティティ(プロファイル)への値の追加を処理します。
  • 最後に、を使用してプロファイルエンティティを保存する必要がありますprofile2_save

profile2モジュールのコードを閲覧したところ、フォームにフィールドを添付してフォームを保存するためのラッパー関数を提供していることがわかりました。これはより簡単ですが、そうすることで、少しコントロールを失うことになります。これを使用するには、を使用する必要がありますprofile2_attach_form。これを行うと、データの検証と保存も処理されます。

上記のコードを使用するには、コードをc / pし、フォームの名前を変更し、フォームprofile_machine_nameを表示するプロファイルの実際のマシン名に置き換えます。


ここで何が起こっているのか理解できません。Profile2フォームを表示するだけです。これは可能ですか?
CarlosMuñiz、2011年

私は私のモジュールでコードを使用するとき、それは私に、このエラーを与える:致命的なエラー:Cでサポートされていないオペランドの型:行550の\ WAMP \ WWW \ \モジュール\フィールドを作業\ field.attach.inc
カルロス・ムニーズ

@Charlie私の回答をより詳細に更新し、profile2 APIを使用した代替のより簡単なソリューションを提供しました。
googletorp

これはグーグルトープです!!! あなたの答えは小さな編集で機能しました:私が追加した関数の最後に:drupal_get_form()で呼び出すことによって表示することができる唯一の方法であった$ formを返します。$ formを返さずに表示する別の方法がある場合は説明してください。それ以外の場合は、ありがとうございました。
カルロス・ムニーズ

賞金を授与するには12時間待つ必要があります:)
CarlosMuñiz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.