Aula 13: Integração Final, Validação e Boas Práticas no Módulo de Produtos

Por: Nerd Toolkit Postado em: Abril 16, 2025 Visto por: 230

Nesta aula, vamos reunir todas as funcionalidades implementadas para o módulo de produtos e garantir que o ciclo CRUD (Cadastro, Listagem, Edição e Exclusão) esteja funcionando de forma integrada e consistente. Nesta etapa, abordaremos:

  • A integração do módulo com o sistema completo utilizando a estrutura de pastas padronizada (Classes, Controllers e Views) .

  • A validação final dos dados, o tratamento de erros e o feedback ao usuário por meio de sessões.

  • A consolidação das boas práticas de desenvolvimento (arquitetura MVC e uso de prepared statements).


1. Recapitulação da Estrutura do Módulo

Nossa estrutura de pastas deve estar organizada da seguinte forma:

 
/seu_projeto
│
├── /Classes
│   ├── Database.php
│   ├── Usuario.php
│   └── Produto.php         // Classe para operações com produtos (CRUD)
│
├── /Controllers
│   ├── cadastroController.php
│   ├── loginController.php
│   ├── produtoController.php  // Trata cadastro e edição de produtos
│   └── excluirProduto.php     // Controlador para exclusão de produtos
│
├── /Views
│   ├── header.php          // Cabeçalho compartilhado com links, meta tags, etc.
│   ├── login.php
│   ├── dashboard.php       // Dashboard principal do usuário
│   ├── produto_cadastro.php  // Interface para cadastro de produtos
│   ├── produto_listagem.php  // Interface para listagem de produtos
│   └── produto_editar.php    // Interface para edição de produtos
│
└── index.php               // Redireciona para a página de login 

No index.php, temos um simples redirecionamento para a página de login:

 
<?php 
// index.php - Página principal que redireciona para o login 
header("Location: Views/login.php");
exit();
?> 

O arquivo header.php precisa ser incluído em todas as Views para padronizar o layout, incluindo meta tags, links para o Bootstrap e um menu de navegação

 

2. Funcionalidades do Módulo de Produtos

O módulo de produtos contempla os seguintes métodos e funcionalidades:

2.1. Classe Produto (Classes/Produto.php)

Esta classe gerencia as operações de inserção, atualização (e, futuramente, listagem e exclusão) dos produtos. Atualize sua classe com a nova função atualizar. Seu código deve ficar assim:

 
<?php // Classes/Produto.php

class Produto {
    // Conexão com o banco de dados
    private $conn;
    // Nome da tabela de produtos
    private $table_name = "produtos";

    // Construtor para receber a conexão
    public function __construct($db) {
        $this->conn = $db;
    }

    /**
     * Método para cadastrar um novo produto.
     *
     * @param string $nome Nome do produto.
     * @param string $descricao Descrição detalhada.
     * @param float  $preco Preço do produto.
     * @param int    $quantidade Quantidade em estoque.
     * @return bool Retorna true se o cadastro for realizado com sucesso, ou false em caso de falha.
     */
    public function cadastrar($nome, $descricao, $preco, $quantidade) {
        // Prepara a query para inserção
        $query = "INSERT INTO " . $this->table_name . " (nome, descricao, preco, quantidade, data_cadastro) 
                  VALUES (:nome, :descricao, :preco, :quantidade, NOW())";
        $stmt = $this->conn->prepare($query);

        // Vincula os parâmetros usando bindParam para evitar SQL Injection
        $stmt->bindParam(':nome', $nome);
        $stmt->bindParam(':descricao', $descricao);
        $stmt->bindParam(':preco', $preco);
        $stmt->bindParam(':quantidade', $quantidade);

        // Executa a query e retorna true em caso de sucesso ou false se ocorrer algum erro
        if($stmt->execute()) {
            return true;
        }
        return false;
    }
    
    // Método para atualizar um produto.
    public function atualizar($id, $nome, $descricao, $preco, $quantidade) {
        $query = "UPDATE " . $this->table_name . " 
                  SET nome = :nome, descricao = :descricao, preco = :preco, quantidade = :quantidade 
                  WHERE id = :id";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(':nome', $nome);
        $stmt->bindParam(':descricao', $descricao);
        $stmt->bindParam(':preco', $preco);
        $stmt->bindParam(':quantidade', $quantidade);
        $stmt->bindParam(':id', $id);
        return ($stmt->execute()) ? true : false;
    }

    // Futuramente, métodos para listar, atualizar e excluir produtos podem ser adicionados.
}
?> 

2.2. Controlador de Produtos (Controllers/produtoController.php)

Este controlador diferencia as ações de cadastro, edição e exclusão de produtos com base em parâmetros do formulário, validando os dados e utilizando os métodos da classe Produto. Modifique seu arquivo, adicionando as novas funcionalidades. Veja um exemplo de como poderia ficar:

 
<?php
// Controllers/produtoController.php

// Inicia a sessão para permitir o uso de variáveis de sessão para feedback
session_start();

// Inclui os arquivos necessários para estabelecer a conexão com o banco e manipular os produtos
require_once '../Classes/Database.php';
require_once '../Classes/Produto.php';

/*
 * Parte 1: Tratamento da Exclusão de Produtos via GET
 * Se a requisição for GET e os parâmetros 'acao' e 'id' estiverem definidos, 
 * o controlador trata a exclusão do produto.
 */
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['acao']) && $_GET['acao'] == 'excluir' && isset($_GET['id'])) {
    // Recebe o ID do produto a ser excluído via GET
    $id = $_GET['id'];

    // Cria uma instância da conexão com o banco de dados
    $database = new Database();
    $db = $database->getConnection();

    // Prepara a query SQL para excluir o produto com base no ID
    $query = "DELETE FROM produtos WHERE id = :id";
    $stmt = $db->prepare($query);
    $stmt->bindParam(':id', $id);

    // Executa a query e define a mensagem de feedback
    if ($stmt->execute()) {
        $_SESSION['msg'] = "Produto excluído com sucesso!";
    } else {
        $_SESSION['msg'] = "Erro ao excluir o produto!";
    }
    // Redireciona para a página de listagem de produtos
    header("Location: ../Views/produto_listagem.php");
    exit();
}

/*
 * Parte 2: Tratamento de Requisições POST
 * Esta parte é responsável por tratar as operações de cadastro e edição de produtos.
 */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Recebe e trata os dados enviados pelo formulário
    $nome = trim($_POST['nome']);
    $descricao = trim($_POST['descricao']);
    $preco = trim($_POST['preco']);
    $quantidade = trim($_POST['quantidade']);

    // Verifica se todos os campos obrigatórios estão preenchidos
    if (!empty($nome) && !empty($descricao) && !empty($preco) && !empty($quantidade)) {
        // Cria uma instância da conexão com o banco de dados
        $database = new Database();
        $db = $database->getConnection();

        // Instancia a classe Produto, que gerencia as operações relacionadas ao produto
        $produto = new Produto($db);

        // Parte 2.1: Operação de Edição
        // Se o formulário indicar a ação de "editar" e o campo 'id' estiver presente,
        // chama o método para atualizar o produto existente.
        if (isset($_POST['acao']) && $_POST['acao'] == 'editar' && isset($_POST['id'])) {
            $id = trim($_POST['id']);
            if ($produto->atualizar($id, $nome, $descricao, $preco, $quantidade)) {
                $_SESSION['msg'] = "Produto atualizado com sucesso!";
                header("Location: ../Views/produto_listagem.php");
                exit();
            } else {
                $_SESSION['msg'] = "Erro ao atualizar o produto!";
                header("Location: ../Views/produto_editar.php?id=" . urlencode($id));
                exit();
            }
        } 
        // Parte 2.2: Operação de Cadastro
        // Caso contrário, se não for uma edição, trata como um novo cadastro.
        else {
            if ($produto->cadastrar($nome, $descricao, $preco, $quantidade)) {
                $_SESSION['msg'] = "Produto cadastrado com sucesso!";
                header("Location: ../Views/produto_listagem.php");
                exit();
            } else {
                $_SESSION['msg'] = "Erro ao cadastrar produto!";
                header("Location: ../Views/produto_cadastro.php");
                exit();
            }
        }
    } else {
        // Caso algum dos campos obrigatórios esteja vazio, define mensagem de erro e redireciona
        $_SESSION['msg'] = "Preencha todos os campos!";
        header("Location: ../Views/produto_cadastro.php");
        exit();
    }
} else {
    // Se a requisição não for do tipo GET nem POST, exibe uma mensagem de método inválido.
    echo "Método inválido.";
}
?>

 


3. Conclusão

Com a implementação dos métodos de cadastro, atualização e exclusão na classe Produto e o respectivo tratamento no controlador, o módulo de produtos agora possui um ciclo completo CRUD. As Views de cadastro, listagem e edição, juntamente com os controladores para cada operação, garantem que o sistema permita que usuários autenticados gerenciem produtos de maneira segura e eficiente.

Esta aula consolida o desenvolvimento do módulo de produtos, aplicando as boas práticas de programação em PHP OOP e a arquitetura MVC. Com isso, o projeto está quase preparado para uso em ambiente de produção, podendo ser expandido ou integrado com outras funcionalidades conforme necessário.

Na próxima aula, vamos proteger as páginas restritas e adicionar o recurso de Logout.

Tags:
#integração CRUD  # atualização de produtos  # exclusão de produtos  # PHP OOP  # MVC  # Bootstrap  # SEO  # dashboard  # desenvolvimento web 

Aula 13: Integração Final, Validação e Boas Práticas no Módulo de Produtos
  Contato
  • support@nerdtoolkit.com.br
Mapa do Site
Mostrar mapa do site
  Sobre

Feito de programadores para programadores.

Este site utiliza cookies. Ao continuar a utilizar este site, você concorda com a nossa utilização de cookies e política de privacidade.
Leia mais Concordo