Eu gostaria de criar um formulário de contato no Drupal 8. Gostaria de colocar divs em torno dos elementos do formulário (usando o bootstrap).
Eu também quero colocar algumas classes em certos elementos (botão enviar, o próprio formulário).
Eu gostaria de criar um formulário de contato no Drupal 8. Gostaria de colocar divs em torno dos elementos do formulário (usando o bootstrap).
Eu também quero colocar algumas classes em certos elementos (botão enviar, o próprio formulário).
Respostas:
Abra o seu arquivo YOURTHEMENAME.theme e adicione o seguinte código:
function YOURTHEMENAME_form_contact_message_feedback_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
// Name
$form['name']['#prefix'] = '<div class="row"><div class="col-md-6"><div class="form-group">';
$form['name']['#suffix'] = '</div>';
$form['name']['#attributes']['placeholder'][] = $form['name']['#title'].'*';
$form['name']['#attributes']['class'][] = 'form-control';
unset($form['name']['#title']);
// Mail
$form['mail']['#prefix'] = '<div class="form-group">';
$form['mail']['#suffix'] = '</div>';
$form['mail']['#attributes']['placeholder'][] = $form['mail']['#title'].'*';
$form['mail']['#attributes']['class'][] = 'form-control';
unset($form['mail']['#title']);
// Subject
$form['subject']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
$form['subject']['widget'][0]['value']['#attributes']['placeholder'][] = $form['subject']['widget'][0]['#title'].'*';
$form['subject']['widget'][0]['#title'] = '';
unset($form['subject']['widget'][0]['value']['#title']);
$form['subject']['widget'][0]['#prefix'] = '<div class="form-group">';
$form['subject']['widget'][0]['#suffix'] = '</div></div>';
// Message
$form['message']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
$form['message']['widget'][0]['value']['#attributes']['placeholder'][] = $form['message']['widget'][0]['#title'].'*';
$form['message']['widget'][0]['#title'] = '';
unset($form['message']['widget'][0]['value']['#title']);
$form['message']['widget'][0]['#prefix'] = '<div class="col-md-6"><div class="form-group">';
$form['message']['widget'][0]['#suffix'] = '</div></div></div>';
// Submit
$form['actions']['#prefix'] = '<div class="clearfix">';
$form['actions']['#suffix'] = '</div>';
$form['actions']['submit']['#attributes']['class'][] = 'btn';
$form['actions']['submit']['#attributes']['class'][] = 'btn-success';
$form['actions']['submit']['#attributes']['class'][] = 'pull-right';
}
E aqui está o seu resultado:
Não se esqueça de limpar seus caches;)
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.
/**
* Implements hook_theme().
*/
function MODULENAME_theme($existing, $type, $theme, $path) {
return [
'FORM_ID_THEME' => [
'template' => 'custom-form-template-name',
'render element' => 'form',
]
];
}
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 é
{{ 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 :)
Exemplo de forma complexa usando este método.
{{ 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 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.
{{ 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.