JAMES WEB
Aprenda como se faz.
Produtos CRUD (Cadastrar)
No capítulo anterior, demos os primeiros passos para equipar nosso painel administrativo com as ferramentas necessárias para gerenciar os produtos da nossa loja virtual. Começamos com algo simples: listar alguns produtos já existentes no banco de dados. Isso nos permitiu testar se a listagem estava funcionando direitinho.
Agora, vamos avançar um pouco mais. Nosso próximo objetivo é criar os mecanismos que vão permitir cadastrar novos produtos na loja. Ou seja, vamos começar a construir a parte do sistema que permite adicionar novos itens ao catálogo.

Cadastrando um novo produto
Na página principal administrativa de nosso sistema, temos agora disponível no menu o tem “Produtos”. Quando clicamos neste item somos apresentados a uma listagem dos produtos cadastrados que contem sua nomenclatura e propriedades.
Nesta página temos o botão “Cadastrar Produto” que ao ser clicado seremos enviados para o caminho “/ecommerce/admin/products/create” para acessar o formulário de cadastro de produto. Para possibilitar isto, abra o arquivo admin-products.php e insira uma nova rota conforme exemplo a seguir:
PHP: admin-products.php (rota /admin/products/create)
1 2 3 4 5 6 7 8 9 10 11 | <?php // inicio do código... //Rota Criar Produtos - Template products-create.html $app ->get( '/admin/products/create' , function () { User::verifyLogin(); $page = new PageAdmin(); $page ->setTpl( "products-create" ); }); ?> |
Veja como arquivo funciona linha por linha:
Estamos definindo uma rota para a página de criação de um novo produto. Aqui, estamos dizendo ao nosso ‘gerenciador de endereços’ que, quando alguém acessar o endereço ‘/admin/products/create’ usando o método ‘get’ (ou seja, quando alguém abre essa página no navegador), ele deve executar uma sequência de ações.
Primeiro, verificamos se o usuário está logado. Só quem estiver logado pode acessar a página de criação de produtos.
Criamos uma nova ‘página de administrador’ ($page) para preparar a exibição da página de criação de produtos.Aqui se instancia a classe que prepara o template html para ser exibido.
Este código informa qual arquivo html será usado para montar a página. Dizemos à ‘página de administrador’ ($page) para usar o modelo ‘products-create’ (‘products-create.html’). Este modelo é o que define como a página de criação de produtos será exibida.
Salvando dados de um novo produto
Após inserir os dados do produto será necessário salvar. Ao clicar em salvar seremos direcionados para a rota “/admin/products/create/” só que via POST. Insira o seguinte trecho no arquivo admin-products.php.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php // inicio código ... //Rota Salvar Produto - Template products-create.html $app ->post( '/admin/products/post-create' , function () { User::verifyLogin(); $product = new Product(); $product ->setData( $_POST ); $product ->save(); header( "Location: /ecommerce/admin/products" ); exit ; }); ?> |
Veja linha por linha este código:
- L5 – $app->post(‘/admin/products/post-create’, function() {
Aqui, a gente define uma rota. Pensa numa rota como um caminho, uma URL que o usuário acessa. ‘post’ significa que os dados estão sendo enviados para o servidor, como quando você preenche um formulário. ‘/admin/products/post-create’ é o endereço dessa rota. E o ‘function()’ é o que acontece quando alguém chega lá. - L6 – User::verifyLogin();
Antes de qualquer coisa, a gente verifica se o usuário está logado. - L7 – $product = new Product();
Agora, a gente cria um novo produto. ‘Product()’ é o nosso modelo, a estrutura do produto. - L8 – $product->setData($_POST);
Aqui, a gente pega os dados que o usuário enviou no formulário e coloca dentro do nosso produto. ‘$_POST’ é onde os dados do formulário ficam guardados. ‘setData()’ é a função que organiza esses dados dentro do produto. - L9 – $product->save();
Hora de salvar o produto no banco de dados! É como registrar as informações no nosso sistema. ‘save()’ é a função que faz essa mágica acontecer. - L10 – header(“Location: /ecommerce/admin/products”);
Depois de salvar, a gente redireciona o usuário para a página de listagem de produtos. É como dizer: ‘Pronto, produto criado! Agora, dá uma olhada na lista completa’. - L11 – exit;
E para finalizar, a gente encerra o processo. É como dar um ponto final na nossa ação, garantindo que nada mais seja executado.
Rota /admin/products/post-create
Observamos na linha 9 na ‘/admin/products/post-create’ temos a chamada da função save() que está a disposição na Classe Product. Observe a descrição a seguir:
PHP: Product.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php // inicio código ... public function save() { $sql = new Sql(); $results = $sql ->select( "CALL sp_products_save(:idproduct, :desproduct, :vlprice, :vlwidth, :vlheight, :vllength, :vlweight, :desurl)" , array ( ":idproduct" => $this ->getidproduct(), ":desproduct" => $this ->getdesproduct(), ":vlprice" => $this ->getvlprice(), ":vlwidth" => $this ->getvlwidth(), ":vlheight" => $this ->getvlheight(), ":vllength" => $this ->getvllength(), ":vlweight" => $this ->getvlweight(), ":desurl" => $this ->getdesurl() )); $this ->setData( $results [0]); } //final código ... ?> |
Na página do painel administrativa temos o formulário para cadastrar um produto na loja online. Quando você clica em “Salvar”, a função save() entra em ação:
- Ela “chama” o banco de dados.
- Ela pega os dados do produto (nome, preço, etc.) do formulário.
- Ela envia esses dados para o banco de dados usando uma stored procedure (sp_products_save) pré-definida.
- Se o banco de dados retornar alguma informação (como o ID do produto), ela atualiza os dados do produto no banco de dados.
Veja linha a linha como a função save() funciona:
- L4 – public function save():
- public: Isso significa que a função save() pode ser acessada de qualquer lugar do seu código.
- function save(): Define uma função chamada save. Essa função faz parte da classe que representa um “Produto”.
- L7 – $sql = new Sql();: Aqui, uma nova instância de uma classe chamada Sql é criada e armazenada na variável $sql. Essa classe Sql é responsável por lidar com a comunicação com o banco de dados.
- L9 – $results = $sql->select(“CALL sp_products_save(:idproduct, :desproduct, :vlprice, :vlwidth, :vlheight, :vllength, :vlweight, :desurl)”, array(…));:
- $sql->select(): Essa linha chama um método select() da instância $sql. Embora o nome seja select, neste caso ele está executando um “CALL” para uma stored procedure, que tambem pode ser usada para insert, update ou delete.
- “CALL sp_products_save(…)”: Essa é uma chamada para uma “stored procedure” (procedimento armazenado) no banco de dados. Imagine uma stored procedure como uma função pré-programada no banco de dados que executa uma série de comandos. Nesse caso, a stored procedure se chama sp_products_save e insere ou atualiza um produto.
- :idproduct, :desproduct, …: Esses são os parâmetros que a stored procedure espera receber. Eles são como “espaços reservados” que serão preenchidos com os valores reais dos dados do produto.
- array(…): Esse é um array associativo que fornece os valores reais para os parâmetros da stored procedure.
- L10 – “:idproduct” => $this->getidproduct():
Aqui, o valor retornado pelo método getidproduct() do objeto atual ($this) é associado ao parâmetro :idproduct. Os métodos getdesproduct(), getvlprice(), etc., fazem a mesma coisa para os outros parâmetros. Esses métodos provavelmente obtêm os valores das propriedades do objeto Produto. Em resumo, os valores que serão inseridos no banco de dados são pegos através dos métodos get do objeto, e passados para a stored procedure. - L20 – $this->setData($results[0]);:
- $results: Essa variável armazena o resultado da chamada à stored procedure.
- $results[0]: Acessa o primeiro elemento do array $results. Se a stored procedure retornar algum dado (como o ID do produto recém-inserido ou atualizado), ele estará aqui.
- $this->setData(): Esse método atualiza as propriedades do objeto atual ($this) com os dados retornados pela stored procedure. É como se o objeto “recebesse” os dados do banco de dados para se manter atualizado.
Procedure sp_products_save
Para trabalhar com os itens de produtos, iremos utilizar uma procedure que irá salvar os produtos na tabela tb_products; Para instalar a procedure sp_products_save no banco de dados db_ecommerce em um ambiente MySQL Apache no XAMPP, siga estas etapas:
1. Acesso ao phpMyAdmin (ou outro cliente MySQL):
Certifique-se de que os serviços Apache e MySQL estejam em execução. Abra o phpMyAdmin em seu navegador (geralmente acessível em http://localhost/phpmyadmin).
2. Seleção do banco de dados:
3. Criação da procedure:
Cole o seguinte código SQL na área de texto:
SQL: sp_products_save
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | USE `db_ecommerce`; DROP procedure IF EXISTS `sp_products_save`; DELIMITER $$ USE `db_ecommerce`$$ CREATE PROCEDURE `sp_products_save`( pidproduct int (11), pdesproduct varchar (64), pvlprice decimal (10,2), pvlwidth decimal (10,2), pvlheight decimal (10,2), pvllength decimal (10,2), pvlweight decimal (10,2), pdesurl varchar (128) ) BEGIN IF pidproduct > 0 THEN UPDATE tb_products SET desproduct = pdesproduct, vlprice = pvlprice, vlwidth = pvlwidth, vlheight = pvlheight, vllength = pvllength, vlweight = pvlweight, desurl = pdesurl WHERE idproduct = pidproduct; ELSE INSERT INTO tb_products (desproduct, vlprice, vlwidth, vlheight, vllength, vlweight, desurl) VALUES (pdesproduct, pvlprice, pvlwidth, pvlheight, pvllength, pvlweight, pdesurl); SET pidproduct = LAST_INSERT_ID(); END IF; SELECT * FROM tb_products WHERE idproduct = pidproduct; END $$ DELIMITER ; |
4. Verificação da procedure:
Explicação do código:
- L1 – USE db_ecommerce;:
Seleciona o banco de dados db_ecommerce. - L2 – DROP procedure IF EXISTS sp_products_save;:
Remove a procedure (se houver) para evitar erros de duplicidade. - L4 – DELIMITER $$:
Altera o delimitador padrão (;) para $$ para permitir a criação da procedure com múltiplos comandos. - L6 – CREATE PROCEDURE sp_products_save(…):
Define a procedure com os parâmetros especificados. - L18 – IF pidproduct > 0 THEN … ELSE … END IF;:
Verifica se o pidproduct é maior que 0 (atualização) ou 0 (inserção). - L20 – UPDATE tb_products … WHERE idproduct = pidproduct;:
Atualiza os dados do produto com o idproduct especificado. - L33 – INSERT INTO tb_products … VALUES(…);:
Insere um novo produto na tabela tb_products. - L36 – SET pidproduct = LAST_INSERT_ID();:
Obtém o id do último registro inserido. - L40 – SELECT * FROM tb_products WHERE idproduct = pidproduct;:
Retorna os dados do produto inserido ou atualizado. - L44 – DELIMITER ;:
Restaura o delimitador padrão (;).
Ao seguir esses passos, a procedure sp_products_save será instalada corretamente no seu banco de dados MySQL no XAMPP.
Para Saber Mais…
- Função ‘verifyLogin’
- Função ‘setData)’
- Array