12. Criação das vistas do produto

Para estruturar as vistas dos recursos de produto, vamos usar o layout principal criado nos capítulos anteriores

index.blade.php

A vista index.blade.php será usada para mostrar todos os produtos numa lista. Crie este ficheiro na pasta resources/views/produtos/:

@extends('layouts.app')

@section('content')
<div class="row justify-content-center mt-3">
    <div class="col-md-12">

        @if ($message = Session::get('success'))
            <div class="alert alert-success" role="alert">
                {{ $message }}
            </div>
        @endif

        <h1>Lista de Produtos</h1>
        <a href="{{ route('produtos.create') }}" class="btn btn-primary">Adicionar Produto</a>

        <table class="table table-striped table-bordered">
            <thead>
              <tr>
                <th scope="col">ID</th>
                <th scope="col">Código</th>
                <th scope="col">Nome</th>
                <th scope="col">Quantidade</th>
                <th scope="col">Preço</th>
                <th scope="col">Ações</th>
              </tr>
            </thead>
            <tbody>
                @forelse($produtos as $produto)
                    <tr>
                        <td>{{ $produto->id }}</td>
                        <td>{{ $produto->code }}</td>
                        <td>{{ $produto->name }}</td>
                        <td>{{ $produto->quantity }}</td>
                        <td>{{ $produto->price }}</td>
                        <td>
                            <a href="{{ route('produtos.show', $produto->id) }}" class="btn btn-info">Ver</a>
                            <a href="{{ route('produtos.edit', $produto->id) }}" class="btn btn-warning">Editar</a>
                            <form action="{{ route('produtos.destroy', $produto->id) }}" method="POST" style="display:inline;">
                                @csrf
                                @method('DELETE')
                                <button type="submit" class="btn btn-danger">Apagar</button>
                            </form>
                        </td>
                    </tr>
                    @empty
                    <tr>
                        <td colspan="6">
                            <span class="text-danger">
                                <strong>Não foram encontrados produtos</strong>
                            </span>
                        </td>
                    </tr>
                @endforelse
            </tbody>
        </table>

        {{ $produtos->links() }}
    </div>
</div>
@endsection

Esta vista inclui uma tabela que mostra a lista de produtos, cada um com opções para ver, editar ou apagar. Tem existe a opção para adicionar um novo produto

create.blade.php

A vista create.blade.php permitirá ao utilizador adicionar um novo produto. Crie este ficheiro na pasta resources/views/produtos/:

@extends('layouts.app')

@section('content')

<div class="row justify-content-center mt-3">
    <div class="col-md-8">

        <div class="card">
            <div class="card-header">
                <div class="float-start">
                    Adicionar Novo Produto
                </div>
                <div class="float-end">
                    <a href="{{ route('produtos.index') }}" class="btn btn-primary btn-sm">&larr; Voltar</a>
                </div>
            </div>
            <div class="card-body">
                <form action="{{ route('produtos.store') }}" method="post">
                    @csrf

                    <div class="mb-3 row">
                        <label for="code" class="col-md-4 col-form-label text-md-end text-start">Código</label>
                        <div class="col-md-6">
                          <input type="text" class="form-control @error('code') is-invalid @enderror" id="code" name="code" value="{{ old('code') }}">
                            @if ($errors->has('code'))
                                <span class="text-danger">{{ $errors->first('code') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="name" class="col-md-4 col-form-label text-md-end text-start">Nome</label>
                        <div class="col-md-6">
                          <input type="text" class="form-control @error('name') is-invalid @enderror" id="name" name="name" value="{{ old('name') }}">
                            @if ($errors->has('name'))
                                <span class="text-danger">{{ $errors->first('name') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="quantity" class="col-md-4 col-form-label text-md-end text-start">Quantidade</label>
                        <div class="col-md-6">
                          <input type="number" class="form-control @error('quantity') is-invalid @enderror" id="quantity" name="quantity" value="{{ old('quantity') }}">
                            @if ($errors->has('quantity'))
                                <span class="text-danger">{{ $errors->first('quantity') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="price" class="col-md-4 col-form-label text-md-end text-start">Preço</label>
                        <div class="col-md-6">
                          <input type="number" step="0.01" class="form-control @error('price') is-invalid @enderror" id="price" name="price" value="{{ old('price') }}">
                            @if ($errors->has('price'))
                                <span class="text-danger">{{ $errors->first('price') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="description" class="col-md-4 col-form-label text-md-end text-start">Descrição</label>
                        <div class="col-md-6">
                            <textarea class="form-control @error('description') is-invalid @enderror" id="description" name="description">{{ old('description') }}</textarea>
                            @if ($errors->has('description'))
                                <span class="text-danger">{{ $errors->first('description') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <input type="submit" class="col-md-3 offset-md-5 btn btn-primary" value="Adicionar">
                    </div>

                </form>
            </div>
        </div>
    </div>
</div>
@endsection

Esta vista contém um formulário para criar um novo produto. Usa o método POST para enviar dados para a rota produtos.store. Repare no uso obrigatório do @csrf devido à segurança de Cross Scripting.

edit.blade.php

A vista edit.blade.php será utilizada para editar um produto existente. Crie este ficheiro na pasta resources/views/produtos/:

@extends('layouts.app')

@section('content')

<div class="row justify-content-center mt-3">
    <div class="col-md-8">

        <div class="card">
            <div class="card-header">
                <div class="float-start">
                    Editar Produto
                </div>
                <div class="float-end">
                    <a href="{{ route('produtos.index') }}" class="btn btn-primary btn-sm">&larr; Voltar</a>
                </div>
            </div>
            <div class="card-body">
                <form action="{{ route('produtos.update', $produto->id) }}" method="post">
                    @csrf
                    @method("PUT")

                    <div class="mb-3 row">
                        <label for="code" class="col-md-4 col-form-label text-md-end text-start">Código</label>
                        <div class="col-md-6">
                          <input type="text" class="form-control @error('code') is-invalid @enderror" id="code" name="code" value="{{ $produto->code  }}">
                            @if ($errors->has('code'))
                                <span class="text-danger">{{ $errors->first('code') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="name" class="col-md-4 col-form-label text-md-end text-start">Nome</label>
                        <div class="col-md-6">
                          <input type="text" class="form-control @error('name') is-invalid @enderror" id="name" name="name" value="{{ $produto->name }}">
                            @if ($errors->has('name'))
                                <span class="text-danger">{{ $errors->first('name') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="quantity" class="col-md-4 col-form-label text-md-end text-start">Quantidade</label>
                        <div class="col-md-6">
                          <input type="number" class="form-control @error('quantity') is-invalid @enderror" id="quantity" name="quantity" value="{{ $produto->quantity }}">
                            @if ($errors->has('quantity'))
                                <span class="text-danger">{{ $errors->first('quantity') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="price" class="col-md-4 col-form-label text-md-end text-start">Preço</label>
                        <div class="col-md-6">
                          <input type="number" step="0.01" class="form-control @error('price') is-invalid @enderror" id="price" name="price" value="{{ $produto->price }}">
                            @if ($errors->has('price'))
                                <span class="text-danger">{{ $errors->first('price') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="description" class="col-md-4 col-form-label text-md-end text-start">Descrição</label>
                        <div class="col-md-6">
                            <textarea class="form-control @error('description') is-invalid @enderror" id="description" name="description">{{ $produto->description }}</textarea>
                            @if ($errors->has('description'))
                                <span class="text-danger">{{ $errors->first('description') }}</span>
                            @endif
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <input type="submit" class="col-md-3 offset-md-5 btn btn-primary" value="Atualizar">
                    </div>

                </form>
            </div>
        </div>
    </div>
</div>
@endsection

Esta vista inclui um formulário para editar os detalhes de um produto existente, usando os métodos @csrf e @method('PUT') para enviar os dados para a rota produtos.update.

show.blade.php

A vista show.blade.php mostrará os detalhes de um produto específico. Crie este ficheiro na pasta resources/views/produtos/:

@extends('layouts.app')

@section('content')

<div class="row justify-content-center mt-3">
    <div class="col-md-8">

        <div class="card">
            <div class="card-header">
                <div class="float-start">
                    Detalhes do Produto
                </div>
                <div class="float-end">
                    <a href="{{ route('produtos.index') }}" class="btn btn-primary btn-sm">&larr; Voltar</a>
                </div>
            </div>
            <div class="card-body">

                    <div class="row">
                        <label for="code" class="col-md-4 col-form-label text-md-end text-start"><strong>Código:</strong></label>
                        <div class="col-md-6" style="line-height: 35px;">
                            {{ $produto->code }}
                        </div>
                    </div>

                    <div class="row">
                        <label for="name" class="col-md-4 col-form-label text-md-end text-start"><strong>Nome:</strong></label>
                        <div class="col-md-6" style="line-height: 35px;">
                            {{ $produto->name }}
                        </div>
                    </div>

                    <div class="row">
                        <label for="quantity" class="col-md-4 col-form-label text-md-end text-start"><strong>Quantidade:</strong></label>
                        <div class="col-md-6" style="line-height: 35px;">
                            {{ $produto->quantity }}
                        </div>
                    </div>

                    <div class="row">
                        <label for="price" class="col-md-4 col-form-label text-md-end text-start"><strong>Preço:</strong></label>
                        <div class="col-md-6" style="line-height: 35px;">
                            {{ $produto->price }} €
                        </div>
                    </div>

                    <div class="row">
                        <label for="description" class="col-md-4 col-form-label text-md-end text-start"><strong>Descrição:</strong></label>
                        <div class="col-md-6" style="line-height: 35px;">
                            {{ $produto->description }}
                        </div>
                    </div>

            </div>
        </div>
    </div>
</div>

@endsection

Esta vista apresenta uma visualização detalhada de um produto, com um botão para voltar à lista de produtos.

Testar

Para testar o projeto aceda a http://127.0.0.1:8000/produtos. Pode descarregar o projeto completo aqui. Tem que estar registado para descarregar o projeto.

Resumo

Neste capítulo, criámos diversas vistas Blade para gerir os recursos de produto na nossa aplicação Laravel. Estas vistas incluem layouts, vistas para listar, criar, editar e mostrar produtos. Estes ficheiros formam a base das interações do utilizador dentro da aplicação, permitindo a visualização e manipulação eficiente dos dados de produto. Com estas vistas funcionais, a interface do utilizador da nossa aplicação está agora completa.

<< 11. Ativar Bootstrap 5 Índice 13. Servidor de Desenvolv... >>