JAMES WEB

Aprenda como se faz.


Sumário

CRUD Usuários (Editar usuário)

Ao acessar os usuários na página administrativa temos a disposição o botão editar. Para habilitar sua função temos que configurar a linha no template “users.html” referente ao botão conforme exemplo a seguir:

<a href=”/ecommerce/admin/users_get/{$value.iduser}” class=”btn btn-primary btn-xs”> &lti class=”fa fa-edit”> Editar &lt/a>

update-user

Veja o que este código faz com o botão “Editar”:

Carregando usuário para edição (Update)

O código apresentado a seguir está relacionado à atualização de informações de usuários do sistema. Insira o código no arquivo admin-users.php. A rota indica que esta parte do código é acessível apenas por administradores e é utilizada para editar informações de um usuário específico.

PHP: admin-users.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// ... Inicio do código
 
// Rota Formulário Editar usuário (users-get) Template users-update.html
$app->get('/admin/users_get/:iduser'function($iduser) { 
  User::verifyLogin();   
  $user new User();      
  $user->get((int)$iduser);   
  $page new PageAdmin();        
  $page->setTpl("users-update"array(
    "user"=>$user->getValues()
  ));
});
 
// ... Resto do código
?>

Explicação detalhada

  • L5 – $app->get(‘/admin/users_get/:iduser’,:
    Essa linha define uma nova rota GET dentro da aplicação. A rota é acessível pelo URL “/admin/users_get/:iduser,” onde “:iduser” é um parâmetro que será capturado e passado para a função anônima.
  • function($iduser) {:
    Aqui, inicia-se uma função anônima que será executada quando a rota for acessada. A função recebe o parâmetro $iduser, que representa o ID do usuário a ser buscado.
  • L6 – User::verifyLogin();:
    Essa linha chama o método estático “verifyLogin” da classe User para verificar se o usuário está logado. Se o usuário não estiver autenticado,será redirecionado ou exibida alguma mensagem de erro.
  • L7 – $user = new User();:
    Cria-se um novo objeto da classe User, que representa um usuário no sistema.
  • L8 – $user->get((int)$iduser);:
    Chama-se o método get do objeto $user, passando o ID do usuário como parâmetro. Esse método busca no banco de dados as informações do usuário com o ID correspondente e as atribui às propriedades do objeto $user. A conversão para inteiro (int)$iduser garante que o parâmetro seja tratado como um número.
  • L9 – $page = new PageAdmin();:
    Cria-se um novo objeto da classe PageAdmin, que representa a página de administração.
  • L10 – $page->setTpl(“users-update”, array(…));:
    Chama-se o método setTpl do objeto $page, passando dois parâmetros:
    • “users-update”: Nome do template (view) que será utilizado para renderizar a página.
    • array(“user” => $user->getValues()): Um array associativo que contém os dados a serem passados para o template. O método getValues do objeto $user retorna um array com todas as propriedades do usuário, que serão utilizadas para preencher os campos da página.

Atualizando os dados editados

A efetuar as edições nas informações, precisamos salvar estas modificações no banco de dados. Para isto temos de modificar a linha que envia os dados via Post para edição. Veja a linha abaixo refente a linha no template “users-update”.

<!– form start –>
<form role=”form” action=”/ecommerce/admin/users_post/{$user.iduser}” method=”post”>

Essa linha de código encabeça um formulário HTML que, quando submetido, enviará os dados para a URL /ecommerce/admin/users_post/{$user.iduser} usando o método HTTP POST. O ID do usuário “{$user.iduser}” será incluído na URL dinamicamente.

Ao clicar no botão “Salvar” as ações relacionadas acima serão executadas e a rota que atualiza os dados será chamada. Insira o código a seguir no arquivo admin-users.php.

PHP: admin-users.php > Incluindo Rota Editar Usuário

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// ... Inicio do código
 
// Rota Salvar Edição Usuário - users_post
// Botão Salvar Template users-update.html 
 
$app->post('/admin/users_post/:iduser'function($iduser) { 
  User::verifyLogin();   
  $user new User();
  $user->get((int)$iduser);
  $user->setData($_POST);
  $user->update();
  header("Location: /ecommerce/admin/users");
  exit
});
 
// ... Resto do código
?>

Explicando linha por linha a rota “Editar Usuário”:

  • L7 – $app->post(‘/admin/users_post/:iduser’,:
    Essa linha define uma nova rota POST dentro da aplicação. A rota é acessível pelo URL /admin/users_post/:iduser, onde :iduser é um parâmetro que será capturado e passado para a função anônima “function($iduser) { …“.
  • L8 – User::verifyLogin();:
    Essa linha chama um método estático da classe User para verificar se o usuário está logado. Se o usuário não estiver autenticado, será redirecionado ou exibida alguma mensagem de erro.
  • L9 – $user = new User();
    cria um novo objeto User da classe User
  • L10 – $user->get((int)$iduser);
    Busca as informações do usuário com o ID correspondente no banco de dados
  • L11 – $user->setData($_POST);:
    Essa linha chama o método setData do objeto $user, passando o array $_POST como parâmetro. O array $_POST contém os dados enviados pelo formulário, incluindo os novos valores que o usuário deseja atualizar. O método setData atualiza as propriedades do objeto $user com esses novos valores.
  • L12 – $user->update();:
    Essa linha chama o método update do objeto $user, que salva as alterações feitas no objeto no banco de dados.
  • L13 – header(“Location: /ecommerce/admin/users”);:
    Essa linha define um cabeçalho de redirecionamento, indicando que o navegador deve ser redirecionado para a URL /ecommerce/admin/users, “Lista de Usuários”
  • L14 – exit;:
    Essa linha interrompe a execução do script, evitando que qualquer código subsequente seja executado.

Método update() do objeto $user

O código a seguir define a função pública update() dentro de uma classe (User). Essa função, chamada na linha 12 “$user->update();”, é responsável por atualizar as informações de um usuário no banco de dados, utilizando um procedimento armazenado. Insira dentro do arquivo user.php.

PHP: user.php > Incluindo função Update:

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

Explicando linha por linha a função Update:

  • L4 – public function update()
    • public:
      A função é pública, ou seja, pode ser acessada de qualquer lugar do código.
    • update:
      Este é o nome da função, indicando que ela é responsável por atualizar os dados de um usuário.
  • L6 – $sql = new Sql();
    Instanciando a Classe Sql: Cria uma nova instância da classe Sql. Essa classe encapsula a interação com o banco de dados, oferecendo métodos para executar consultas SQL.
  • L7 – $results = $sql->select(“CALL sp_usersupdate_save(:iduser, :desperson, :deslogin, :despassword, :desemail, :nrphone, :inadmin)”, array( …..
    Executa a procedure CALL sp_usersupdate_save(…): que neste caso é responsável por atualizar um registro na tabela de usuários.
  • L10 a 16 – Parâmetros: Os valores dos parâmetros do procedimento são obtidos através dos métodos getiduser(), getdesperson(), etc. Esses métodos retornam os valores das propriedades correspondentes do objeto $this (ou seja, do objeto User que está sendo atualizado). O resultado da execução do procedimento é armazenado na variável $results.
  • L18 – $this->setData($results[0]);
    Chama o método setData do próprio objeto para atualizar suas propriedades com os dados retornados do banco de dados.
  • L19 – }
    Fim da Função: Indica o fim da definição da função.

Procedure user_usersupdate_save

No contexto do código que analisamos, o procedimento sp_usersupdate_save recebe os parâmetros e atualiza a tabela propriamente dita. Faça o download do código correspondente e carregue a procedure no banco de dados db_ecommerce. Veja o código sql a seguir:

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
BEGIN
   
    DECLARE vidperson INT;
     
  SELECT idperson INTO vidperson
    FROM tb_users
    WHERE iduser = piduser;
     
    UPDATE tb_persons
    SET 
    desperson = pdesperson,
        desemail = pdesemail,
        nrphone = pnrphone
  WHERE idperson = vidperson;
     
    UPDATE tb_users
    SET
    deslogin = pdeslogin,
        despassword = pdespassword,
        inadmin = pinadmin
  WHERE iduser = piduser;
     
    SELECT * FROM tb_users a INNER JOIN tb_persons b 
    USING(idperson) WHERE a.iduser = piduser;
     
END

Veja como a procedure funciona:

  • L1 – BEGIN
    Início do Procedimento: Indica o início do procedimento armazenado.
  • L3 – DECLARE vidperson INT;
    Declara uma variável inteira chamada vidperson. Essa variável será usada para armazenar o valor do idperson do usuário que está sendo atualizado.
  • L5 – SELECT idperson INTO vidperson FROM tb_users WHERE iduser = piduser;
    Seleciona o valor do idperson da tabela tb_users onde o iduser é igual a piduser. O valor selecionado é atribuído à variável vidperson. Isso é feito para obter o idperson do usuário antes de atualizar os dados nas tabelas relacionadas.
  • L9 – UPDATE tb_persons SET desperson = pdesperson, desemail = pdesemail, nrphone = pnrphone WHERE idperson = vidperson;
    Atualiza os campos desperson, desemail e nrphone da tabela tb_persons onde o idperson é igual a vidperson. Os novos valores são fornecidos pelos parâmetros pdesperson, pdesemail e pnrphone.
  • L16 – UPDATE tb_users SET deslogin = pdeslogin, despassword = pdespassword, inadmin = pinadmin WHERE iduser = piduser;
    Atualiza os campos deslogin, despassword e inadmin da tabela tb_users onde o iduser é igual a piduser. Os novos valores são fornecidos pelos parâmetros pdeslogin, pdespassword e pinadmin.
  • L23 – SELECT * FROM tb_users a INNER JOIN tb_persons b USING(idperson) WHERE a.iduser = piduser;
    Realiza uma consulta para selecionar todos os campos das tabelas tb_users e tb_persons onde o iduser é igual a piduser. Isso é feito para retornar os dados atualizados do usuário após as alterações.
  • L26 – END
    Indica o fim do procedimento armazenado.

Para saber mais: