Tenho certeza de que é uma função de tema. Qual função de tema usar é a questão. :)
akalata 14/09
Ah, você está aí.
perfil completo de chrisjlee
Eu acho que você também pode usar o #attribute chave para definir uma classe
Mika A.
@Mika A. Isso se aplica apenas à tag <input> que eu gostaria de alterar a classe do wrapper (a <div>).
Chrisjlee # 14/11
Respostas:
5
Você pode substituir theme_form_element()normalmente se quiser alterar o tema globalmente. Se você estiver interessado em modificar apenas um elemento de formulário específico, conheço algumas opções.
Você pode registrar uma nova função de tema para o tipo específico de elemento de formulário no qual está interessado (por exemplo, campo de texto). Em seguida, você cria esta função de tema (com base no original, por exemplo. theme_textfield()), Mas isso não é chamado theme('form_element', ...)no final (você pode manipular o wrapper e o elemento na função de um tema ou criar uma função de tema de wrapper separada e use isso). Finalmente, você adiciona uma #themepropriedade a um elemento de formulário específico, e esse elemento obtém seu tema personalizado.
Você pode criar um arquivo de modelo chamado form_element.tpl.phpque apenas possui o comportamento padrão theme_form_element()e, em seguida, usá-lo hook_preprocess_form_element()para adicionar uma sugestão de modelo. Em seguida, você cria o novo modelo que corresponde à sugestão. Você costuma ouvir pessoas mencionando que os modelos são um pouco mais lentos que as funções e, para uma chamada de tema usada com frequência, posso imaginar pessoas se recusando a usar um modelo. Eu nunca fiz nenhuma medida para isso sozinho, no entanto. Além disso, você precisa ter contexto suficiente no estágio de pré-processo para poder fazer a sugestão.
@ ChrisJ.Lee Deseja alterar o wrapper em todos os elementos ou apenas em um?
Andy
apenas um.
Chrisjlee #
@chrisjlee Atualizei a resposta.
Andy
4
Eu sei que esse é um tópico super antigo, mas eu tenho aprendido como alterar elementos de formulário e adicionar classes. Eu comecei a criar um módulo personalizado:
Essa é uma boa solução alternativa - não inclua uma classe na div de empacotamento, apenas empacote a div de empacotamento em sua própria div e elas poderão ser aplicadas nas classes que você desejar.
Felix Eve
3
Para alterar o "invólucro", você precisa substituir form_element. Basicamente, todos os elementos do formulário são renderizados com o tema theme_form_element($element,$value);form_element (arquivo form.inc)
Então, para alterar como isso renderiza seus elementos de formulário, basta copiar essa função para a pasta template.php e renomeá-la para: phptemplate_form_element($element,$value)
agora você pode fazer alterações e elas serão usadas no lugar da função original
Essa resposta me ajudou, mas observe que ela se aplica especificamente ao Drupal 8.xe posterior.
Will Martin
0
Importante, theme_form_element modifica apenas a div do wrapper pai direto e esse pode não ser o destino pretendido para os efeitos CSS.
[Embora não seja programático, se alguém simplesmente deseja aplicar uma classe ao invólucro superior de um campo de nó (é invólucro, invólucro, invólucro), posso supor que use o módulo "Grupo de campos" selecionando "Gerenciar campos" para um tipo de conteúdo específico e selecione "Adicionar novo grupo" como um DIV simples. Em seguida, o rótulo pode ser removido e as classes desejadas atribuídas ao wrapper adicional (mas agora temos ainda mais wrappers) - com aninhamento ilimitado]
function my_module_form_alter(&$form,&$form_state, $form_id){
$form['account']['mail']['#my_theme_wrapper_attributes']['class'][]='form-field--inline';}
Existem casos em que #prefix/#suffixnem #attributes => array('class')os resultados desejados nem são apresentados. Meu caso particular é adicionar uma classe ao div do ajax-wrapper em torno de um elemento managed_file. #prefix/#suffixcria um novo contêiner e #attributes/'class'modifica a classe de um elemento interno, não o mais externo.
A div externa mais externa é apenas
<divid="edit-doc1--XX-ajax-wrapper">
que é difícil de segmentar em CSS. Eu posso segmentar [id^="edit-doc"]ou [id$="-ajax-wrapper"]mas ambos direcionam mais do que apenas os elementos que eu queria.
A solução que encontrei é adicionar um #processelemento ao formulário e manipular manualmente o código do elemento. Aqui está o #processatributo adicionado à declaração do item de formulário:
E aqui está a mymodule_managed_file_process()função:
function mymodule_managed_file_process($element,&$form_state, $form){// Call the original function to perform its processing.
$element = file_managed_file_process($element, $form_state, $form);// Add our own class for theming.
$element['#prefix']= str_replace('id=','class="managed-file-wrapper" id=',
$element['#prefix']);return $element;}
Confiar na substituição de cadeias não é muito portátil, portanto, use str_replacepor seu próprio risco. Esse código, no entanto, realmente altera o DIV mais externo para adicionar a classe necessária:
Respostas:
Você pode substituir
theme_form_element()
normalmente se quiser alterar o tema globalmente. Se você estiver interessado em modificar apenas um elemento de formulário específico, conheço algumas opções.Você pode registrar uma nova função de tema para o tipo específico de elemento de formulário no qual está interessado (por exemplo, campo de texto). Em seguida, você cria esta função de tema (com base no original, por exemplo.
theme_textfield()
), Mas isso não é chamadotheme('form_element', ...)
no final (você pode manipular o wrapper e o elemento na função de um tema ou criar uma função de tema de wrapper separada e use isso). Finalmente, você adiciona uma#theme
propriedade a um elemento de formulário específico, e esse elemento obtém seu tema personalizado.Você pode criar um arquivo de modelo chamado
form_element.tpl.php
que apenas possui o comportamento padrãotheme_form_element()
e, em seguida, usá-lohook_preprocess_form_element()
para adicionar uma sugestão de modelo. Em seguida, você cria o novo modelo que corresponde à sugestão. Você costuma ouvir pessoas mencionando que os modelos são um pouco mais lentos que as funções e, para uma chamada de tema usada com frequência, posso imaginar pessoas se recusando a usar um modelo. Eu nunca fiz nenhuma medida para isso sozinho, no entanto. Além disso, você precisa ter contexto suficiente no estágio de pré-processo para poder fazer a sugestão.fonte
Eu sei que esse é um tópico super antigo, mas eu tenho aprendido como alterar elementos de formulário e adicionar classes. Eu comecei a criar um módulo personalizado:
fonte
Para alterar o "invólucro", você precisa substituir form_element. Basicamente, todos os elementos do formulário são renderizados com o tema
theme_form_element($element,$value);
form_element (arquivo form.inc)Então, para alterar como isso renderiza seus elementos de formulário, basta copiar essa função para a pasta template.php e renomeá-la para:
phptemplate_form_element($element,$value)
agora você pode fazer alterações e elas serão usadas no lugar da função original
theme_form_element($element,$value);
de form.incphptemplate_form_element($element,$value)
fonte
Você pode usar a propriedade wrapper_attributes .
fonte
Importante, theme_form_element modifica apenas a div do wrapper pai direto e esse pode não ser o destino pretendido para os efeitos CSS.
[Embora não seja programático, se alguém simplesmente deseja aplicar uma classe ao invólucro superior de um campo de nó (é invólucro, invólucro, invólucro), posso supor que use o módulo "Grupo de campos" selecionando "Gerenciar campos" para um tipo de conteúdo específico e selecione "Adicionar novo grupo" como um DIV simples. Em seguida, o rótulo pode ser removido e as classes desejadas atribuídas ao wrapper adicional (mas agora temos ainda mais wrappers) - com aninhamento ilimitado]
fonte
Você poderia usar
e isso vai envolvê-lo
fonte
Torne os atributos do wrapper configuráveis!
Crie sua própria função de tema de elemento de formulário no seu tema ...
sites/all/themes/MY_THEME/theme/form-element.theme.inc
Então você pode fazer coisas assim ...
fonte
Existem casos em que
#prefix/#suffix
nem#attributes => array('class')
os resultados desejados nem são apresentados. Meu caso particular é adicionar uma classe ao div do ajax-wrapper em torno de um elemento managed_file.#prefix/#suffix
cria um novo contêiner e#attributes/'class'
modifica a classe de um elemento interno, não o mais externo.A div externa mais externa é apenas
que é difícil de segmentar em CSS. Eu posso segmentar
[id^="edit-doc"]
ou[id$="-ajax-wrapper"]
mas ambos direcionam mais do que apenas os elementos que eu queria.A solução que encontrei é adicionar um
#process
elemento ao formulário e manipular manualmente o código do elemento. Aqui está o#process
atributo adicionado à declaração do item de formulário:E aqui está a
mymodule_managed_file_process()
função:Confiar na substituição de cadeias não é muito portátil, portanto, use
str_replace
por seu próprio risco. Esse código, no entanto, realmente altera o DIV mais externo para adicionar a classe necessária:fonte
Você pode usar a maneira acima para adicionar uma classe ao elemento do formulário.
fonte