JAMES WEB

Aprenda como se faz.


Sumário

CRUD Categorias (Excluir)

Neste ponto do nosso projeto Ecommerce já seremos capazes de cadastrar e listar itens da categoria. Agora podemos criar os procedimentos para excluir uma categoria de nosso sistema.

Ao clicar no link “Categorias” no menu principal será apresentado o formulário “Lista de Categorias”, listando todas as categorias cadastradas. Em cada linha de dados temos dois botões: “Editar” e “Excluir”. Ao clicar em “Excluir” em uma destas linhas, o processo de exclusão será chamado e poderá ser executado.

excluir-categorias

Excluindo uma categoria.

Para acessar o código do botão excluir categoria, entre em “categories.html” dentro da pasta “xamp\htdocs\ecommerce\views\admin” e edite o código conforme o exemplo abaixo na linha 11. Observe que o trecho entre as tags “<tbody>” se refere a reprodução de uma tabela HTML exibindo os itens de categoria, onde cada linha apresenta um botão editar e o excluir.

HTML: categories.html > botão excluir categoria

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// ... (inicio do código)
 
<tbody>
 {loop="$categories"}
     <tr>
         <td>{$value.idcategory}</td>
         <td>{$value.descategory}</td>
         <td>
            <a href="/ecommerce/admin/categories_get/{$value.idcategory}" class="btn btn-primary btn-xs"><i class="fa fa-edit"></i> Editar</a>
            <a href="/ecommerce/admin/categories_delete/{$value.idcategory}" " onclick="return confirm('Deseja realmente excluir este registro?')" class="btn btn-danger btn-xs"><i class="fa fa-trash"></i> Excluir</a>
          </td>
      </tr>
  {/loop}
</tbody>
 
// ... (Final do código.)
?>
    
botao-excluir-categorias

Analizando linha por linha o código:

  • L5 – {loop=”$categories”}
    • {loop … }
      Esta construção representa um sistema de laço de repetição. Indica que o código dentro deste bloco será executado repetidamente para cada item presente na variável $categories, isto é, para cada categoria.
    • “$categories”
      Esta variável contém um conjunto de dados, isto e, um array ou lista, onde cada elemento representa uma categoria.
  • L7 – < td>{$value.idcategory}</td >
    • < td> … </td >
      Esta tag define uma célula de dados em uma tabela HTML.
    • {$value.idcategory}
      Esta expressão exibe o valor do campo idcategory do item atual da iteração do laço. Este campo representa o identificador único da categoria.
  • L8 – < td>{$value.descategory}</td >
    • Similar ao anterior, este trecho exibe o valor do campo descategory do item atual. Este campo contém o nome da categoria.
  • L9 a L12 – < td> … </td > (Linha com links)
    • Esta célula contém dois links nos botões: “Editar” e “Excluir”.
  • L10 – <a href=”/ecommerce/admin/categories_get/{$value.idcategory}” class=”btn btn-primary btn-xs”><i class=”fa fa-edit”></i> Editar</a>
    • <a> … </a>: Esta tag define um link HTML.
    • href=”/ecommerce/admin/categories_get/{$value.idcategory}”: Este atributo define o destino do link. Note que ele inclui o idcategory da categoria atual, permitindo que a página de edição seja aberta para a categoria correta.
    • class=”btn btn-primary btn-xs”: Esta classe define a aparência do botão como um botão primário pequeno, utilizando provavelmente um framework CSS como Bootstrap.
    • <i class=”fa fa-edit”></i>: Este ícone de edição, provavelmente proveniente de um framework de ícones como Font Awesome, é exibido dentro do botão.
    • Editar: Texto do link.
  • L11 – <a href=”/ecommerce/admin/categories_delete/{$value.idcategory}” onclick=”return confirm(‘Deseja realmente excluir este registro?’)” class=”btn btn-danger btn-xs”><i class=”fa fa-trash”>&t;/i> Excluir</a>
    • Similar ao link de edição, este link leva à página de exclusão da categoria.
    • onclick=”return confirm(‘Deseja realmente excluir este registro?’)”>: Este código JavaScript exibe uma caixa de diálogo de confirmação antes de o link ser seguido, impedindo exclusões acidentais.
    • class=”btn btn-danger btn-xs”: Esta classe define a aparência do botão como um botão primário pequeno, utilizando um framework CSS Bootstrap.
    • <i class=”fa fa-trash”></i>: Este ícone de lixeira é exibido dentro do botão.
    • Excluir: O texto do link.
  • L13 – </tr> : Esta tag define o fim de uma linha da tabela.
  • L14 – {/loop} : Esta marca indica o fim do bloco de repetição.

Excluindo um registro de categoria.

Ao clicar no botão excluir o código JavaScript exibe uma caixa de diálogo de confirmação antes de o link ser seguido, impedindo exclusões acidentais. Se confirmarmos a exlusão do registro seremos direcionados para a rota “admin/categories/:idcategory/delete” que recebe o ID da categoria s ser tratada.

Portanto teremos de criar a rota “admin/categories/:idcategory/delete” dentro do código “admin-categories.php” exemplificado a seguir:

admin-categories.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
use \Hcode\Page;
use \Hcode\PageAdmin;
use \Hcode\Model\User;
use \Hcode\Model\Category;
 
// ... Restante do código admin-categories.php ...
 
$app->get("/admin/categories_delete/:idcategory"function($idcategory
{  
    User::verifyLogin(); 
    $category new Category(); 
    $category->get((int)$idcategory);        
    $category->delete(); 
    header("Location: /ecommerce/admin/categories");    
    exit;        
});
 
?>
  • L10 – $app-> get (¨/admin/categories/:idcategory/delete”, function($idcategory)
    Criamos a rota de exclusão de categoria que recebe o ID da categoria por “idcategory” e excuta a função function($idcategory).
  • L12 – User::verifyLogin();
    Verificamos se o usuário está logado, através do método “verifyLogin()“.
  • L13 – $Category = new Category;
    Crie o objeto “$Category” em uma nova instância Category()“.
  • L14 – $Category->get((int)$idcategory);
    Usando o método “get” (ainda não criado) vamos carregar o objeto juntamente com os dados.
  • L15 – $Category->delete();
    Se o objeto for carregado, poderá ser excluído, através do método “delete()“.
  • L16 – header(‘Location: /admin/categories’);
    Após a exclusão da categoria seremos redirecionados de volta na página “Lista de Categorias”.
  • Excluindo registro através do metodo delete()

    O código a seguir, dentro da classe Category.php, é responsável por deletar uma categoria específica do banco de dados. Esse código pega o ID da categoria que você quer apagar, manda um comando pro banco de dados deletar essa categoria, e depois atualiza o menu do seu site. Simples assim! É um exemplo clássico de como o PHP interage com o banco de dados para manipular informações.

    Inclua o código “função delete()” dentro da classe “Category.php“.

    Veja o código linha por linha:

    Category.php (trecho – função delete())

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    // ... início código Category.php ...
     
    public function delete()
        {
            $sql new Sql();
            $sql->query("DELETE FROM tb_categories WHERE idcategory = :idcategory"array(
                ":idcategory"=>$this->getidcategory()
            ));
     
            Category::update_menu_categories();
        }
     
    // ... resto código Category.php ...
    ?>
     
     
        
  • L4 – public function delete():
    Essa é a função delete(). Ela é pública, ou seja, pode ser chamada de qualquer lugar do seu sistema. O objetivo dela? Excluir uma categoria.
  • L6 – $sql = new Sql();:
    Aqui, a gente cria um objeto $sql da classe Sql. Essa classe é responsável por interagir com o banco de dados.
  • L7 – $sql->query(“DELETE FROM tb_categories WHERE idcategory = :idcategory”, array( “:idcategory”=>$this->getidcategory() ));
    Essa é a query ‘Delete‘ que significa apagar. ‘From tb_categories‘ diz que a gente quer apagar algo da tabela ‘tb_categories‘. ‘Where idcategory = :idcategory‘ é a condição: a gente só vai apagar a categoria que tiver o ‘idcategory‘ igual ao valor que a gente vai passar.
    • :idcategory”=>$this->getidcategory();:
      Aqui, a gente passa o valor do ‘idcategory‘. O “:idcategory” é um placeholder, um espaço reservado. O “$this->getidcategory()” pega o ID da categoria que a gente quer apagar. É uma boa prática usar placeholders para evitar “SQL injection“, um tipo de ataque hacker. Segurança em primeiro lugar, pessoal!
  • L11 – Category::update_menu_categories();
    E pra finalizar, a gente chama a função update_menu_categories(). Essa função, atualiza o menu de categorias do seu site. Se você apagou uma categoria, o menu precisa refletir essa mudança, certo? É como atualizar o cardápio depois que um prato sai de linha.
  • Método update_menu_category

    Esse código pega todas as categorias do banco de dados, cria um menu HTML dinâmico com links para cada categoria, e salva esse menu em um arquivo HTML. É assim que a gente mantém o menu de categorias do site sempre atualizado, sem precisar editar o código HTML manualmente. É uma forma de automatizar a criação do menu, e manter o site sempre atualizado.

Insira dentro do código “Category.php” o método “update_menu_category” descrito linha por linha a seguir:

Category.php (trecho “update_menu_category”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// ... início código Category.php ...
 
public function update_menu_categories() 
    {
        $category = Category::listAll();
        $html = [];
        foreach ($category as $row) {
            array_push($html,'<li><a href="/ecommerce/category/'.$row['idcategory'].'">'.$row['descategory'].'</a></li>');
        }      
        file_put_contents('c:\xampp\htdocs\ecommerce\views\categories-menu.html', implode('',$html));     
    }
 
// ... resto código Category.php ...
?>
  • L4 – public function update_menu_categories()
    Pessoal, essa é a função “update_menu_categories()“. Ela é pública, então pode ser chamada de qualquer lugar do sistema. O objetivo dela? Atualizar o menu de categorias do site, que fica na parte inferior da página principal de nossa loja ecommerce.
  • L6 – $category = Category::listAll();
    Aqui, a gente chama a função listAll() da classe Category. Essa função busca todas as categorias do banco de dados e retorna um array com os dados de cada categoria. Pensa nisso como um ‘cardápio completo’ de todas as categorias.
  • L7 – $html = [];
    A gente cria um array vazio chamado $html. Esse array vai armazenar as linhas de código HTML que representam cada item do menu.
  • L8 – foreach ($category as $row) { … }
    Esse é um loop foreach. Ele percorre cada categoria que a gente pegou do banco de dados. Para cada categoria, a gente executa o código dentro das chaves.
  • L9 – array_push($html,'<li><a href=”/ecommerce/category/’.$row[‘idcategory’].'”>’.$row[‘descategory’].'</a></li>’);
    Dentro do loop, a gente usa a função array_push() para adicionar uma nova linha de código HTML ao array $html. Essa linha cria um item de lista (<li>) com um link (<a>) para a página da categoria.
    • /ecommerce/category/’.$row[‘idcategory’]
      Essa parte cria o link dinamicamente, usando o ID da categoria.
    • $row[‘descategory’]
      Essa parte pega o nome da categoria do banco de dados e coloca como texto do link.
  • L11 – file_put_contents(‘c:\xampp\htdocs\ecommerce\views\categories-menu.html’, implode(”,$html)); Essa é a linha final. A gente usa a função file_put_contents() para escrever o conteúdo do array $html do arquivo categories-menu.html.
  • memu-categorias

    Veja a seguir o código gerado “categories-menu.html“:

    1
    2
    <li><a href="/ecommerce/category/25">Android</a></li><li><a href="/ecommerce/category/8">Apple</a></li><li><a href="/ecommerce/category/11">Motorola</a></li><li><a href="/ecommerce/category/9">Samsung</a></li>