Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

FP-73 - Criação de Listagem de Produtos por Categorias

Bom dia, agradeceria ajuda.. No curso FP-73 existe um topico com referencia a criação de uma listagem de produtos. Conseguimos exibir todos os produtos constantes no Banco. Mudando um pouco esse exercício, eu gostaria de criar uma Listagem de produtos tendo como base uma categoria escolhida. No nosso caso, a partir da pagina de Formulário de Produto que mostra as categorias: Esporte, Escolar, Mobilidade.

produto-lista do FP-73

 <?php include "cabecalho.php"; ?>
<?php include "conecta.php"; ?>
<?php include "banco-produto.php"; ?>
<?php include "produto.php"; ?>
<?php include "categoria.php"; ?>
<?php
    require_once "logica-usuario.php";
    require_once 'autoload.php';

    verificaUsuario();
?>

Usuário logado: <?=usuarioLogado() ?>

<?php if (array_key_exists('removido', $_GET) && $_GET['removido'] == true) { ?>

    <p class="alert-success">Produto removido com sucesso.</p>
<?php } ?>

<table class="table table-striped table-bordered">
    <thead>
        <tr>
            <th class="text-center">Nome</th>
            <th class="text-center">Preço</th>
            <th class="text-center">Preço com Desconto</th>
            <th class="text-center">Descrição</th>
            <th class="text-center">Categoria</th>
            <th class="text-center" colspan="2">Ações</th>
        </tr>
    </thead>
<?php

$dao = new ProdutoDAO($conexao);
$produtos = $dao->listaProdutos();
foreach ($produtos as $produto) :
?>
    <tr>
        <td><?=$produto->getNome() ?></td>
        <td><?=$produto->getPreco() ?></td>
        <td><?=$produto->subtraiDesconto(0.1) ?></td>
        <td><?=substr($produto->getDescricao(), 0, 40) ?> ...</td>
        <td><?=$produto->getCategoria()->getNome() ?></td>
        <td class="text-center">
            <form method="post" action="remove-produto.php">
                <input type="hidden" name="id" value="<?=$produto->getId() ?>">
                <button class="btn btn-danger" type="submit">Remover</button>
            </form>
        </td>
        <td class="text-center">
            <form method="get" action="produto-formulario.php">
                <input type="hidden" name="id" value="<?=$produto->getId() ?>">
                <button class="btn btn-primary" type="submit">Alterar</button>
            </form>
        </td>
    </tr>

<?php
endforeach
?>
</table>

<?php include "rodape.php"; ?>

Classe produto na função de listaProduto:

class ProdutoDAO
{
private $conexao;
function __construct($conexao) {
$this->conexao = $conexao;
}
function listaProdutos()
{
$produtos = array();
$resultado = mysqli_query($this->conexao,
"select p.*, c.nome as categoria_nome from produtos as p "
. "join categorias as c on p.categoria_id = c.id");
while($array = mysqli_fetch_assoc($resultado)) {
$produto = new Produto();
$produto->setId($array['id']);
$produto->setNome($array['nome']);
// outros campos omitidos
// relacionando com categoria
$produto->setCategoria(new Categoria());
$produto->getCategoria()->setId($array['categoria_id']);
$produto->getCategoria()->setNome($array['categoria_nome']);
array_push($produtos, $produto);
}
return $produtos;
}
2 respostas
solução!

Uma das maneiras de fazer é realizar duas alterações:

1) recuperar o valor da categoria enviado pelo formulário e passar para o objeto

// código omitido
$categoria = $_POST['categoria'];

$dao = new ProdutoDAO($conexao);
$produtos = $dao->listaProdutos($categoria);
foreach ($produtos as $produto) :
// código omitido

2) Ajustar o método para funcionar com ou sem a informação da categoria.

function listaProdutos($categoria)
{
    $produtos = array();
    $sql = "select p.*, c.nome as categoria_nome from produtos as p "
    $sql .= " join categorias as c on p.categoria_id = c.id");
    if ( $categoria>0 )
        $sql .= " where p.categoria_id = " . $categoria . ";" ;
    $resultado = mysqli_query($this->conexao, $sql);
    // código omitido
    return $produtos;
}

Obrigado Gabriel, vou implementar estas soluções

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software