É possível criar uma segunda página de "editar conta" que permita apenas aos usuários editar alguns campos de perfil?

15

Então, eis a minha situação: os usuários do meu site precisam preencher um número bastante grande de campos após o registro. No entanto, após o registro, apenas quatro (de cerca de vinte) desses campos precisam ser alterados regularmente. Gostaria de criar uma página de "edição" separada para permitir que os usuários modifiquem apenas esses quatro campos para simplificar as coisas.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Esses campos estão todos contidos em um grupo de campos; portanto , idealmente, a página mostraria esse grupo de campos, as quatro caixas de seleção dentro dele e, em seguida, teria um botão enviar e cancelar, é isso.

Quero fazer isso como uma página separada, não como edição no local, como o módulo Edição Rápida .

Os usuários ainda precisam acessar a página de edição original da conta para alterar seu fuso horário, endereço de e-mail etc. etc.

Patrick Kenny
fonte

Respostas:

9

Eu tive a mesma situação antes e lida com isso com o poder completo do recurso druapl hook_form_alter , temos 2 formulários para usuário, registro e edição do usuário

  • user_profile_form (na edição)
  • user_register_form (no registro)

Nós só precisamos ocultar os campos especificados da maneira de edição Então, no seu módulo personalizado

function yourmodule_form_alter(&$form, &$form_state, $form_id)
{
    global $user;

    if ($form_id == "user_profile_form") {
       // ym($form);
       // you also can perform this action for specified roles 
        //if (!(in_array('blogger', $user->roles) || in_array('administrator', $user->roles))) {
            hide($form['field_mytest']);
            // hide other field with this method
        //}
    }

}

Depois que esse campo existir no registro, como você pode ver abaixo

insira a descrição da imagem aqui

e não existe (ocultar) de maneira editável

insira a descrição da imagem aqui

Além disso, você pode configurá-los somente leitura, ocultando-os com$form['field']['#access'] = FALSE;

E outra solução está usando o módulo de permissão de campo

O módulo Permissões de campo permite que os administradores do site definam permissões em nível de campo para editar, exibir e criar campos em qualquer entidade. Recursos:

  • Habilite as permissões de campo em qualquer entidade, não apenas nos nós.
  • Permissões de campo baseadas em função que permitem diferentes visualizações padronizadas com base no acesso do usuário.
  • As permissões de autor permitem a visualização e edição de campos com base em quem é o proprietário da entidade.
  • As permissões para cada campo não são ativadas por padrão. Em vez disso, os administradores podem habilitar essas permissões explicitamente para os campos em que esse recurso é necessário.

Como recursos que este módulo nos fornece usuário anônimo (o usuário que não é registrado pode editar esses campos e se registrar apenas como usuário) (somente leitura).

Yusef
fonte
7

Em vez de ter dois formulários, você pode usar o padrão e adicionar uma caixa de seleção "Mostrar todas as configurações", como a seguinte.

$form['show_all_settings'] = array(
  '#type' => 'checkbox',
  '#title' => t('Show all settings'),
);

Em seguida, você pode alterar os campos do formulário que deseja mostrar quando a caixa de seleção estiver marcada e incluir a seguinte propriedade para esses campos do formulário.

'#states' => array(
  'invisible' => array(
   ':input[name="show_all_settings"]' => array('checked' => FALSE),
  ),
),

Dessa maneira, os usuários poderão alternar entre um formulário que mostre toda a configuração e um formulário que mostre um conjunto mínimo de configurações, sem passar de uma página para outra.

Referências

kiamlaluno
fonte
6

Você pode usar o módulo Profile2 para isso.

  • Crie um tipo de perfil ou use o perfil principal padrão.
  • Adicione esses campos a esse tipo de perfil e defina-os para serem mostrados no formulário de registro.

Para que esses campos estejam disponíveis no formulário de registro entre os outros campos da conta do usuário . Mas para editar esses campos, o usuário deve ir para a página de edição do perfil em vez da página de edição do usuário .

Елин Й.
fonte
Quero mostrar as quatro caixas de seleção na página de edição do usuário e sua própria página personalizada; Não quero removê-los da página principal de edição do usuário.
Patrick Kenny
2

Experimente o módulo VBO , você pode criar uma página VBO, adicionar relacionamento USER à vista, adicionar os campos disponíveis para modificação do usuário e definir a permissão. Certifique-se de selecionar o conteúdo "pertence" apenas ao usuário ATUAL (via Filtro Contextual)

Gilzero
fonte
Como posso permitir que o usuário edite esses campos? O VBO me permite exibir os valores, mas preciso que eles sejam editáveis.
Patrick Kenny
Adicionar campo vbo em seguida, assinale a operação de 'valores entidade Modificar' (algo como isto, não me lembro exatamente o que é chamado)
gilzero
Obrigado, é chamado modificar valores da entidade . Infelizmente, isso não funciona no meu caso, mas pode ser uma solução útil para outras pessoas.
22412 Patrick
2

Com base na resposta de zhilevan a esta pergunta, a esta pergunta e a esta discussão no drupal.org , aqui está o código real que funciona para mim:

function MYMODULE_menu() {
  $items = array();
  $items['user/editpurposes'] = array(
    'title' => t('Change your purposes'),
    'page callback' => 'MYMODULE_purpose_edit_form',
    'access callback' => TRUE,
    'access arguments' => array('access content'),
    'description' => t('Purpose Edit Form'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function MYMODULE_purpose_edit_form() {
  // Needed to load AJAX.
  module_load_include('inc', 'user', 'user.pages');
  global $user;
  $account = user_load($user->uid); // Load a user object
  $form = drupal_get_form('user_profile_form', $account, 'account', 'purposes');
  return $form;
}

function MYMODULE_form_user_profile_form_alter(&$form, &$form_state) {
  if(isset($form_state['build_info']['args'][2]) && $form_state['build_info']['args'][2] == 'purposes') {

    // Remove name, email, password, etc.
    $form['account']['#access'] = FALSE;
    // Remove language.
    $form['locale']['#access'] = FALSE;
    $form['timezone']['#access'] = FALSE;
    // Remove various custom fields.
    $form['field_acc_displayname']['#access'] = FALSE;
    $form['field_acc_code_agree']['#access'] = FALSE;

    // Needed to load AJAX.
    form_load_include($form_state, 'inc', 'user', 'user.pages');
  }
}
Patrick Kenny
fonte
posso perguntar por que o Profile2 não era uma opção, como sugeri na minha resposta?
Елин Й.
0

Eu acho que você deve conseguir arrumar um pouco as coisas com o módulo de grupo de campos, por exemplo, coloque os campos em guias diferentes. Os comuns em uma guia e o restante em outra guia.

enzifera
fonte
Obrigado por essa ideia, mas já estou usando o módulo Field Group. É bom, mas eu realmente só quero mostrar quatro opções para o usuário, não tudo.
22812 Patrick
0

tente este código. e oculte outros campos que você não quer mostrar.

<?php
global $user;
$user=user_load($user->uid);
module_load_include('inc', 'user', 'user.pages');
$user_form = drupal_get_form('user_profile_form', $user);
print(drupal_render($user_form));
?>
monymirza
fonte