Crie o model Aluno
para criar o model Aluno use o comando: php artisan make:model EadAluno -m
adicione os seguintes campos:
Schema::create('alunos', function (Blueprint $table) {
$table->id();
$table->string('nome', 100);
$table->string('cpf', 19)->nullable();
$table->string("rg", 20)->nullable();
$table->string('logradouro', 80)->nullable();
$table->string('senha', 80)->nullable();
$table->string('numero', 10)->nullable();
$table->string('bairro', 50)->nullable();
$table->string('uf', 2)->nullable();
$table->string('complemento', 50)->nullable();
$table->string('telefone', 20)->nullable();
$table->string('celular', 20)->nullable();
$table->string('email', 40)->nullable();
$table->string('cep', 10)->nullable();
$table->string('cidade',100)->nullable();
$table->string('imagem',100)->nullable();
$table->string('sexo',15)->nullable();
$table->date("nascimento")->nullable();
$table->bigInteger('status_id')->unsigned()->nullable();
$table->foreign('status_id')->references('id')->on('statuses');
$table->timestamps();
});
Crie um controller de recursos chamado Aluno, para que o projeto fique mais organizado salve o controller numa pasta chamada Cadastro
Crie uma rota resource setando para o controller AlunoController
Route::resource("/aluno", AlunoController::class);
Crie a view para a listagem de Aluno
Dentro da pasta resources/view crie uma pasta chamada de Cadastro e dentro de Cadastro crie uma outra chamada de Aluno e dentro da pasta Aluno crie um arquivo chamado Index.blade.php
Copie o conteúdo do arquivo lst_aluno para o arquivo Cadastro/Aluno/Index.blade.php, não esqueça envolvê-lo pelos comandos:
@extends('template')
@section('conteudo')
//aqui fica o conteúdo do arquivo
@endsection
Na view Index, faça os seguintes procedimentos:
- Faça o loop para receber os dados do banco e listar na tabela
- Configure o link para fazer a edição de um registro
- Configure o link para fazer a exclusão de um registro
@foreach ($lista as $l)
<tr>
<td align="center">{{ $l->id }}</td>
<td align="left">{{ $l->nome_razao_social }}</td>
<td align="left">{{ $l->cpf_cnpj }}</td>
<td align="center">{{ $l->email }}</td>
<td align="center">{{ $l->celular }}</td>
<td align="center">
<a href="{{ route('cliente.edit', $l->id) }}"
class="btn d-inline-block btn-outline-roxo"><i class="fas fa-edit"></i>
Editar</a>
<a href="javascript:;"
onclick="confirm('Tem Certeza?') ? document.getElementById('apagar{{ $l->id }}').submit() : '';"
class="btn d-inline-block btn-outline-vermelho ml-1"><i
class="fas fa-trash-alt"></i> Excluir
<form action="{{ route('cliente.destroy', $l->id) }}" method="POST"
id="apagar{{ $l->id }}">
@method('delete')
@csrf
</form>
</a>
</td>
</tr>
@endforeach
Prepare seu sistema para que permita que sejam feitos filtros por nome, email e cpf
No método index faça as seguintes implementações:
- Coloque um Request como parâmetro de recebimento do método
- Crie um objeto chamado filtro com os campos nome, cpf e email
- Na array $dados["lista"] chame o método filtro do model cliente e passe como parâmetro o objeto filtro criado
- para o array $dados liste os alunos
ublic function index(Request $request)
{
$filtro = new stdClass;
$filtro->nome = $request->nome ?? null;
$filtro->cpf = $request->cpf ?? null;
$filtro->email = $request->email ?? null;
$dados["lista"] = EadAluno::filtro($filtro);
$dados["filtro"] = $filtro;
return View("Cadastro.Aluno.Index", $dados);
}
No model Aluno, crie um método chamado filtro que receba como parâmetro um objeto $filtro e um variável chamada $paginas inicializada com zero e implemente o método de forma que:
- Se houver o campo $filtro->nome, faça o filtro pelo nome
- se houver o campo $filtro->cpf, faça o filtro pela cpf
- se houver o campo $filtro->email, faça o filtro pela email
- se a variável páginas for maior que zero que o seja do tipo paginate(), senão que seja get()
public static function filtro($filtro, $paginas=0){
$retorno = self::query();
if($filtro->nome){
$retorno->where("nome", "like", '%'.$filtro->nome.'%');
}
if($filtro->cpf){
$retorno->where("cpf", "like", '%'.$filtro->cpf.'%');
}
if($filtro->email){
$retorno->where("email", "like", '%'.$filtro->email.'%');
}
if($paginas>0){
$retorno = $retorno->paginate($paginas);
}else{
$retorno = $retorno->get();
}
return $retorno;
}
Na view index, no formulário do filtro implemente o seguinte:
- nomeie o primeiro input como nome e no value faça a verificação se existe o objetivo $filtro->nome se sim mostre.
- nomeie o segundo input como email e no value faça a verificação se existe o objetivo $filtro->email se sim mostre.
- nomeie o terceiro input como cpf e no value faça a verificação se existe o objetivo $filtro->cpf se sim mostre.
<form>
<div class="mostraFiltro bg-padrao mt-2 p-2 radius-4 border">
<div class="rows center-middle">
<div class="col-3">
<label class="text-label d-block text-branco">Cliente </label>
<input type="text" name="nome" value="{{ $filtro->nome ?? null }}"
class="form-campo" placeholder="Digite aqui..">
</div>
<div class="col-3">
<label class="text-label d-block text-branco">Email </label>
<input type="text" name="email" value="{{ $filtro->email ?? null }}"
class="form-campo" placeholder="Digite aqui..">
</div>
<div class="col-3">
<label class="text-label d-block text-branco">CPF </label>
<input type="text" name="cpf" value="{{ $filtro->cpf ?? null }}"
class="form-campo" placeholder="Digite aqui..">
</div>
<div class="col-2 mt-0 pt-4">
<input type="submit" value="Pesquisar" class="width-100 btn btn-roxo text-uppercase">
</div>
</div>
</div>
</form>
Faça o teste com os filtros
Para fazer o cadastro de aluno será necessário criar duas novas views, Dentro da pasta Cadastro/Aluno faça o seguinte:
- Crie uma view chamada Create.blade.php
- Crie uma view chamada Edit.blade.php
Copie o conteúdo do arquivo frm_cliente para o arquivo Cadastro/Cliente/Create.blade.php, não esqueça envolvê-lo pelos comandos:
@extends('template')
@section('conteudo')
//aqui fica o conteúdo do arquivo
@endsection
configure os input atribuindo a eles na propriedade name o nome igual ao que foi definido na criação da tabela,
também observe os tipos de dados específicos e os que são obrigatórios atribua a propriedade required
<form action="{{ route('cliente.store') }}" method="post">
@csrf
<div class="col-12 mb-4">
<fieldset>
<legend>Pesquisar Por CNPJ</legend>
<div class="rows center-middle">
<div class="col-3 mb-3">
<label class="text-label">Tipo Cliente</label>
<select name="tipo_cliente" id="tipo_cliente" class="form-campo"
onchange="tipoCliente()">
<option value="J">Juridica</option>
<option value="F">Física</option>
</select>
</div>
<div class="col-6 mb-3" id="div_pesquisar">
<label class="text-label">Pesquisa CNPJ</label>
<div class="grupo-form-btn">
<input type="text" id="codigocnpj" class="form-campo mascara-cnpj">
</div>
</div>
<div class="col-3 mt-4 mb-3">
<input type="button" onclick="buscarCNPJ()" value="Pesquisar CNPJ"
class="width-100 btn btn-roxo d-block m-auto">
</div>
</div>
</fieldset>
</div>
<div id="tab-1">
<div class="p-2">
<span class="d-block mt-0 mb-4 border-bottom text-uppercase pb-1">Informações básicas</span>
<div class="rows">
<div class="col-6 mb-3">
<label class="text-label" id="lblRazaoSocial">Razão Social<span
class="text-vermelho">*</span></label>
<input type="text" name="nome_razao_social" id="nome_razao_social" required
value="{{ old('nome_razao_social') }}" class="form-campo">
</div>
<div class="col-6 mb-3" id="divFantasia">
<label class="text-label">Nome Fantasia</label>
<input type="text" name="nome_fantasia" id="nome_fantasia"
value="{{ old('nome_fantasia') }}" id="nome_fantasia" class="form-campo">
</div>
<div class="col-4 mb-3">
<label class="text-label id="lblCnpj">CNPJ<span class="text-vermelho">*</span></label>
<input type="text" name="cpf_cnpj" id="cnpj" value="{{ old('cpf_cnpj') }}"
class="form-campo">
</div>
<div class="col-3" id="div_tipo_contribuinte">
<label class="text-label">Tipo de Contribuinte </label>
<select class="form-campo" name="tipo_contribuinte" id="tipo_contribuinte">
<option value="1" {{ old('tipo_contribuinte') == '0' ? 'selected' : '' }}>1 -
Contribuinte ICMS</option>
<option value="9" {{ old('tipo_contribuinte') == '9' ? 'selected' : '' }}>9 -
Não Contribuinte</option>
<option value="2" {{ old('tipo_contribuinte') == '2' ? 'selected' : '' }}>2 -
Contribuinte Isento</option>
</select>
</div>
<div class="col-3 mb-3">
<label class="text-label">Consumidor Final</label>
<select name="indFinal" id="indFinal" class="form-campo">
<option value="0" {{ old('indFinal') == '0' ? 'selected' : '' }}>Não</option>
<option value="1" {{ old('indFinal') == '1' ? 'selected' : '' }}>Sim</option>
</select>
</div>
<div class="col-2 mb-3">
<label class="text-label" id="lblInscEstadual">Inscrição Estadual</label>
<input type="text" name="rg_ie" maxlength="14" id="rg_ie"
value="{{ old('rg_ie') }}" class="form-campo">
</div>
<div class="col-4 mb-3">
<label class="text-label">Celular:</label>
<input type="text" name="celular" value="{{ old('celular') }}" class="form-campo">
</div>
<div class="col-8 mb-3">
<label class="text-label">Email</label>
<input type="text" name="email" value="{{ old('email') }}"
class="form-campo">
</div>
</div>
</div>
</div>
<div id="tab-2">
<div class="p-2">
<span class="d-block mt-4 mb-4 border-bottom text-uppercase pb-1">Endereço</span>
<div class="rows">
<div class="col-2 mb-3">
<label class="text-label">CEP</label>
<div class="input-grupo">
<input type="text" value="{{ old('cep') }}" name="cep" id="cep"
class="form-campo busca_cep mascara-cep">
</div>
</div>
<div class="col-6 mb-3">
<label class="text-label">Logradouro</label>
<input type="text" name="logradouro" id="logradouro"
value="{{ old('logradouro') }}" class="form-campo rua">
</div>
<div class="col-2 mb-4">
<label class="text-label">Numero</label>
<input type="text" name="numero" id="numero" value="{{ old('numero') }}"
class="form-campo ">
</div>
<div class="col-2 mb-2">
<label class="text-label">UF</label>
<input type="text" name="uf" id="uf" value="{{ old('uf') }}"
class="form-campo estado">
</div>
<div class="col-3 mb-3">
<label class="text-label">Complemento</label>
<input type="text" name="complemento" id="complemento"
value="{{ old('complemento') }}" class="form-campo">
</div>
<div class="col-3 mb-3">
<label class="text-label">Bairro</label>
<input type="text" name="bairro" id="bairro" value="{{ old('bairro') }}"
class="form-campo bairro ">
</div>
<div class="col-4 mb-2">
<label class="text-label">Cidade</label>
<input type="text" name="cidade" id="cidade" value="{{ old('cidade') }}"
class="form-campo cidade">
</div>
<div class="col-2 mb-2">
<label class="text-label">IBGE</label>
<input type="text" name="ibge" id="ibge" value="{{ old('ibge') }}"
class="form-campo ibge">
</div>
</div>
</div>
</div>
<div class="col-12 text-center pb-4">
<input type="submit" value="Salvar" class="btn btn-roxo m-auto">
</div>
</form>
Após fazer a busca pelo cep é preciso configurar os inputs que receberão os dados da busca, para isso faça o seguinte:
- no logradouro, coloque a classe rua
- no UF, coloque a classe estado
- no Bairro, coloque a classe bairro
- no Cidade, coloque a classe cidade
- no IBGE, coloque a classe ibge (esse campo é importante para emissão da nfe)
<div class="col-6 mb-3">
<label class="text-label">Logradouro</label>
<input type="text" name="logradouro" id="logradouro"
value="{{ old('logradouro') }}" class="form-campo rua">
</div>
<div class="col-2 mb-4">
<label class="text-label">Numero</label>
<input type="text" name="numero" id="numero" value="{{ old('numero') }}"
class="form-campo ">
</div>
<div class="col-2 mb-2">
<label class="text-label">UF</label>
<input type="text" name="uf" id="uf" value="{{ old('uf') }}"
class="form-campo estado">
</div>
<div class="col-3 mb-3">
<label class="text-label">Complemento</label>
<input type="text" name="complemento" id="complemento"
value="{{ old('complemento') }}" class="form-campo">
</div>
<div class="col-3 mb-3">
<label class="text-label">Bairro</label>
<input type="text" name="bairro" id="bairro" value="{{ old('bairro') }}"
class="form-campo bairro ">
</div>
<div class="col-4 mb-2">
<label class="text-label">Cidade</label>
<input type="text" name="cidade" id="cidade" value="{{ old('cidade') }}"
class="form-campo cidade">
</div>
<div class="col-2 mb-2">
<label class="text-label">IBGE</label>
<input type="text" name="ibge" id="ibge" value="{{ old('ibge') }}"
class="form-campo ibge">
</div>
implemente o método store para receber e salvar os dados do formulário no Banco de dados
Implemente o método store de forma que o mesmo receba os dados do formulário e salve no banco de dados, caso ache necessário use um bloco try/catch
$req = $request->except(["_token"]);
try {
$req["status_id"] = config('constantes.status.ATIVO');
EadAluno::Create($req);
return redirect()->route("aluno.index")->with("msg_sucesso", "inserido com sucesso");
} catch (\Throwable $th) {
return redirect()->back()->with("msg_erro", "Erro: " . $th->getMessage());
}
Uma boa prática de programação é validar os dados antes de enviá-los para o banco de dados e uma bom recurso que o laravel oferece são os requests.
implemente um request de forma que faça todas as validações necessárias para salvar a informações no banco
No arquivo de request configure as validações necessárias e não esqueça de setar o método authorize para true;
public function rules()
{
$regras = [
'nome' => 'required|min:5|max:60',
'cpf' => 'required',
'logradouro' => 'required|max:60',
'numero' => 'required',
'bairro' => 'required|max:60',
'cep' => 'required',
'cidade' => 'required|max:60',
'uf' => 'required',
];
return $regras;
}
Teste o sistema fazendo cadastros
Configure o método edit do Controller, com as seguinte ações:
- Busque o aluno pelo id passado no parâmetro e guarde a informação em um array $dados
- chame a view Aluno/Create passando o array $dados
public function edit(string $id)
{
$dados["aluno"] = EadAluno::find($id);
return view("Aluno.Create", $dados);
}
Na view edit, copie e cole o conteúdo contido no arquivo edit_cliente.html, este arquivo já está com todas as configurações necessárias, mas caso queira fazer do zero, siga os passo abaixo:
- Copie os dados da view Create
- Configure o elemento form, sistema deve verificar se o objeto cliente existe,
- caso ele exista, no formulário deve ser configurada a rota cliente.update
- caso não exista, no formulário deve ser configurada a rota cliente.store
- Na propriedade value de cada input, faça uma verificação se existe o objeto produto, se existir imprimir o valor do campo correspondente, senão existe imprimir o objeto old()
Implemente o método update de forma que o mesmo receba os dados do formulário e salve no banco de dados, caso ache necessário use um bloco try/catch
public function update(Request $request, $id)
{
$req = $request->except(["_token","_method", "senha"]);
try {
$req["cpf"] = tira_mascara($req["cpf"]);
$req["celular"] = ($req["celular"]) ? tira_mascara($req["celular"]) : NULL;
if($request->senha) {
$req["senha"] = md5($request->senha);
}
EadAluno::where("id", $id)->update(objToArray($req));
return redirect()->route('aluno.index')->with('msg_sucesso', "Aluno Alterado com sucesso.");
} catch (\Exception $e) {
return redirect()->back()->with('msg_erro', $e->getMessage());
}
}
Faça o teste do seu sistema de forma que o mesmo consiga criar um novo registro e também alterá-lo
implemente o método destroy do Controller, com as seguinte ações:
- Busque o aluno pelo id passado no parâmetro
- Caso encontre, exclua a mesma do banco, coloque esta instrução em um bloco try/catch
- Verifique se o campo imagem está preenchido e se tiver, verifique se a imagem existe e caso exista exclua-a
- redirecione para a rota index
public function destroy($id)
{
try{
$h = EadAluno::find($id);
$h->delete();
return redirect()->back()->with('msg_sucesso', "Produto excluído com sucesso.");
}catch (\Exception $e){
$cod = $e->getCode();
return redirect()->back()->with('msg_erro', "Houve um problema ao excluir [$cod]");
}
}
Teste o seu sistema, para que você tenha certeza que está tudo o ok, o sistema deverá:
- Listar todos os cliente
- Criar um cliente novo
- Editar um cliente selecionado
- Excluir um cliente selecionado