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

Lista de categorias não está aparecendo após mudancas

Olá amigos.

Após as mudanças implementadas nessa aula, a lista de categorias do dropdown não aparece. Já tentei encontrar o erro, inclusive comparando com o projeto pronto fornecido por vocês, mas não encontrei ainda.

Segue o código dos arquivos produto-formulario.php, produto-formulario-base.php e banco-categoria.php para análise de vocês.

Desde já, muito grato pela ajuda.

produto-formulario.php

<?php
require_once("cabecalho.php");
require_once("banco-categoria.php");
require_once("logica-usuario.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");

verificaUsuario();

$categoria = new Categoria();
$categoria->setId(1);

$produto = new Produto();
$produto->setCategoria($categoria);

$categorias = listaCategorias($conexao);

?>
            <h1>Formulário de Cadastro</h1>
            <form action="adiciona-produto.php" method="post">
                <table class="table">

                    <?php require_once("produto-formulario-base.php"); ?>

                    <tr>
                        <td colspan="2"><input class="btn btn-primary" type="submit" value="Cadastrar" /></td>
                    </tr>
                </table>
            </form>

<?php require_once("rodape.php")?>

produto-formulario-base.php

<tr>
    <td>Nome:</td>
    <td><input class="form-control" type="text" name="nome" value="<?=$produto->getNome()?>"/></td>
</tr>
<tr>
    <td>Preço:</td>
    <td><input class="form-control" type="number" name="preco" value="<?=$produto->getPreco()?>" /></td>
</tr>
<tr>
    <td>Descrição:</td>
    <td><textarea name="descricao" class="form-control"><?=$produto->getDescricao()?></textarea></td>
</tr>

<tr>
    <td></td>
    <td>
        <input type="checkbox" name="usado" <?=$produto->isUsado()?> value="true"/> Usado
    </td>
</tr>

<tr>
    <td>Categoria</td>
    <td>
        <select name="categoria_id" class="form-control">
            <?php
                foreach($categorias as $categoria) :
                    $essaEhACategoria = $produto->getCategoria()->getId() == $categoria->getId();
                    $selecao = $essaEhACategoria ? "selected='selected'" : "";

            ?>
                <option value="<?=$categoria->getId()?>" <?=$selecao?>><?=$categoria->getNome()?>
                </option>
            <?php endforeach ?>
        </select>
    </td>
</tr>

banco-categoria.php

<?php
require_once("conecta.php");
require_once("class/Categoria.php");

function listaCategorias($conexao) {
    $categorias = array();
    $query = "select * from categorias";
    $resultado = mysqli_query($conexao, $query);
    while($categoria_array = mysqli_fetch_assoc($resultado)) {
        $categoria = new Categoria();
        $categoria->setId($categoria_array['id']);
        $categoria->setNome($categoria_array['nome']);
        array_push($categorias, $categoria);
    }
    return $categorias;
}
5 respostas

Bom dia,

Pelo que vejo no arquivo 'produto-formulario.php' você está utilizando dessa maneira:

$produto = new Produto();
$produto->setCategoria($categoria);

Tente trocar por:

$produto = new Produto();
$produto->setCategoria($categoria->getId());

Olá, Rodrigo!

Tentei, mas agora ele retorna um erro:

Fatal error: Call to a member function getId() on integer in C:\wamp64\www\loja\produto-formulario-base.php on line 27 Call Stack

Time Memory Function Location

1 0.0005 241000 {main}( ) ...\produto-formulario.php:0 2 0.0061 296160 require_once( 'C:\wamp64\www\loja\produto-formulario-base.php' ) ...\produto-formulario.php:23

Como você propôs, eu estaria setando o atributo categoria da classe Produto com um id, porém o atributo categoria da classe Produto é uma instância da classe Categoria.

Código da classe Produto:

<?php

class Produto {

  private $id;
  private $nome;
  private $preco;
  private $descricao;
  private $categoria;
  private $usado;

  public function getId() {
    return $this->id;
  }

  public function setId($id) {
    $this->id = $id;
  }

  public function getNome() {
    return $this->nome;
  }

  public function setNome($nome) {
    $this->nome = $nome;
  }

  public function getPreco() {
    return $this->preco;
  }

  public function setPreco($preco) {
    $this->preco = $preco;
  }

  public function getDescricao() {
    return $this->descricao;
  }

  public function setDescricao($descricao) {
    $this->descricao = $descricao;
  }

  public function getCategoria() {
    return $this->categoria;
  }

  public function setCategoria($categoria) {
    $this->categoria = $categoria;
  }

  public function isUsado() {
    return $this->usado;
  }

  public function setUsado($usado) {
    $this->usado = $usado;
  }

  public function precoComDesconto($valor = 0.1) {
      if($valor > 0 && $valor <= 0.5) {
          $this->preco -= $this->preco * $valor;
      }
      return $this->preco;
  }
}
 ?>

Código da classe Categoria:

<?php

class Categoria {
  private $id;
  private $nome;

  public function getId() {
    return $this->id;
  }

  public function setId($id) {
    $this->id = $id;
  }

  public function getNome() {
    return $this->nome;
  }

  public function setNome() {
    $this->nome = $nome;
  }
}

 ?>

Fala, Gustavo.

Que erro aparece?

No arquivo produto-formulario.php, você chama a função listaCategorias($conexao). Esta variável $conexao está sendo inicializada em algum arquivo incluído?

Bom dia, Carlos!

Não aparece erro, mas o problema é que nos formulários de inserção e alteração de produtos (produto-formulario.php e produto-altera-formulario.php) e na listagem de produtos (produto-lista.php) os nomes das categorias não estão sendo mostrados.

A parte do código que insere esses nomes nos formularios é a seguinte:

<td>Categoria</td>
    <td>
        <select name="categoria_id" class="form-control">
            <?php
                foreach($categorias as $categoria) :
                    $essaEhACategoria = $produto->getCategoria()->getId() == $categoria->getId();
                    $selecao = $essaEhACategoria ? "selected='selected'" : "";
            ?>
                <option value="<?=$categoria->getId()?>" <?=$selecao?>><?=$categoria->getNome()?>
                </option>
            <?php endforeach ?>
        </select>
    </td>

Em relação à variável $conexao, ela é inicializada no arquivo conecta.php que está incluído no arquivo banco-categoria.php que, por sua vez, está incluído no arquivo produto-formulario.php. Portanto, acho que o problema não está na variável $conexao.

solução!

Pessoal, achei meu erro! E era uma besteira... :/

Na classe Categoria, havia esquecido de definir o parâmetro do Setter do atributo Nome.

Estava assim:

    public function setNome() {
        $this->nome = $nome;

Mas precisa ser assim:

    public function setNome($nome) {
        $this->nome = $nome;

Incrível como uma pequena falta de atenção pode causar tanto problema. =P Me desculpem o transtorno ae! E muito grato pela atenção!

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