especificar $ elementos de formulário a serem excluídos da exibição?

20

Eu quero ocultar certos elementos no formulário usando form_alter ou um arquivo de modelo. Eu li em algum lugar que no Drupal 7, podemos especificar os elementos $ form para que não sejam exibidos no formulário, mas não me lembro! Não desabilitado (), mas alguma outra função!

Serjas
fonte

Respostas:

29

Usar unset()não é uma boa solução para formulários (como eu acho que você sabe), pois você nunca sabe o que os manipuladores de envio / validação podem esperar que o elemento não definido exista quando processados. Isso pode levar a erros indesejados.

Existem três métodos que você pode usar com segurança para 'ocultar' um elemento do formulário

  • Use '#type' => 'value'o elemento, que terá o efeito de que o valor do elemento ainda será transmitido para as funções de envio / validação, #valuecomo normalmente. Este é o meu método preferido.
  • Use '#access' => FALSEo elemento para indicar que ele não deve ser transmitido para a tela.
  • Use '#type' => 'hidden'como Bart sugeriu (embora o uso disso dependa do seu caso de uso; imagino que, se você estiver tentando ocultar o valor de um elemento do formulário, não deseja produzi-lo no formulário como uma entrada oculta).
Clive
fonte
esqueceu hide () .
Yusef
2
O @zhilevan hide()não deve ser usado em elementos de formulário, ele pode facilmente atrapalhar todo o processo de envio de formulários, pois os validadores ainda são executados para o elemento. Por exemplo, se você hide($form['title']);em um formulário de nó, nunca poderá enviar o formulário, pois o campo de título é obrigatório, mas um valor não será fornecido. Os 3 métodos acima são os mais adequados para usar, por esta ordem :)
Clive
@ Clive obrigado, eu sei os métodos acima, minha pergunta era algo relacionado a hide () eu acho (ainda não consigo me lembrar da função) .. de qualquer maneira, por favor consulte o meu comentário na 1ª resposta, por que drupal_render($form['base']['prices']['sell_price'])não está funcionando?
Serjas 5/09/12
Esse código está em um arquivo de modelo que tem como tema o formulário? Caso contrário, o motivo pelo qual não está funcionando é que, embora você possa imprimir qualquer elemento de renderização na tela drupal_render(), não receberá nenhuma das tags / tokens / etc. a menos que você produza toda a $formmatriz
Clive
Eu usei o tema hook e print_r ($ form) e até mesmo drupal_render ($ form ['title']) estão funcionando, o problema são os elementos nas guias vertcal!
Serjas 5/12
4

Se você estiver usando um arquivo de modelo, poderá ocultar itens usando hide () .

Se você deseja ocultar um elemento do formulário hook_form_alter, unset()pode ser sua melhor opção.

Se for apenas para armazenar um valor, você também pode usar '#type' => 'hidden' .

Bart
fonte
hide é o melhor método para exluce de elemento.
Yusef
O que eu estava tentando alcançar era um formulário de nó de produto Ubsercart personalizado, tudo o que eu queria exibir é sell_price e ocultar outros elementos como frete, peso etc. Mas drupal_render($form['base']['prices']['sell_price'])exibirá o formulário, mas não está economizando!
Serjas 5/09/12
4

Descobri que usar #access para false pode quebrar alguns formulários se usado em botões de envio ou similares. Nesses casos, eu apenas usei CSS para ocultar elementos:

$form['basic']['submit']['#attributes']['class'][] = 'element-hidden';

Apenas outra opção.

Tom James
fonte