Sugiro descrever seu problema com mais detalhes e dizer o que você já tentou. Isso mostrará alguma iniciativa e ajudará outras pessoas a dar uma resposta melhor.
Aram Boyajyan
Respostas:
16
Abra o seu arquivo YOURTHEMENAME.theme e adicione o seguinte código:
Você pode simplesmente tema de todas as formas como quiser. Eu não gosto do método do @rpayanm, porque é difícil de manter e de fácil leitura, com formas grandes esse não é o caso, apenas invólucro único e estrutura simples.
Todo formulário que tenta usar o tema é igual ao nome da máquina. Você pode encontrar esse nome de modelo em $form['#theme']apenas alter, é sempre (ou na maioria das vezes) o mesmo que nome da máquina de identificação de formulário. O que você precisa fazer é registrar um modelo para ele. Você precisa implementar hook_theme(). Você pode gravá-lo em CUSTOMMODULE.module ou em THEMENAME.theme. A chave do tema deve ser a mesma que em $form['#theme'], para que seja usada automaticamente, caso contrário, você precisará adicionar uma nova via alteração de formulário.
Então você deve criar custom-form-template-name.html.twig(com o nome do seu modelo de hook_theme ()).
O modelo mínimo é
{{ form }}
Você também pode imprimir todos os campos do formulário em que deseja
{{ form.field_name }}
Aqui você pode fazer o que quiser com a marcação.
Você também pode passar dados adicionais para o modelo implementando template_preprocess_TEMPALTENAME
function template_preprocess_FORM_ID_THEME(&$variables){
$variables['example']='This is added via preprocess';}
E então use no template
{{ example }}<div class="first-field">{{ form.first_field }}</div><div class="second-field">{{ form.second_field }}</div><div class="buttons">{{ form.submit }}{{ form.preview }}</div>{#Don't forget to add printing form special info at the end.
Without this data form will not working propertly.
#}
{{ form.form_build_id }}
{{ form.form_token }}
{{ form.form_id }}
Eu acho que esse método é mais flexível, limpo e poderoso.
Ps desculpe pelo meu inglês, espero que alguém edite e corrija meus erros :)
Note que, para mim, eu mudei {{ form.submit }}para{{ form.actions.submit }}
mikeDOTexe 24/10
@ Niklan: Eu segui o mesmo código acima para o meu formulário de pacote de entidades personalizadas. Se eu usar {{ form }}, ele está imprimindo todo o formulário, mas se eu usar um campo específico como {{ form.my_field }}, nada será exibido. Alguma idéia de como podemos exibir cada campo do formulário de pacote personalizado de entidades?
kalidasan
@kalidasan tente imprimir todos os campos sem imprimir {{ form }}. Sugiro que, após a impressão, {{ form }}todos os elementos do formulário sejam marcados como '#rendered' => TRUEe não serão renderizados em breve. Se você não quiser usar esse método de formulário de temas, imprima todos os campos individualmente. Não existe drupal_render_children()no Drupal 8, a menos que você o escreva sozinho. De qualquer forma, por padrão, isso causará duplicatas; portanto, tente imprimir cada campo manualmente.
Niklan 19/07
@ Niklan: Eu não usei {{ form }} & {{ form.my_field }}juntos. Tentei pela primeira vez apenas {{ form }}, aqui eu posso ver o formulário inteiro. Em seguida, removidos {{ form }}do modelo e, em seguida, tentados para cada campo de formulário separadamente como este {{ form.my_field }}, etc , mas não conseguimos colocar isso em prática. Nada exibido.
kalidasan
1
@kalidasan você pode desmarcar títulos template_preprocess_FORM_ID_THEME(&$variables). Nesse pré-processo, você pode adicionar novas variáveis, alterar os existentes, incluindo os elementos do formulário. Eu nunca vi isso {{ form.field_name.widget }}e formas temáticas com frequência. Parece que esse campo é personalizado criado ou adicionado por um módulo de terceiros? Eu acho que isso é permitido, mas não para outros. Eu recomendo que você comece com o gancho de pré-processo e veja o $variables['form']que ele contém por dentro.
Respostas:
Abra o seu arquivo YOURTHEMENAME.theme e adicione o seguinte código:
E aqui está o seu resultado:
Não se esqueça de limpar seus caches;)
fonte
Você pode simplesmente tema de todas as formas como quiser. Eu não gosto do método do @rpayanm, porque é difícil de manter e de fácil leitura, com formas grandes esse não é o caso, apenas invólucro único e estrutura simples.
Todo formulário que tenta usar o tema é igual ao nome da máquina. Você pode encontrar esse nome de modelo em
$form['#theme']
apenas alter, é sempre (ou na maioria das vezes) o mesmo que nome da máquina de identificação de formulário. O que você precisa fazer é registrar um modelo para ele. Você precisa implementarhook_theme()
. Você pode gravá-lo em CUSTOMMODULE.module ou em THEMENAME.theme. A chave do tema deve ser a mesma que em$form['#theme']
, para que seja usada automaticamente, caso contrário, você precisará adicionar uma nova via alteração de formulário.Drupal passa a variável $ form com form.
Então você deve criar
custom-form-template-name.html.twig
(com o nome do seu modelo de hook_theme ()).O modelo mínimo é
Você também pode imprimir todos os campos do formulário em que deseja
Aqui você pode fazer o que quiser com a marcação.
Você também pode passar dados adicionais para o modelo implementando
template_preprocess_TEMPALTENAME
E então use no template
Eu acho que esse método é mais flexível, limpo e poderoso.
Ps desculpe pelo meu inglês, espero que alguém edite e corrija meus erros :)
Exemplo de forma complexa usando este método.
fonte
{{ form.submit }}
para{{ form.actions.submit }}
{{ form }}
, ele está imprimindo todo o formulário, mas se eu usar um campo específico como{{ form.my_field }}
, nada será exibido. Alguma idéia de como podemos exibir cada campo do formulário de pacote personalizado de entidades?{{ form }}
. Sugiro que, após a impressão,{{ form }}
todos os elementos do formulário sejam marcados como'#rendered' => TRUE
e não serão renderizados em breve. Se você não quiser usar esse método de formulário de temas, imprima todos os campos individualmente. Não existedrupal_render_children()
no Drupal 8, a menos que você o escreva sozinho. De qualquer forma, por padrão, isso causará duplicatas; portanto, tente imprimir cada campo manualmente.{{ form }} & {{ form.my_field }}
juntos. Tentei pela primeira vez apenas{{ form }}
, aqui eu posso ver o formulário inteiro. Em seguida, removidos{{ form }}
do modelo e, em seguida, tentados para cada campo de formulário separadamente como este{{ form.my_field }}, etc
, mas não conseguimos colocar isso em prática. Nada exibido.template_preprocess_FORM_ID_THEME(&$variables)
. Nesse pré-processo, você pode adicionar novas variáveis, alterar os existentes, incluindo os elementos do formulário. Eu nunca vi isso{{ form.field_name.widget }}
e formas temáticas com frequência. Parece que esse campo é personalizado criado ou adicionado por um módulo de terceiros? Eu acho que isso é permitido, mas não para outros. Eu recomendo que você comece com o gancho de pré-processo e veja o$variables['form']
que ele contém por dentro.