JAMES WEB
Aprenda como se faz.
CRUD Categorias (Cadastrar)
Uma vez criados as classes, funções e formulários para listar as categorias, chegou a hora de preparar os recursos para podermos cadastrar novas categorias no nosso projeto.
Acreditamos que neste momento você já tenha baixado os templates de categorias, especialmente o arquivo categories-update.html na pasta view > admin, disponibilizado no módulo anterior. Assim poderemos criar a “Rota do Formulário Nova Categoria”. Para isso, acesse o arquivo admin-categories.php e insira o trecho php a seguir:

PHP: admin-categories.php > adicionando Rota Formulário Nova Categoria
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php // ... (inicio do código) // Rota Formulário Nova Categoria // Botão Nova Categoria - Template categories.html $app ->get( '/admin/categories/create' , function () { User::verifyLogin(); $page = new PageAdmin(); $page ->setTpl( "categories-create" ); }); // ... (Final do código.) ?> |
Analizando linha por linha o código:
- LL6 – $app->get(‘/admin/categories/create’, function() {:
- $app->get(): Essa linha indica que estamos definindo uma rota HTTP GET para a URL /admin/categories/create. Ou seja, quando um usuário acessar essa URL no navegador, o código dentro da função anônima será executado.
- /admin/categories/create: É o caminho da URL que aciona essa rota. Essa URL é acessada para criar uma nova categoria em um sistema.
- function() {: Inicia uma função anônima, ou seja, uma função que não possui um nome específico. Essa função será executada quando a rota for acessada.
- User::verifyLogin(): Essa linha chama o método (verifyLogin) estático da classe User para verificar se o usuário está logado. Se o usuário não estiver autenticado, será redirecionado para uma página de login ou exibida uma mensagem de erro.
- $page = new PageAdmin();: Cria uma nova instância de uma classe chamada pageAdmin. Essa classe é responsável por renderizar as páginas da área administrativa. A instância criada será armazenada na variável $page.
- $page->setTpl(“categories-create”);: Chama o método setTpl() da classe PageAdmin, passando o parâmetro “categories-create”. Esse método define o template (ou modelo) que será utilizado para renderizar a página. O template “categories-create” contem o HTML e o layout necessários para a página de criação de categorias.
Para executar e renderizar o template categories-create edite o arquivo categories.html. Acesse a linha do link “Cadastrar Categoria” no arquivo e altere conforme o modelo a seguir:
HTML: categories.html > Editando botão “Cadastrar Categoria”
1 2 3 4 5 6 7 8 | <!-- ... (inicio código HTML) --> < div class = "box-header" > < a href = "/ecommerce/admin/categories/create" class = "btn btn-success" >Cadastrar Categoria</ a > </ div > <!-- ... (restante código HTML) --> |
Ao clicar no link recem criado você terá acesso ao template “Nova Categoria”.
Depois que criamos o suporte para criação do formulário para cadastrar uma nova categoria, onde digitamos os respectivos dados, temos que salvar estes dados no banco de dados. Mas anes verifique no banco de dados se a tabela tb_categories já existe. Caso negativo, baixe o arquivo e instale a nova tabela no banco de dados “db-ecommmerce.
Agora podemos salvar os registros de novas categorias. Para isso, insira uma nova rota no arquivo admin-categories.php conforme a seguir:
PHP: admin-categories > inserindo “Rota Salvar Nova Categoria”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php // ... (incio código php) // Rota Salvar Nova Categoria // Botão Salvar - Template categories.html $app ->post( '/admin/categories/create_post' , function () { User::verifyLogin(); $category = new Category(); $category ->setData( $_POST ); $category ->save(); header( "Location: /ecommerce/admin/categories" ); exit ; }); // ... (resto código php) ?> |
Explicando linha por linha o código
- L 6 – $app->post(‘/admin/categories/create_post’, function() {:
- $app->post(): Define uma rota HTTP POST para a URL /admin/categories/create_post. Isso significa que quando um formulário é enviado para essa URL usando o método POST, o código dentro da função anônima será executado.
- /admin/categories/create_post: É o caminho da URL que aciona essa rota. Normalmente, essa URL seria acessada por um administrador após preencher um formulário para criar um novo post.
- L 7 – User::verifyLogin();: A função verifyLogin, verifica se o usuário está logado antes de permitir a criação do post. Se o usuário não estiver autenticado, será redirecionado para uma página de login ou exibida uma mensagem de erro.
- L8 – $category = new Category();: Cria uma nova instância da classe Category. Essa classe representa um objeto de categoria e contém métodos para manipular os dados da categoria.
- L9 – $category->setData($_POST);: Chama o método setData() da classe Category, passando como argumento o array $_POST. Isso atribui os dados enviados no formulário (via método POST) aos atributos do objeto $category.
- L10 – $category->save();: Chama o método save() da classe Category, que salva os dados da categoria no banco de dados.
- L11 – header(“Location: /ecommerce/admin/categories”);: Redireciona o usuário para a URL /ecommerce/admin/categories após a criação da categoria. Isso é feito para retornar o usuário à lista de categorias.
- L 12 – exit;: Encerra a execução do script, evitando que código adicional seja executado após o redirecionamento.
Formulário (Post) do templete categories-create.html
No trecho do código, linha 8, da “Rota Salvar Nova Categoria” $category->setData($_POST); recebem os dados enviado via (Post) pelo formulário incluso no arquivo categories-create.html. Este Formulário permite a um usuário inserir dados para criar uma nova categoria. Veja o trecho correspodente e como ele funciona e faça as correções em seu código principalmente na linha <form role=”form” action=”/ecommerce/admin/categories/create_post” method=”post”>
HTML: categories-create.html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!- - ... (inicio código HTML) --> <!-- form start --> < form role = "form" action = "/ecommerce/admin/categories/create_post" method = "post" > < div class = "box-body" > < div class = "form-group" > < label for = "descategory" >Nome da categoria</ label > < input type = "text" class = "form-control" id = "descategory" name = "descategory" placeholder = "Digite o nome da categoria" > </ div > </ div > <!-- /.box-body --> < div class = "box-footer" > < button type = "submit" class = "btn btn-success" >Cadastrar</ button > </ div > <!- - ... (resto código HTML) --> |
Como estre trecho do formulário funciona:
- L4 – <form role=”form” action=”/ecommerce/admin/categories/create_post” method=”post”>: Inicia um elemento <form>, que define um formulário para enviar dados ao servidor.
- role=”form”: Atribui um atributo role com o valor “form”, que pode ser útil para frameworks ou bibliotecas JavaScript que trabalham com elementos de formulário.
- action=”/ecommerce/admin/categories/create_post”: Define a URL para onde os dados do formulário serão enviados quando o botão “Cadastrar” for clicado. method=”post”: Indica que os dados serão enviados usando o método HTTP POST, o que é adequado para enviar dados sensíveis ou grandes quantidades de dados.
- L6 – <div class=”box-body”>: Inicia um elemento <div> com a classe box-body. Essa classe é definida pelo framework CSS utilizado e estiliza o conteúdo do formulário.
- L7 – <div class=”form-group”>: Inicia um elemento <div> com a classe form-group. Essa classe é usada para agrupar elementos relacionados dentro do formulário, como o rótulo e o campo de entrada.
- L8 – <label for=”descategory”>Nome da categoria</label>: Cria um elemento <label> com o atributo for definido como “descategory”. Esse rótulo é associado ao campo de entrada com o ID “descategory” e exibe o texto “Nome da categoria”.
- L9 – <input type=”text” class=”form control” id=”descategory” name=”descategory” placeholder=”Digite o nome da categoria”>: Cria um campo de entrada de texto.
- type=”text”: Indica que o campo é para entrada de texto.
- class=”form-control”: Aplica uma classe de estilo para formatar o campo de entrada.
- id=”descategory”: Atribui um ID ao campo para que possa ser referenciado pelo rótulo e por JavaScript. name=”descategory”: Define o nome do campo, que será usado para enviar os dados do formulário.
- placeholder=”Digite o nome da categoria”: Exibe um texto de dica dentro do campo de entrada.
- L12 – </div>: Fecha o elemento <div> que agrupa o rótulo e o campo de entrada.
- L13 – <div class=”box-footer”>: Inicia um elemento <div> com a classe box-footer, usado para posicionar elementos na parte inferior do formulário.
- L16 – <button type=”submit” class=”btn btn-success”>Cadastrar</button>:
Cria um botão de envio do formulário.
- type=”submit”: Indica que o botão “Cadastrar” que é usado para enviar o formulário.
- class=”btn btn-success”: Aplica classes de estilo para formatar o botão como um botão verde de sucesso.
Criando o método save da Classe Category
A “Rota Salvar Nova Categoria” necessita da função save() para salvar os dados da nova categoria no banco de dados. Para isto acesse o arquivo category.php em vendor > hcodebr > php-classes > src > model. Acrescente esta função save conforme o exemplo abaixo:
PHP: category.php > Adicionado a função save
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php // ... (inicio do código php) public function save() { $sql = new Sql(); $results = $sql ->select("CALL sp_categories_save(:idcategory, :descategory)", array ( ":idcategory" => $this ->getidcategory(), ":descategory" => $this ->getdescategory() )); $this ->setData( $results [0]); } // ... (resto do código php) ?> |
Explicando linha a linha a função save():
- L6 – $sql = new Sql();: Cria uma nova instância de um objeto SQL, que será utilizado para executar consultas no banco de dados. Esse objeto encapsula a lógica de conexão e execução de queries.
- L7 – $sql->select(“CALL sp_categories_save(:idcategory, :descategory)”, …):
- CALL sp_categories_save: Essa parte invoca a procedure sp_categories_save.
- :idcategory e :descategory: São parâmetros que serão substituídos pelos valores reais durante a execução. O método select é utilizado aqui para executar o procedimento armazenado, mesmo que ele seja uma operação de inserção ou atualização. Isso ocorre porque o procedimento armazenado retorna um conjunto de resultados, mesmo que seja vazio.
- $results = …: O resultado da execução da procedure é armazenado na variável $results. Esse resultado contém informações sobre as linhas afetadas pela operação (inseridas, atualizadas, deletadas).
- $this->setData($results[0]);: O primeiro elemento do array de resultados ($results[0]) é passado para o método setData() da classe. Esse método atualiza as propriedades do objeto com os dados retornados do banco de dados, como um ID recém-gerado.
Procedure sp_categories_save
A parte central da função save() é a procedure sp_categories_save (Linha 7) que realiza todos os procedimentos para salvar uma nova categoria no banco de dados. Veja abaixo como ela funciona.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE PROCEDURE `sp_categories_save` ( pidcategory INT, pdescategory VARCHAR(64) ) BEGIN IF pidcategory > 0 THEN UPDATE tb_categories SET descategory = pdescategory WHERE idcategory = pidcategory; ELSE INSERT INTO tb_categories (descategory) VALUES(pdescategory); SET pidcategory = LAST_INSERT_ID(); END IF; SELECT * FROM tb_categories WHERE idcategory = pidcategory; END $$ |
Como funciona a procedure sp_categories_save:
- L1 – sp_categories_save: Esse é o nome do procedimento. Este procedimento é responsável por salvar informações relacionadas a categorias.
- L2 – pidcategory INT, Isso significa que o procedimento espera receber um número inteiro chamado pidcategory. Esse número representa o ID da categoria.
- L3 – pdescategory VARCHAR(64): Isso significa que o procedimento espera receber uma string (texto) chamada pdescategory com no máximo 64 caracteres. Esse texto representa a descrição da categoria.
- L5 – BEGIN Isso marca o início do bloco de código que o procedimento vai executar.
- L6 – IF pidcategory > 0 THEN Se o valor de pidcategory for maior que zero, então o código dentro do IF será executado.
- L6 a 9- UPDATE tb_categories SET descategory = pdescategory WHERE idcategory = pidcategory; Isso é como atualizar um registro. Estamos dizendo para o banco de dados: “Encontre o registro com o ID pidcategory e mude a descrição para pdescategory.
- L10 – ELSE Se o valor de pidcategory não for maior que zero, então o código dentro do ELSE será executado.
- L11 – INSERT INTO tb_categories (descategory) VALUES(pdescategory); Isso adicionar um registro. Estamos dizendo para o banco de dados: “Crie um novo registro na tabela categorias com a descrição pdescategory.”
- L12 – SET pidcategory = LAST_INSERT_ID(); Isso é para obter o ID do novo registro que foi criado, onde “LAST_INSERT_ID()” é uma função que retorna o último ID inserido no banco de dados.
- L13 – END IF; Isso marca o fim do bloco IF-ELSE.
- L14 – SELECT * FROM tb_categories WHERE idcategory = pidcategory; Isso é para retornar a categoria que foi atualizada ou criada. Estamos dizendo para o banco de dados: “Mostre-me a categoria com o ID pidcategory.”
- L15 – END$$ Isso marca o fim do procedimento.
Para instalar a procedure sp_categories_save baixe o arquivo e use o MySql do Xampp. Veja como em “Procedures. O que é e como usar?“.
Depois de realizadas todas as atualizações, cadastre novas categorias para testar se tudo está correto. Havendo erros, revise seu código observando os detalhes. A falta de simbolos como ponto e vírgula no final de uma linha, provocam erros.