Crie o model Curso
para criar o model Curso use o comando: php artisan make:model EadCurso -m
adicione os seguintes campos:
Schema::create('cursos', function (Blueprint $table) {
$table->id();
$table->string('curso', 100);
$table->string('duracao', 20)->nullable();
$table->string("slug", 200) ;
$table->string("imagem", 95)->nullable() ;
$table->text("descricao")->nullable() ;
$table->decimal("valor", 10,2) ;
$table->strign("embed_youtube", 60)->nullable ;
$table->timestamps();
});
Crie um controller de recursos chamado Curso, para que o projeto fique mais organizado salve o controller numa pasta chamada Cadastro
Crie uma rota resource setando para o controller CursoController
Route::resource("/curso", CursoController::class);
Crie a view para a listagem de produto
Dentro da pasta resources/view crie uma pasta chamada de Cadastro e dentro de Cadastro crie uma outra chamada de Produto e dentro da pasta Produto crie um arquivo chamado Index.blade.php
Copie o conteúdo do arquivo lst_produto para o arquivo Cadastro/Produto/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)
@php
$imagem = $l->imagem ? 'storage/' . $l->imagem : 'assets/img/semproduto.png';
@endphp
<tr>
<td align="center">{{ $l->id }}</td>
<td align="center"><img src="{{ asset($imagem) }}" width="40"></td>
<td align="left">{{ $l->nome }}</td>
<td align="left">{{ $l->categoria->categoria ?? '--' }}</td>
<td align="center">{{ $l->preco_venda }}</td>
<td align="center">{{ $l->estoque_atual }}</td>
<td align="center">
<a href="{{ route('produto.edit', $l->id) }}"
class="btn d-inline-flex gap-3 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-flex gap-3 btn-outline-vermelho ml-1"><i
class="fas fa-trash-alt"></i> Excluir
<form action="{{ route('produto.destroy', $l->id) }}" method="POST"
id="apagar{{ $l->id }}">
@method('delete')
@csrf
</form>
</a>
</td>
</tr>
@endforeach
Para fazer o cadastro de produto será necessário criar duas novas views, Dentro da pasta Cadastro/Produto 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_produto para o arquivo Cadastro/Produto/Create.blade.php, não esqueça envolvê-lo pelos comandos:
@extends('template')
@section('conteudo')
//aqui fica o conteúdo do arquivo
@endsection
Configure o elemento form da view Create, com as seguintes ações:
- Setar a rota produto.store na propriedade action do form
- Setar o método post na propriedade method do form
- setar a propriedade enctype para multipart/form-data
- implementar o helper @csrf dentro do form
<form action="{{ route('produto.store') }}" method="POST" enctype="multipart/form-data">
@csrf
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
<div class="col-8 px-2">
<div class="rows">
<div class="col-12 mb-3">
<label class="text-label">Nome do produto</label>
<input type="text" name="nome" value="" class="form-campo" required>
</div>
<div class="col-4 mb-3">
<label class="text-label">NCM</label>
<input type="text" name="ncm" value="" data-mask="0000.00.00" maxlength="10"
class="form-campo" required>
</div>
<div class="col-4 mb-3">
<label class="text-label">Código Barra/Gtin/EanTrib</label>
<input type="text" name="gtin" value="" class="form-campo">
</div>
<div class="col-4 mb-3">
<label class="text-label">Cest</label>
<input type="text" name="cest" value="" class="form-campo">
</div>
<div class="col-6 mb-3">
<label class="text-label">Origem</label>
<select class="form-campo" name="origem">
<option value="SACO"> Origem</option>
</select>
</div>
<div class="col-6 mb-3">
<label class="text-label">Categoria</label>
<div class="group-btn d-flex center-midlle">
<select class="form-campo" name="categoria_id">
<option value="SACO"> Unidade</option>
</select>
<a href="javascript:;" onclick="abrirModal('#modalCategoria')"
class="text-verde p-1 border radius-50 ml-1 fas fa-plus"
title="Inserir nova categoria"></a>
</div>
</div>
<div class="col-4 mb-3">
<label class="text-label">Unidade</label>
<select class="form-campo" name="unidade" required>
<option value="SACO"> Unidade</option>
</select>
</div>
<div class="col-4 mb-3">
<label class="text-label">Estoque Inicial</label>
<input type="text" name="estoque_inicial" value=""
class="form-campo mascara-float">
</div>
<div class="col-4 mb-3">
<label class="text-label">Estoque Máximo</label>
<input type="text" name="estoque_maximo" value="" class="form-campo mascara-float">
</div>
<div class="col mb-3">
<label class="text-label">Estoque Minimo</label>
<input type="text" name="estoque_minimo" value="" class="form-campo mascara-float">
</div>
<div class="col mb-3">
<label class="text-label">Preço Custo</label>
<input type="text" name="preco_custo" value="" id="preco_custo"
onkeyup="calcularPreco()" class="form-campo mascara-float">
</div>
<div class="col mb-3">
<label class="text-label">(%) Margem Lucro</label>
<input type="text" name="margem_lucro" value="" onkeyup="calcularPreco()"
id="margem_lucro" class="form-campo mascara-float">
</div>
<div class="col mb-3">
<label class="text-label">Preço Venda</label>
<input type="text" name="preco_venda" value="" id="preco_venda"
class="form-campo mascara-float" required>
</div>
<div class="col-12 mt-4">
<input type="submit" value="Inserir Novo Produto"
class="btn btn-padrao btn-medio d-block m-auto">
</div>
</div>
</div>
implemente o método store para receber e salvar os dados do formulário no Banco de dados
Implemente o upload de imagens
Ative o storage link, utilizando o comando: php artisan storage:link
Faça o upload de imagens, seguindo os passo:
- Verifique se a imagem foi passada na request e se seu valor é válido
- receba os dados numa variável $file
- salve os dados na pasta upload/produto e guarde o nome do arquivo em uma variável para que seja salva no banco de dados
if($request->hasFile('imagem') && $request->imagem->isValid()){
$file = $request->file("imagem");
$req["imagem"] = $file->store("upload/curso");
}
Caso não tenha conseguido fazer, segue o código completo
public function store(Request $request)
{
$retorno = new \stdClass();
try {
$req = $request->except(["_token","_method", "file"]);
$req["valor"] = isset($req["valor"]) ? getFloat($req["valor"]) : null;
$req["status_id"] = config("constantes.status.ATIVO");
$req["slug"] = Str::kebab($request->curso);
if($request->hasFile('imagem') && $request->imagem->isValid()){
$file = $request->file("imagem");
$req["imagem"] = $file->store("upload/curso");
}
EadCurso::Create($req);
$retorno->tem_erro = false;
$retorno->erro = "";
return redirect()->route('curso.index')->with('msg_sucesso', "Curso Inserido com sucesso.");
} catch (\Exception $e) {
$retorno->tem_erro = true;
$retorno->erro = $e->getMessage();
return redirect()->back()->with('msg_erro', $e->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
Para criar um request use os seguinte comando: php artisan make:request CursoRequest
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()
{
$id= $this->segment(2);
$rules= [
"curso" => "required",
"valor" => "required",
"imagem" =>"nullable"
];
if(!is_null($this->imagem)){
$rules['imagem'] = 'file|mimetypes:image/png,image/jpg,image/jpeg|image:jpg,png,jpeg';
}
return $rules;
}
Teste o sistema fazendo cadastros
Configure o método edit do Controller, com as seguinte ações:
- Busque o produto pelo id passado no parâmetro e guarde a informação em um array $dados
- no array $dados liste as categorias
- no array $dados liste as unidades
- no array dados sete a variável projetoJs para true
- no array dados sete a variável categoriaJs para true
- chame a view Produto/Edit passando o array $dados
public function edit($id)
{
$dados["produto"] = Produto::find($id);
$dados["categorias"] = Categoria::get();
$dados["unidades"] = Unidade::get();
$dados["categoriaJs"] = true;
$dados["produtoJs"] = true;
return View("Cadastro.Produto.Edit", $dados);
}
Na view edit, copie e cole o conteúdo contido no arquivo edit_produto.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 produto existe,
- caso ele exista, no formulário deve ser configurada a rota produto.update
- caso não exista, no formulário deve ser configurada a rota produto.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(ProdutoRequest $request, $id)
{
$req = $request->except(["_token","estoque_inicial"]);
try {
$req['estoque_maximo'] = getFloat($req['estoque_maximo']);
$req['estoque_minimo'] = getFloat($req['estoque_minimo']);
$req['preco_custo'] = getFloat($req['preco_custo']);
$req['margem_lucro'] = getFloat($req['margem_lucro']);
$req['preco_venda'] = getFloat($req['preco_venda']);
$req["status_id"] = config('constantes.status.ATIVO');
$produto = Produto::find($id);
if($request->hasFile('imagem') && $request->imagem->isValid()){
$file = $request->file("imagem");
$req["imagem"] = $file->store("upload/produto");
}
$produto->update($req);
return redirect()->route("produto.index")->with("msg_sucesso", "inserido com sucesso");
} catch (\Throwable $th) {
return redirect()->back()->with("msg_erro", "Erro: " . $th->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 produto 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 {
$produto = Produto::find($id);
if($produto->imagem){
if(Storage::exists($produto->imagem)){
Storage::delete($produto->imagem);
}
}
$produto->delete();
return redirect()->route("produto.index")->with("msg_sucesso", "excluido com sucesso");
} catch (\Throwable $th) {
return redirect()->back()->with("msg_erro", "Erro: " . $th->getMessage());
}
}
Teste o seu sistema, para que você tenha certeza que está tudo o ok, o sistema deverá:
- Listar todos os produtos
- Criar um produto novo
- Editar um produto selecionado
- Excluir um produto selecionado