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!
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).
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' .
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:
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 :)drupal_render($form['base']['prices']['sell_price'])
não está funcionando?drupal_render()
, não receberá nenhuma das tags / tokens / etc. a menos que você produza toda a$form
matrizSe 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' .
fonte
drupal_render($form['base']['prices']['sell_price'])
exibirá o formulário, mas não está economizando!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:
Apenas outra opção.
fonte