JAMES WEB

Aprenda como se faz.


Sumário

Relacionando produtos com categorias

Continuando a parte visual de nosso site, agora precisamos relacionar os produtos com as categorias. Após configurarmos o mecanismo que realiza estes procedimentos poderemos exibir na página principal os produtos relacionados a uma categoria quando acionado no menu de categorias. O processo oculto está na parte administrativa de nosso site e vamos modificar e adicionar alguns códigos para habilitar estas funções.

Arquivo para download

produtos-vs-categorias

Criando a tabela tb_categoriesproducts

Primeiro vamos criar a tabela tb_categoriesproducts que será capaz de relacionar categorias com produtos. Veja a seguir passo a passo:

  • Iniciar o XAMPP:
    • Abra o painel de controle do XAMPP.
    • Inicie os serviços do Apache e MySQL clicando nos botões “Start” respectivos.
  • Acessar o phpMyAdmin:
    • No painel de controle do XAMPP, clique no botão “Admin” ao lado do MySQL. Isso abrirá o phpMyAdmin no seu navegador.
  • Selecionar o banco de dados db_ecommerce:
    • Na coluna da esquerda do phpMyAdmin, você verá uma lista de bancos de dados.
    • Clique em db_ecommerce.
  • Executar a consulta SQL para criar a tabela:
    • Com o banco de dados db_ecommerce selecionado, clique na aba “SQL” no menu superior.
    • Na área de texto onde você pode digitar consultas SQL, cole o seguinte código.
      1
      2
      3
      4
      5
      CREATE TABLE `tb_categoriesproducts` (
      `idcategory` int(11) NOT NULL,
      `idproduct` int(11) NOT NULL,
      PRIMARY KEY (`idcategory`,`idproduct`)
      ) ENGIN=InnoDB DEFAULT CHARSET=utf8;
    • Clique no botão “Executar” (ou “Go”).
  • Verificar a criação da tabela:
    • Após a execução da consulta, você verá uma mensagem informando que a consulta foi executada com sucesso.
    • Na coluna da esquerda do phpMyAdmin, dentro do banco de dados db_ecommerce, você deverá ver a tabela tb_categoriesproducts.
    • Clique no nome da tabela tb_categoriesproducts para visualizar a estrutura da tabela (colunas, chaves primárias, etc.).

Seguindo esses passos, você terá criado a tabela tb_categoriesproducts no seu banco de dados db_ecommerce no XAMPP.

Configurando a tela Categorias vs Produtos

Depois de baixar e descompactar o arquivo categories-products.html que deve ser instalado na pasta xampp/htdocs/ecommerce/views/admin. Observe o código da página a seguir:

HTML: categories-products.html

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
  <h1>
    Produtos da Categoria {$category.descategory}
  </h1>
  <ol class="breadcrumb">
    <li><a href="/admin"><i class="fa fa-dashboard"></i> Home</a></li>
    <li><a href="/admin/categories">Categorias</a></li>
    <li><a href="/admin/categories/{$category.idcategory}">{$category.descategory}</a></li>
    <li class="active"><a href="/admin/categories/{$category.idcategory}/products">Produtos</a></li>
  </ol>
</section>
 
<!-- Main content -->
<section class="content">
 
    <div class="row">
        <div class="col-md-6">
            <div class="box box-primary">
                <div class="box-header with-border">
                <h3 class="box-title">Todos os Produtos</h3>
                </div>
                <!-- /.box-header -->
                <!-- form start -->
                <div class="box-body">
                    <table class="table table-striped">
                        <thead>
                            <tr>
                            <th style="width: 10px">#</th>
                            <th>Nome do Produto</th>
                            <th style="width: 240px">&nbsp;</th>
                            </tr>
                        </thead>
                        <tbody>
                            {loop="$productsNotRelated"}
                            <tr>
                            <td>{$value.idproduct}</td>
                            <td>{$value.desproduct}</td>
                            <td>
                                <a href="/admin/categories/{$category.idcategory}/products/{$value.idproduct}/add" class="btn btn-primary btn-xs pull-right"><i class="fa fa-arrow-right"></i> Adicionar</a>
                            </td>
                            </tr>
                            {/loop}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
        <div class="col-md-6">
            <div class="box box-success">
                <div class="box-header with-border">
                <h3 class="box-title">Produtos na Categoria {$category.descategory}</h3>
                </div>
                <!-- /.box-header -->
                <!-- form start -->
                <div class="box-body">
                    <table class="table table-striped">
                        <thead>
                            <tr>
                            <th style="width: 10px">#</th>
                            <th>Nome do Produto</th>
                            <th style="width: 240px">&nbsp;</th>
                            </tr>
                        </thead>
                        <tbody>
                            {loop="$productsRelated"}
                            <tr>
                            <td>{$value.idproduct}</td>
                            <td>{$value.desproduct}</td>
                            <td>
                                <a href="/admin/categories/{$category.idcategory}/products/{$value.idproduct}/remove" class="btn btn-primary btn-xs pull-right"><i class="fa fa-arrow-left"></i> Remover</a>
                            </td>
                            </tr>
                            {/loop}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>        
    </div>
 
</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->

O código HTML acima, “categories-products.html”, exibe uma página com duas colunas onde a primeira lista todos produtos não relacionados e outra coluna com os não relacionados com a categoria em questão.

Para acessar a página “categories-products.html” temos que criar a rota no arquivo admin-categories.php dentro do arquivo “admin´categories.php”

PHP: admin-categories.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
?php
// iníco do código...
  
//Rota Template categories-products.html
$app->get('/admin/categories_get/:idcategory/products'function($idcategory)
    User::verifyLogin();
    $category new Category();
    $category->get((int)$idcategory);
    $page new PageAdmin();                     
    $page->setTpl("categories-products", [
        'category'=>$category->getValues(), 
     'productsRelated'=>$category->getProducts(), 
        'productsNotRelated'=>$category->getProducts(false)   ]);
});
  
?>

Este código define uma rota para exibir uma página administrativa que mostra os produtos relacionados e não relacionados a uma categoria específica. Ele verifica o login do usuário, busca os dados da categoria, obtém os produtos relacionados e não relacionados e, em seguida, renderiza a página usando um template e passando os dados para ele.

Observe o que o código faz linha por linha:

  • L5 – $app->get(‘/admin/categories_get/:idcategory/products’, …):
    • Em termos simples, esta linha diz: “Quando alguém acessar um endereço web usando o método GET http://localhost/ecommerce/admin/categories_get/25/products, por exemplo, execute a função que se segue”.
  • L7 – User::verifyLogin()::
    • Garante que apenas usuários logados acessem a página.
  • L8 – $category = new Category();:
    • Cria um objeto de categoria.
  • L9 – $category->get((int)$idcategory);:
    • Busca informações da categoria pelo ID.
  • L10 – $page = new PageAdmin();:
    • Cria um objeto para gerenciar a página.
  • L11 – $page->setTpl(“categories-products”, […]);:
    • Define o template da página, “categories-products.html”, enviando dados da categoria e listas de produtos.
  • L12 – ‘category’ => $category->getValues():
    • Retorna um array com os dados da categoria.
  • L13 – ‘productsRelated’ => $category->getProducts():
    • Passa um array com os produtos relacionados à categoria, obtidos pelo método getProducts() da classe category.
  • L14 – ‘productsNotRelated’ => $category->getProducts(false):
    • Passa um array com os produtos não relacionados à categoria, obtidos pelo método getProducts(false) da classe category. O parâmetro false indica que queremos os produtos não relacionados.

Método getProducts()

A função getProducts() busca produtos relacionados ou não relacionados a uma categoria, dependendo do valor do parâmetro $related. Ela usa consultas SQL com subconsultas e junções (INNER JOIN) para obter os resultados desejados. O valor do idcategory é obtido através do método $this->getidcategory() e passado para a consulta SQL para filtrar os resultados. A classe SQL, executa a consulta e retorna o resultado.

Este método deve ser inserido no arquivo da classe Category.php conforme o exemplo 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
27
28
29
30
31
<?php
// início do código...
  
public function getProducts($related = true)
    {
    $sql new Sql();
    if ($related === true) {
        return $sql->select("
            SELECT * FROM tb_products WHERE idproduct IN(
                SELECT a.idproduct
                FROM tb_products a
                INNER JOIN tb_categoriesproducts b ON a.idproduct = b.idproduct
                WHERE b.idcategory = :idcategory
            );
        ", [
            ':idcategory' => $this->getidcategory()
        ]);
    else {
        return $sql->select("
            SELECT * FROM tb_products WHERE idproduct NOT IN(
                SELECT a.idproduct
                FROM tb_products a
                INNER JOIN tb_categoriesproducts b ON a.idproduct = b.idproduct
                WHERE b.idcategory = :idcategory
            );
        ", [
            ':idcategory' => $this->getidcategory()
        ]);
    }
}
?>

Veja como funciona o código linha por linha:

  • L4 – public function getProducts($related = true)::
    • Define uma função pública chamada getProducts. Isso significa que essa função pode ser chamada de qualquer lugar.
    • $related = true: Define um parâmetro opcional chamado $related com o valor padrão true. Esse parâmetro determina se a função deve retornar produtos relacionados (true) ou não relacionados (false).
  • L6 – $sql = new Sql();:
    • $sql: Classe personalizada que lida com a execução de consultas SQL no banco de dados.
    • new Sql(): Cria uma nova instância dessa classe e a armazena na variável $sql. Essa variável será usada para executar as consultas.
  • L7/29 – $if ($related === true) { … } else { … }:
    • Verifica o valor do parâmetro $related. Se $related for true, o código dentro do if será executado (para produtos relacionados). Caso contrário, o código dentro do else será executado (para produtos não relacionados).
  • L8 – return $sql->select(“…”, […]);:
    • $sql->select(…): Chama o método select() da instância de $sql para executar uma consulta SQL SELECT.
    • SELECT * FROM tb_products WHERE idproduct IN (…): Seleciona todos os produtos da tabela tb_products onde o idproduct está presente no resultado da subconsulta.
    • SELECT a.idproduct FROM tb_products a INNER JOIN tb_categoriesproducts b ON a.idproduct = b.idproduct WHERE b.idcategory = :idcategory: Seleciona os idproducts da tabela tb_products que estão relacionados à categoria especificada.
      • INNER JOIN tb_categoriesproducts b ON a.idproduct = b.idproduct: Une as tabelas tb_products e tb_categoriesproducts usando a coluna idproduct.
      • WHERE b.idcategory = :idcategory: Filtra os resultados para incluir apenas os produtos relacionados à categoria com o idcategory fornecido.
  • L16 – [‘:idcategory’ => $this->getidcategory()]:
    • É um array associativo que passa o valor do idcategory para a consulta.
      • ‘:idcategory’: É o marcador na consulta SQL que será substituído pelo valor.
      • $this->getidcategory(): Chama o método getidcategory() da classe atual para obter o valor do idcategory.
  • L19/28 – return $sql->select(“…”, […]);:
    • Similar ao caso citado na linha 8, mas usa NOT IN na consulta SQL.
    • SELECT * FROM tb_products WHERE idproduct NOT IN (…): Seleciona todos os produtos da tabela tb_products onde o idproduct não está presente no resultado da subconsulta.
    • A subconsulta é a mesma do caso da linha 8, mas agora a consulta principal seleciona os produtos que não estão relacionados à categoria especificada.

Acessando página produtos vs categorias

Agora vamos criar o link que permite o acesso à página do template categories-products.html. Para isto acesse e modifique o template categories.html no diretório ecommerce/views/admin. Neste arquivo acrescente mais um botão (linha 17) no lado esquerdo do botão “Editar” e altere a largura da coluna configurada na linha 8 “<th style=”width: 140px”></th>“ na propriedade width de 140px para 240px conforme o exemplo a seguir:

HTML: categories.html

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
<!—inicio do código ...-- > 
<div class="box-body no-padding">
    <table class="table table-striped">
      <thead>
        <tr>
          <th style="width: 10px">#</th>
          <th>Nome da Categoria</th>
          <th style="width: 240px">&nbsp;</th>
        </tr>
      </thead>
      <tbody>
        {loop="$categories"}
        <tr>
          <td>{$value.idcategory}</td>
          <td>{$value.descategory}</td>
          <td>
            <a href="/ecommerce/admin/categories_get/{$value.idcategory}/products" class="btn btn-default btn-xs"><i class="fa fa-edit"></i> Produtos</a>
            <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>
    </table>
</div>
<!—resto do código ...-- >

Para testar acesse a página administrativa do site e clique no botão “Produtos” criado em uma das categorias exibidas. Seremos direcionados ao template “categories-products.html” com o título “Produtos da Categoria …” com duas colunas. A primeira relacionando todos os produtos e outra coluna com os produtos na categoria…

produtos-vs-categorias

Adicionando Produtos a uma Categoria

Ao selecionar uma categoria específica na página “Lista de Categorias” do painel administrativo, o sistema o redirecionará para a página “Produtos da Categoria Selecionada”. Esta página é estruturada em duas colunas distintas, projetadas para facilitar o gerenciamento de produtos relacionados à categoria escolhida:

  • Coluna 1: Produtos Não Relacionados: Esta coluna exibe todos os produtos que, atualmente, não estão associados à categoria selecionada.
  • Coluna 2: Produtos Relacionados: Esta coluna apresenta os produtos que já foram vinculados à categoria em questão.
  • Para adicionar um produto à categoria selecionada, siga estes passos:

    1. Localize o produto desejado na coluna “Produtos Não Relacionados”.
    2. Clique no botão “Adicionar”, adjacente ao produto escolhido.

    Ao clicar em “Adicionar”, o sistema o redirecionará para a seguinte rota: http://localhost/admin/categories/25/products/1/add, por exemplo. Esta rota é responsável por executar a ação de vincular o produto selecionado à categoria em questão, atualizando o banco de dados (tabela tb_categoriesproducts) e refletindo a mudança na coluna “Produtos Relacionados”.

    Observações Importantes:

    • O número “25” presente na rota de exemplo (/categories/25/) representa o identificador único da categoria selecionada. Este valor varia dependendo da categoria escolhida.
    • O número “1” presente na rota de exemplo (/products/1/) representa o identificador único do produto selecionado. Este valor varia dependendo do produto escolhido.
    • “localhost” significa que o sistema está sendo executado localmente, em ambiente de testes.

    Esta estrutura permite um gerenciamento eficiente dos produtos em cada categoria, garantindo a organização e a precisão das informações exibidas aos usuários.

    Para executar estes procedimentos, acesse o código admin-categories.php e adicione no final a seguinte rota:

    Esse código “PHP: admin-categories.php”, pega os IDs de uma categoria e um produto, busca as informações deles no banco de dados, adiciona o produto à categoria e redireciona o usuário para a página de produtos da categoria.

    Veja Linha por Linha:

    • L4 – $app->get(‘/admin/categories_get/:idcategory/products/:idproduct/add’, function($idcategory, $idproduct) {
      • $app->get(…): Aqui, estamos definindo uma rota no nosso aplicativo web. Pense nisso como um “endereço” que o navegador vai acessar.
      • ‘/admin/categories_get/:idcategory/products/:idproduct/add’: Esse é o “endereço” da rota.
        • /admin/categories_get/: Indica que estamos na área administrativa, lidando com categorias.
        • :idcategory: Isso é um parâmetro dinâmico. Ou seja, o valor dessa parte do endereço vai variar. Por exemplo, pode ser /admin/categories_get/10/. O “10” seria o ID da categoria.
        • /products/:idproduct/add: Similar ao anterior, :idproduct é o ID do produto que queremos adicionar à categoria.
        • /add: Indica que essa rota é para adicionar o produto à categoria.
        • function($idcategory, $idproduct) { … }: Isso é uma função anônima (uma função sem nome) que será executada quando alguém acessar essa rota. Os valores dos parâmetros :idcategory e :idproduct serão passados para essa função como $idcategory e $idproduct.
    • L6 – User::verifyLogin();: Aqui, estamos verificando se o usuário está logado no painel administrativo. É uma medida de segurança. Se o usuário não estiver logado, ele será redirecionado para a página de login.
    • L7 – $category = new Category();: Criamos um novo objeto da classe Category. Essa classe contém métodos para manipular informações de categorias no banco de dados.
    • L8 – $category->get((int)$idcategory);: Usamos o método get() do objeto $category para buscar as informações da categoria no banco de dados, usando o $idcategory que recebemos na rota. O (int) garante que o $idcategory seja tratado como um número inteiro.
    • L9 – $product = new Product();: Criamos um novo objeto da classe Product. Essa classe contém métodos para manipular informações de produtos.
    • L10 – $product->get((int)$idproduct);: Usamos o método get() do objeto $product para buscar as informações do produto no banco de dados, usando o $idproduct que recebemos na rota. O (int) garante que o $idproduct seja tratado como um número inteiro.
    • L11 – $category->addProduct($product);: Usamos o método addProduct() do objeto $category para adicionar o produto à categoria. Esse método insere um registro na tabela de relacionamento (tb_categoriesproducts) no banco de dados.
    • L12 – header(“Location: /ecommerce/admin/categories_get/”.$idcategory.”/products”);: Após adicionar o produto à categoria, redirecionamos o usuário para a página que lista os produtos da categoria.
      • header(“Location: …”): É uma função que envia um cabeçalho HTTP para o navegador, instruindo-o a redirecionar para outra página.
      • /ecommerce/admin/categories_get/”.$idcategory.”/products”: É o endereço para onde o usuário será redirecionado.
    • L13 – exit;: Encerramos a execução do script PHP. Isso é importante para garantir que nenhum código adicional seja executado após o redirecionamento.

    PHP: admin-categories.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    // início código ...
    //Rota relacionar um produtos a uma categoria
    $app->get('/admin/categories_get/:idcategory/products/:idproduct/add'function($idcategory$idproduct)
        User::verifyLogin();
        $category new Category();
        $category->get((int)$idcategory);
        $product new Product();
        $product->get((int)$idproduct);    
        $category->addProduct($product);
        header("Location: /ecommerce/admin/categories_get/".$idcategory."/products");  
        exit;
    });
    ?>

    PHP: Método addProduct (Category.php)

    Observamos na Linha 11 do código anterior a instrução “$category->addProduct($product);“ em que executamos o método addProduct($product) que adiciona um registro na tabela tb_categoriesproducts criando uma relação entre o produto e categorias. Veja a seguir o código que deve ser inserido do arquivo Category.php.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    // início código...
      
    public function addProduct(Product $product)
       {
                $sql new Sql();      
                $sql->query("INSERT INTO tb_categoriesproducts (idcategory, idproduct) VALUES (:idcategory, :idproduct)", [
                            ':idcategory'=>$this->getidcategory(),
                            ':idproduct'=>$product->getidproduct()
                            ]);                
       }
    }
    ?>

    Essa parte do código é responsável por inserir um novo registro na tabela tb_categoriesproducts, que é uma tabela de relacionamento entre categorias e produtos no seu banco de dados.

    Veja a explicação linha por linha:

    • L6 – $sql = new Sql();: Aqui, estamos criando um novo objeto chamado $sql da classe Sql. A classe Sql é uma classe personalizada que você criou para lidar com as operações do banco de dados. Ela deve conter métodos para executar queries SQL, conectar ao banco, e tratar erros.
    • L7 – $sql->query(“INSERT INTO tb_categoriesproducts (idcategory, idproduct) VALUES (:idcategory, :idproduct)”, [
      • $sql->query(…): Aqui, estamos chamando o método query() do objeto $sql. Esse método é responsável por executar uma query SQL no banco de dados.
      • “INSERT INTO tb_categoriesproducts (idcategory, idproduct) VALUES (:idcategory, :idproduct)”: Essa é a query SQL que será executada.
      • INSERT INTO tb_categoriesproducts (idcategory, idproduct): Isso especifica que queremos inserir dados na tabela tb_categoriesproducts, nas colunas idcategory e idproduct.
      • VALUES (:idcategory, :idproduct): Isso especifica os valores que serão inseridos nas colunas. Os :idcategory e :idproduct são placeholders (marcadores de posição) para os valores reais, que serão fornecidos posteriormente.
    • L8 – ‘:idcategory’=>$this->getidcategory(): Chama o método getidcategory() do objeto atual ($this). Esse método deve retornar o ID da categoria que você deseja inserir na tabela. O valor retornado por essa função, será inserido no lugar do placeholder :idcategory na query SQL.
    • L9 – ‘:idproduct’=>$product->getidproduct(): Chama o método getidproduct() do objeto $product. Esse método deve retornar o ID do produto que você deseja inserir na tabela. O valor retornado por essa função, será inserido no lugar do placeholder :idproduct na query SQL.
    • L10 – ]);: Isso fecha o array de parâmetros e o parênteses da chamada do método query().

    Não se esqueça de inserir no inicio co código a linha “use \Hcode\Model\Product;” para liberar o uso da Classe Product nesta parte de seu código.

    Desvinculando uma categoria de um produto

    Até este ponto, desvendamos o mistério de adicionar produtos a categorias, uma conquista que se manifesta em nossos testes. Observem como a segunda coluna de produtos, outrora estática, agora floresce com a presença de um novo item e um botão “Remover.

    Agora, embarcaremos em uma nova jornada, a de dotar nosso site com a capacidade de remover produtos de categorias. Para isso, invocaremos a função “removeProduct”, uma irmã gêmea da já existente “addProduct”, ambas residentes no arquivo “Category.php”.

    Abaixo da função “addProduct insira a função “removeProduct”, seguindo o exemplo que se desdobrará diante de seus olhos.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    // Início código ...
     
    public function removeProduct(Product $product)
              {
        $sql new Sql();
      
        $sql->query("DELETE FROM tb_categoriesproducts WHERE idcategory = :idcategory AND idproduct = :idproduct", [
                ':idcategory' => $this->getidcategory(),
                ':idproduct' => $product->getidproduct()
            ]);
           
            }  
     }
      
    ?>, [
                ':idcategory' => $this->getidcategory(),
                ':idproduct' => $product->getidproduct()
            ]);  
          }
      }
    ?>

    A consulta SQL, expressa na linha “$sql->query(“DELETE FROM tb_categoriesproducts WHERE idcategory = :idcategory AND idproduct = :idproduct…”)”, é o coração da função “removeProduct“. Ela recebe os parâmetros “idcategory” e “idproduct“, que identificam a categoria e o produto a serem removidos, respectivamente.

    Ao executar essa consulta, a “removeProduct” garante que o produto seja removido da categoria especificada, mantendo a integridade do nosso banco de dados.

    Rota Template Category

    Certifique-se de que a rota do template “Category” esteja devidamente configurada no arquivo site.php. Esta rota é essencial para a renderização do template category.html quando uma categoria é selecionada no menu de categorias do rodapé da página principal do site.

    Observe o exemplo a seguir e a explicação de cada linha:

    PHP: site.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    //início do código
      
    //Rota Template Category
    $app->get('/category/:idcategory'function($idcategory)
        $category new Category();
        $category->get((int)$idcategory);
        $page new Page(); 
        $page->setTpl("category", [
            'category'=>$category->getValues(),
            'products'=>Product::checkList($category->getProducts())
            ]);     
    });
    ?> 

    Explicação Linha a Linha:

    • L5 – $app->get(‘/category/:idcategory’, function($idcategory) { … });: Esta linha define uma rota GET para a URL, por exemplo, http://localhost/ecommerce/category/25. :idcategory é um parâmetro dinâmico na URL, que captura o ID da categoria passada na requisição. A função anônima (closure) definida como segundo argumento será executada quando esta rota for acessada.
    • L7 – $category = new Category();: Esta linha instancia um novo objeto da classe Category. Este objeto será usado para interagir com os dados da categoria.
    • L8 – $category->get((int)$idcategory);: Esta linha chama o método get() do objeto $category, passando o ID da categoria (convertido para inteiro) como argumento. O método get() da classe Category busca os dados da categoria no banco de dados com base no ID fornecido e preenche os atributos do objeto $category com esses dados.
    • L9 – $page = new Page();: Esta linha instancia um novo objeto da classe Page. Este objeto será usado para renderizar o template da página.
    • L10 – $page->setTpl(“category”, [ … ]);: Esta linha chama o método setTpl() do objeto $page para definir o template a ser renderizado e os dados a serem passados para o template. O primeiro argumento, “category”, especifica o nome do template category.html. O segundo argumento é um array associativo que contém os dados a serem passados para o template.
    • L11 – ‘category’ => $category->getValues(): Esta linha passa os dados da categoria para o template. $category->getValues() chama o método getValues() do objeto $category para obter os dados da categoria em forma de array associativo.
    • L12 – ‘products’ => $category->getProducts(): Esta linha passa os produtos relacionados à categoria para o template. $category->getProducts() chama o método getProducts() do objeto $category para obter os produtos relacionados em forma de array associativo.
    • L13 – });: fecha a função anônima passada como parametro para o método get.

    Para Saber Mais…

    • Banco de dados SQL