Como exibir um formulário de perfil usando o módulo profile2

11

Profile2 é um módulo que usa entidades para criar perfis separados da conta do usuário.

No meu módulo, desejo poder exibir um formulário para editar as entidades do perfil. Possivelmente usando drupal_get_form ou talvez a API do Profile2 ou qualquer outro método.

Qual é a melhor maneira de fazer isso?

Carlos Muñiz
fonte

Respostas:

20

Eu fiz algo assim recentemente. Como o perfil usa campos, isso simplifica bastante as coisas. Para o formulário, você pode fazer algo assim:

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

Como todo o formulário do perfil é apenas os campos anexados ao perfil, você pode simplesmente anexar os campos ao formulário, usando as APIs principais do Drupal:

  • field_attach_form adiciona os campos ao formulário.
  • field_attach_validate lida com a validação.
  • field_attach_submit manipula a adição de valores à entidade (perfil).
  • Por fim, você precisaria salvar a entidade do perfil usando profile2_save.

Depois de navegar no código do módulo profile2, descobri que ele fornece uma função de invólucro para anexar os campos ao formulário e salvar o formulário. Isso é mais simples, mas, ao fazer isso, você perde um pouco de controle. Para usar isso, você precisa usar o profile2_attach_form. Isso também manipulará a validação e o salvamento dos dados.

Para usar o código acima, você deve poder c / p, renomeie o formulário e substitua profile_machine_namepelo nome da máquina real do perfil para o qual deseja exibir o formulário.

googletorp
fonte
Eu não entendo o que está acontecendo aqui. Eu só preciso exibir o formulário Profile2. Isso é possível?
Carlos Muñiz 23/06
quando eu usar seu código em meu módulo dá-me este erro: Erro fatal: tipos de operando não suportados em C: \ wamp \ www \ trabalho \ módulos \ campo \ field.attach.inc na linha 550
Carlos Muñiz
@Charlie Atualizei minha resposta com mais detalhes e forneci uma solução alternativa e mais simples usando a API profile2.
googletorp
é isso googletorp !!! sua resposta funcionou com uma edição menor: no final da função eu adicionei: retorne $ form que era a única maneira de conseguir exibi-la chamando-a com drupal_get_form (). Se houvesse uma maneira alternativa de exibi-lo sem o formulário de retorno $, explique, caso contrário, muito obrigado!
Carlos Muñiz
Eu tenho que esperar 12 horas para conceder a graça :)
Carlos Muñiz