Como ocultar e / ou impedir o acesso a campos em um formulário, como group_audience para grupos orgânicos

9

Isso me incomoda há um tempo. Quando tento ocultar campos como o campo de público do grupo ou a configuração de publicação de um formulário, na validação, o formulário define esses dois campos para um valor nulo, mesmo que o valor padrão seja foi declarado corretamente.

Tentei usar Invisible, #access, unset escondido nada funciona funciona! Isso é muito preocupante porque, no meu projeto atual, os usuários podem editar apenas pequenos pedaços de seu perfil no momento, por exemplo, apenas o endereço ou a imagem; portanto, se eu ocultar o público do grupo, o usuário acaba sendo expulso dos grupos aos quais pertence. editar.

Acabei usando o código abaixo para ocultar esses campos enquanto ainda mantinha o usuário em seu grupo.

$variables['user_edit_about']['group_audience']= $temp['group_audience'];       
$variables['user_edit_about']['group_audience']['#prefix'] = '<div style="display:none;">';
$variables['user_edit_about']['group_audience']['#suffix'] = '</div>';

Alguém pensaria em uma maneira melhor de conseguir isso?

obrigado

silkAdmin
fonte
Esta resposta não é perfeito, porque uso ainda pode alterar o valor com a manipulação DOM
iStryker

Respostas:

6

Editar:

Ok, eu descobri. Coloque isso no seu módulo personalizado:

function example_form_alter(&$form, &$form_state, $form_id) {
    if($form_id == 'story_node_form') {
        $form['title']['#value'] = 'hot stuff';
        $form['title']['#access'] = FALSE;

    }
}

Isso definirá o título do nó da história como 'itens quentes' e NÃO será renderizado na página porque #access = FALSE;

Você pode adicionar mais controle de granularidade dentro de hook_form_alter () como

  global $user;

  // Check to see if $user has does not have the administrator role.
  if (!in_array('administrator', array_values($user->roles))) {
    $form['title']['#access'] = FALSE;
  }

Isso funciona para o Drupal 6 e 7.

Resposta antiga (ignorar):

Já faz um tempo desde que eu fiz algo assim, então eu posso estar errado. Se você definir o [#value]item de um formulário, ele não ficará visível no formulário.

Eu fiz isso no Drupal 6, hook_form_alter()em um módulo personalizado. Não sei se funcionará no Drupal 7 e não sei se você pode fazê-lo em uma função de pré-processo

iStryker
fonte
Obrigado pela sua resposta, embora, infelizmente, não funcionou no meu caso, os campos do formulário já tem um #VALUE pré arquivado como eles são editar formas
silkAdmin
@silkAdmin Por favor, veja novas edições
iStryker
Obrigado Stryker por dedicar um tempo para investigar isso, mesmo que seu técnico acima funcione oculte campos, parece que o valor padrão também não é levado em consideração no envio. Então, acabo com o usuário sendo expulso do grupo a cada edição do perfil. Até agora, apenas o truque de sufixo #prefix # parece fazer com que ele se comporte normalmente.
silkAdmin
do $ form ['title'] ['# value'] = $ form ['title'] ['# default_value']
iStryker 18/07/11
5

Você também pode adicionar a classe CSS 'elemento oculto' ao elemento de formulário

$form['user_edit_about']['group_audience']['#attributes']['class'][] = 'element-hidden';

Como o iStryker mencionou anteriormente, ainda seria possível alterar o valor através da manipulação do DOM. No entanto, essa é uma maneira fácil e agradável de ocultar um campo de formulário (ou qualquer outro elemento de renderização). A element-hiddenclasse é definida em system.base.css.

Chaulky
fonte
Amigo, você me salvou. Obrigado. Todos os outros métodos que eu vi não produzem os elementos no próprio formulário. No meu caso, quero ocultar elementos do formulário em um módulo contrib que espera que esses elementos estejam no formulário, caso contrário, ele não funcionará corretamente. Sua correção de CSS oculta os elementos indesejados, mas tudo ainda funciona. Agradecemos também por observar que isso não é "à prova de hackers" e funciona apenas quando tudo o que você precisa é simplificar a interface que você apresenta aos usuários confiáveis ​​do editor.
Mario Awad