JAMES WEB

Aprenda como se faz.


Sumário

CRUD Usuários (Cadastrar usuários)

Continuando nossas ações do CRUD Usuários (Create, Read, Update, Delete), vamos habilitar o cadastro de um novo uusário. Para isto, temos editar o template template administrativo “users.html” (dentro da pasta views/admin). Localize o link Cadastrar Usuário e altere como no exemplo a seguir:

<a href=”/ecommerce/admin/users/create” class=”btn btn-success”>Cadastrar Usuário</a>

Após editar este link o botão “Cadastrar Usuário” já estará disponível na página administrativa. Este já está pronto para entar com os dados de nome, login, telefone, e-mail, senha e se terá acesso a área administrativa ou não (inadmin = 1), Ao clicar nele será exibido o formulário “cadastar usuário”:

No entanto o botão “Cadastrar” não produzirá nenhum efeito prático. Temos de implementar as funções para que isto ocorra.

users

Criando Rota Formulário Cadastrar Usuário (Create)

Acesse com seu editor de texto o código admin-users.php e insira a “Rota Formulário Cadastar Usuário (create)” conforme o exemplo a seguir:

PHP: admin-users.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Rota Salvar Cadastro Usuário - create_post - Botão Cadastrar Usuário 
$app->post('/admin/users/create_post'function() { 
    User::verifyLogin(); 
    $user new User();
    $_POST["inadmin"] = (isset($_POST["inadmin"]))?1:0;
 
    // Criptografar a senha
    if (isset($_POST['despassword'])) {
        $_POST['despassword'] = 
        password_hash($_POST['despassword'], PASSWORD_DEFAULT);
    }
     
    $user->setData($_POST);
    $user->save();
    header("Location: /ecommerce/admin/users");
    exit;  
});

Veja como a Rota Formulário Cadastrar Usuário funciona linha a linha:

  • L2 – $app->post(‘/admin/users/create_post’, function() {
    • $app->post:
      Define uma rota que responde a requisições HTTP POST.
    • ‘/admin/users/create_post’:
      É a rota que aciona a função.
    • function():
      Aqui, estamos definindo uma função anônima. Essa função será executada quando a rota for acessada.
  • L3 – User::verifyLogin();
    Verifica se o usuário está logado antes de permitir a criação de um novo usuário.
  • L4 – $user = new User();
    Cria um novo objeto da classe User, que representa um usuário no sistema.
  • L5 – $_POST[“inadmin”] = (isset($_POST[“inadmin”]))?1:0;
    Verifica se o campo inadmin foi enviado na requisição POST. Se sim, atribui o valor 1, caso contrário, atribui 0. Isso provavelmente é para garantir que o campo inadmin sempre tenha um valor válido.
  • L8 a 11 – if (isset($_POST[‘despassword’])) { … }
    Verifica se a senha foi enviada na requisição. Se sim, criptografa a senha usando a função password_hash. Isso é essencial para segurança, pois evita que a senha seja armazenada em texto simples.
  • L13 – $user->setData($_POST);
    Atribui os dados recebidos na requisição POST ao objeto $user. Isso preenche os campos do usuário com os valores fornecidos pelo usuário.
  • L14 – $user->save();
    Salva o usuário no banco de dados. Esse método faz a inserção ou atualização dos dados do usuário na tabela correspondente.
  • L15 – header(“Location: /ecommerce/admin/users”);
    Redireciona o usuário para a página /ecommerce/admin/users (Lista de Usuários) após a criação do usuário.
  • L16 – exit:
    A função exit é usada para interromper a execução do script após o redirecionamento.

Salvando dados no banco de dados (Método save())

A linha 14 $user->save(); chama o método save() que salva os dados carregados no objeto $user capturados no formulário $_POST. Vamos criar este método dentro do arquivo user.php. Insira o código conforme o exemplo a seguir:

PHP: user.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// … ìnicio código PHP
 
public function save()
    {
        $sql new Sql();
        $results $sql->select("CALL sp_users_save(:desperson, 
         :deslogin, :despassword, :desemail, :nrphone, :inadmin)", 
            array(
                ":desperson"=>$this->getdesperson(),
                ":deslogin"=>$this->getdeslogin(),
                ":despassword"=>$this->getdespassword(),
                ":desemail"=>$this->getdesemail(),
                ":nrphone"=>$this->getnrphone(),
                ":inadmin"=>$this->getinadmin()              
            ));
        $this->setData($results[0]);
    }
 
// … resto código PHP
?>

A função save() tem como objetivo persistir os dados de um usuário no banco de dados, utilizando o procedimento armazenado (stored procedure) chamado sp_users_save.

  • L4 – Public function save()
    Declaração da Função: Define uma função pública chamada save() dentro da classe User. Essa função será responsável por salvar os dados do usuário.
  • L6 – $sql = new Sql();
    Instanciando a Classe Sql: Cria um novo objeto da classe Sql. Essa classe, que não foi apresentada no código, encapsula a interação com o banco de dados, oferecendo métodos para executar consultas SQL.
  • L7 a 18 – $results = $sql->select(“CALL sp_users_save(:desperson, :deslogin, :despassword, :desemail, :nrphone, :inadmin)”, array( ……
    Executando a Consulta SQL: Chamada ao Procedimento: Executa uma consulta SQL utilizando o método select do objeto $sql. A consulta chama um procedimento armazenado no banco de dados sp_users_save.
    • Parâmetros:
      Passa os valores dos atributos do objeto atual como parâmetros para o procedimento armazenado. Os parâmetros são passados como um array associativo, onde as chaves são os nomes dos parâmetros e os valores são obtidos através dos métodos getdesperson(), getdeslogin(), etc. Esses métodos retornam os valores dos respectivos atributos do objeto.
  • L17 – $this->setData($results[0]);
    Atualizando o Objeto: A variável $results contém um array com os resultados retornados pelo procedimento armazenado. O primeiro elemento desse array ($results[0]) é passado para o método setData(). O método setData() atualiza os atributos do objeto com os dados retornados do banco de dados, como um ID gerado automaticamente.

Procedures sp_users_save

No contexto do código, o procedimento sp_users_save é responsável por: Inserir novos usuários: Quando um novo usuário é cadastrado, este procedimento é chamado para adicionar as informações do usuário na tabela do banco de dados (tb_users).

A seguir temos o código sql para criar procedure save() dentro do banco de dados db_ecommerce

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DELIMITER $$
CREATE PROCEDURE `sp_users_save`()
BEGIN
    
    DECLARE vidperson INT;
      
  INSERT INTO tb_persons (desperson, desemail, nrphone)
    VALUES(pdesperson, pdesemail, pnrphone);
      
    SET vidperson = LAST_INSERT_ID();
      
    INSERT INTO tb_users (idperson, deslogin, despassword, inadmin)
    VALUES(vidperson, pdeslogin, pdespassword, pinadmin);
      
    SELECT * FROM tb_users a INNER JOIN tb_persons b USING(idperson) 
    WHERE a.iduser = LAST_INSERT_ID();
      
END$$
DELIMITER ;

Analisando o Código Linha a Linha:

  • L3 – BEGIN
    Início do Procedimento: Indica o início da definição do procedimento armazenado. Tudo o que estiver dentro do BEGIN e END faz parte do procedimento.
  • L5 – DECLARE vidperson INT;
    Declara a variável inteira chamada vidperson. Essa variável será utilizada para armazenar o ID da pessoa recém-inserida na tabela tb_persons.
  • L7 – INSERT INTO tb_persons (desperson, desemail, nrphone) VALUES(pdesperson, pdesemail, pnrphone);
    Insere um novo registro na tabela tb_persons. Os valores para os campos desperson, desemail e nrphone são obtidos dos parâmetros de entrada do procedimento.
  • L10 – SET vidperson = LAST_INSERT_ID();
    Recuperando o ID Inserido: Atribui à variável vidperson o valor do último ID inserido na tabela. Essa função é útil para obter o ID da pessoa recém-inserida, que será usado para relacionar o usuário à pessoa.
  • L12 – INSERT INTO tb_users (idperson, deslogin, despassword, inadmin) VALUES(vidperson, pdeslogin, pdespassword, pinadmin);
    Insere um novo registro na tabela tb_users. O campo idperson recebe o valor da variável vidperson, estabelecendo a relação entre a pessoa e o usuário. Os outros campos (deslogin, despassword, inadmin) recebem seus respectivos valores dos parâmetros de entrada.
  • L15 – SELECT * FROM tb_users a INNER JOIN tb_persons b USING(idperson) WHERE a.iduser = LAST_INSERT_ID();
    Realiza a união entre as tabelas tb_users e tb_persons utilizando o campo idperson como chave. Isso permite obter as informações das duas tabelas do usuário e da pessoa correspondente em uma única consulta. Filtro: Filtra os resultados para retornar apenas o registro que foi recém-inserido, utilizando a função LAST_INSERT_ID() para obter o ID do último usuário. Retorna todos os campos (*) das tabelas tb_users e tb_persons que correspondem ao usuário recém-inserido.
  • L18 – END
    Indica o fim da definição do procedimento armazenado.

Executadas tods estas atualizações ao clicar no botão “Cadastrar Usuário” você será direcionado para a página “Novo Usuário”. Entre com os dados nos campos solicitados. Depois clique em “Cadastar” e o novo uusário aparececerá na página Lista de Usuários.

cadastrar-usuarios

Para saber mais: