Introduzindo a estrutura básica do formulário
Vamos continuar. O que precisamos saber? O formulário será composto, no mínimo, por um campo e um botão de enviar. Pode haver mais de um campo, como no nosso formulário, mas a estrutura mínima é essa: um campo e um botão de enviar.
Para indicar ao navegador que o formulário começará na página, utilizamos a tag form. Vamos começar criando a estrutura básica do formulário:
Configurando atributos do formulário
Ao criar a tag form, o VSCode já sugere o atributo action, que recebe uma URL de destino dos dados. No momento, deixaremos esse atributo vazio, mas é importante saber que ele define para onde os dados serão enviados. Outro atributo que precisamos adicionar é o method, que define a forma de envio dos dados. Temos principalmente os métodos get e post. O método get coloca os dados do formulário na URL, tornando-os visíveis, enquanto o método post envia os dados como um corpo de requisição para o back-end. Como ainda não utilizaremos JavaScript, e por solicitação do cliente, usaremos o método get.
Vamos adicionar o método ao nosso formulário:
<form action="" method="get">
Criando campos de entrada e botão de envio
Todo formulário precisa de, pelo menos, uma caixa de informação, que chamamos de input. Para diferenciar os tipos de input, utilizamos o atributo type. Nosso primeiro campo será para o nome do usuário, então usaremos type="text". Além disso, todo input precisa de um name, que identifica o campo na URL. Vamos usar name="username" e adotar a prática de escrever os atributos em inglês.
Vamos construir o campo de entrada para o nome do usuário:
<input type="text" name="userName">
O outro elemento essencial é o botão. Usamos a tag button com type="submit", pois esse botão submete as informações do formulário. Diferente do input, o button não é auto-fechado, então precisamos abrir e fechar a tag, inserindo o texto "Enviar" entre elas.
Aqui está o código para o botão de envio:
<button type="submit">Enviar</button>
Testando o método get e adicionando label
Vamos testar o método get em ação. No navegador, ao preencher o campo de texto com "Dani Castilho" e clicar em enviar, a URL exibirá username=Dani Castilho. Isso demonstra a importância do atributo name para identificar o valor do campo.
Criamos um primeiro campo de texto para o username, mas ainda não há indicação de que o usuário precisa preencher um nome. Para isso, usamos a tag label, que descreve os campos. A label possui o atributo for, no qual passamos o name do input que queremos descrever. Assim, a label para o campo username será "Nome".
Vamos adicionar a label para o campo de nome:
<label for="userName">Nome</label>
Adicionando campo de idade com validação
O próximo campo será o de idade. Vamos criar uma label para "Idade" e um input do tipo number, com name="age". O navegador adiciona um controle por clique para o input de tipo number. No entanto, o campo de idade deve aceitar apenas números entre 12 e 100. Para definir esse intervalo, usamos os atributos min e max. Além disso, o campo nome é obrigatório, o que indicamos com o atributo required.
Aqui está o código para o campo de idade:
<label for="userAge">Idade</label>
<input type="number" name="userAge" min="12" max="100" required>
Criando campo de data de nascimento
O próximo campo é a data de nascimento, que é opcional. Para isso, criamos uma label com for="birthdate" e um input do tipo date.
Vamos adicionar o campo de data de nascimento:
<label for="birthDate">Data de nascimento</label>
<input type="date" name="birthDate">
Implementando campo de e-mail com validação
Próximo campo: e-mail. É obrigatório e precisa validar o formato. Para usarmos um campo de e-mail, utilizamos o input type="email". Vamos copiar e colar aqui. Colamos a tempo. Então, label for="user email". O tipo é email e o name é o mesmo user email que colocamos no for da label. Para mantermos um padrão, deixamos user age. É importante seguir padrões, tanto para nós quanto para as pessoas que podem colaborar com nossos projetos. Então, user age aqui também. Vamos colocar o e-mail. Era um campo obrigatório, então required no final.
Aqui está o código para o campo de e-mail:
<label for="userEmail">Email</label>
<input type="email" name="userEmail" required>
Adicionando campo de telefone com restrições
Após o campo de e-mail, precisamos criar um campo de telefone, que será opcional e deve ter 11 dígitos. Vamos ao nosso HTML. Label for="userPhone". UserNumberPhone. PhoneNumber. UserPhoneNumber. Telefone como o valor da label. Criamos um input type="tel", específico para telefone. Name="userPhoneNumber". O campo de telefone aparece na tela. Porém, há um problema: podemos digitar muitos números e ele aceita todos. Precisamos aceitar apenas 11 dígitos. Para personalizar e dizer que esse campo só pode receber 11 dígitos, usamos duas novas propriedades do input type="tel". Primeiro, passamos um padrão de preenchimento. Queremos usar apenas números de 0 a 9 e que tenha 11 dígitos. Essa sequência de instrução, de regra, chamamos de pattern, ou padrão. Temos uma propriedade, um atributo chamado pattern, onde passamos quais tipos de número queremos usar entre colchetes. Então, abrimos colchetes, fechamos colchetes. Queremos usar de 0 a 9. E a quantidade de dígitos passamos entre chaves: 11 dígitos.
Vamos ver se deu certo. Agora, se quisermos preencher muitos números, ainda conseguimos, mas se tentarmos enviar o formulário assim, ele não permitirá. "Please match the requested format." Não estamos mostrando para o usuário qual é o formato requisitado. Para isso, usamos um atributo chamado placeholder. O placeholder faz aquele texto cinza dentro do campo para indicar como o usuário deve preencher. Como colocamos um padrão simples de 0 a 9 com 11 dígitos, não englobamos espaço, parênteses, etc. Vamos aprender mais sobre isso com regex, expressões regulares, para personalizar o preenchimento. Por enquanto, indicamos para preencher números corridos: 1, 2, 3, 4, 5, 6, 7, 8, 9 dígitos ou 11. Salvando, voltamos e dizemos qual modelo seguir para preencher o telefone. Podemos melhorar e mudar o placeholder para "DDD mais número sem espaços ou if". Assim, o usuário tem clareza de como preencher. Preenchemos tudo novamente para simular. O formato é 1, 2, 3, 4, 5, 1, 2, 3, 4. Ao enviar, o telefone do usuário é concatenado corretamente.
Aqui está o código para o campo de telefone:
<label for="userPhoneNumber">Telefone</label>
<input type="tel" name="userPhoneNumber" pattern="[0-9]{11}" placeholder="DDD + número sem espaços ou hifen">
Implementando campo de upload de foto
Próximo campo: upload de foto. Para ter um upload de foto no formulário, usamos o input type="file", que indica que é um campo para receber arquivos. Precisamos mencionar qual tipo de arquivo aceitar. Usamos o atributo accept, e no nosso caso, como imagem, image/*. O name pode ser user image. Criamos também o label chamado label for="user image". O nome do campo no briefing é "Upload de foto". É um campo opcional. Agora, aparece um botão para escolher arquivo. Ao clicar, abre opções para escolher apenas arquivos de foto. Escolhemos uma imagem como exemplo, abrimos, enviamos, preenchemos e clicamos no botão enviar. Aparece lá.
Aqui está o código para o campo de upload de foto:
<label for="userImage">Upload de foto</label>
<input type="file" accept="image/*" name="userImage">
Organizando campos com fieldset e legend
Esse primeiro passo foi os dados pessoais. Visualmente, está tudo junto e bagunçado. Podemos colocar quebras de linha para separar os inputs. Colocamos um BR aqui, outro ali. Abrimos uma tabulação e salvamos. Eles ficam mais organizados, um abaixo do outro. Colocamos um para o botão também, separando-o. Agora, só falta nomear essa sessão. Essa sessão é de dados pessoais. Precisamos escrever um HTML semântico, que faça sentido tanto para mecanismos de busca quanto para leitores de tela. Temos tags semânticas para ajudar na organização do formulário. Usamos a tag fieldset junto com a tag legend. Dentro do form, usamos a tag fieldset, que indica ao navegador que está começando um conjunto de elementos relacionados semanticamente.
Vamos organizar os campos dentro de um fieldset:
<fieldset>
<label for="userName">Nome</label>
<input type="text" name="userName" required>
<br>
<label for="userAge">Idade</label>
<input type="number" name="userAge" min="12" max="100" required>
<br>
<label for="birthDate">Data de nascimento</label>
<input type="date" name="birthDate">
<br>
<label for="userEmail">Email</label>
<input type="email" name="userEmail" required>
<br>
<label for="userPhoneNumber">Telefone</label>
<input type="tel" name="userPhoneNumber" pattern="[0-9]{11}" placeholder="DDD + número sem espaços ou hifen">
<br>
<label for="userImage">Upload de foto</label>
<input type="file" accept="image/*" name="userImage">
<br>
</fieldset>
Finalizando a sessão de dados pessoais
Usamos a tag legend para passar a legenda: "Dados pessoais". Removemos o comentário e colocamos mais acima para destacar a sessão. Salvamos. No projeto, ficou separado. Toda vez que usamos a tag fieldset, ela cria uma divisão, uma borda, agrupando campos relacionados. O legend dá uma legenda para esse agrupamento: "Dados pessoais".
Vamos adicionar a legend ao nosso fieldset:
<legend>Dados Pessoais</legend>
Comitando alterações e preparando para a próxima sessão
Terminamos os dados pessoais. Não podemos esquecer de comitar tudo que fizemos. Adicionamos todos os arquivos para comitar. Git status mostra que o index.html foi modificado. Git add e git commit -m "Cria sessão de dados pessoais". Feito isso, fazemos um push. Git push -1, que é uma abreviação para -origin. Tudo certo. Abrimos um pull request para enviar as modificações. Queremos jogar nossa feature de dados pessoais para a main. Criamos um pull request para isso, simulando que outros desenvolvedores vão validar o código. Na próxima aula, continuamos e seguimos para a criação da próxima sessão. Até lá.