Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problema com "usado" no ProdutoFactory Aula 5

Estou com um problema na hora de adicionar e alterar meus produtos, apesar de estarem funcionando quando deixo o checkbox de usado desmarcado me aparece o seguinte aviso :( ! ) Notice: Undefined index: usado in C:\wamp64\www\loja\class\ProdutoFactory.php on line 13. Baixei a pasta da aula e aparentemente os códigos estão todos iguais, se alguém souber o motivo desse erro, fico grato. Segue os códigos:

ProdutoFactory

class ProdutoFactory {

    private $classes = array("Produto", "Ebook", "LivroFisico");

    public function criaPor($tipoProduto, $params) {

        $nome = $params['nome'];
        $preco = $params['preco'];
        $descricao = $params['descricao'];
        $categoria = new Categoria();
        $usado = $params['usado'];

        if (in_array($tipoProduto, $this->classes)) {
            return new $tipoProduto($nome, $preco, $descricao, $categoria, $usado);
        }

        return new Produto($nome, $preco, $descricao, $categoria, $usado);
    }
}

altera-produto

$tipoProduto = $_POST['tipoProduto'];
$produto_id = $_POST['id'];
$categoria_id = $_POST['categoria_id'];

$factory = new ProdutoFactory();
$produto = $factory->CriaPor($tipoProduto, $_POST);
$produto->atualizaBaseadoEm($_POST);

if (array_key_exists("usado", $_POST)) {
  $produto->setUsado("true");
} else {
  $produto->setUsado("false");
}

$produto->setId($produto_id);
$produto->getCategoria()->setId($categoria_id);



$produtoDAO = new ProdutoDAO($conexao);
if ($produtoDAO->AlteraProduto($produto)){
    ?>
    <p class="alert alert-success"> Produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> alterado com sucesso!</p>
    <?php
}else{
    $msg = mysqli_error($conexao);
    ?>
    <p class="alert alert-danger"> Produto <?= $produto->getNome() ?>, não foi alterado:
        <?= $msg ?></p>
    <?php
}
    ?>

insere-produto

$tipoProduto = $_POST['tipoProduto'];
$categoria_id = $_POST['categoria_id'];

$factory = new ProdutoFactory();
$produto = $factory->CriaPor($tipoProduto, $_POST);
$produto->atualizaBaseadoEm($_POST);

$produto->getCategoria()->setId($categoria_id);

if(array_key_exists('usado', $_POST)) {
    $produto->setUsado("true");
} else {
    $produto->setUsado("false");
}
$produtoDAO = new ProdutoDAO($conexao);
if ($produtoDAO->InsereProduto($produto)){
    ?>
    <p class="alert alert-success"> Produto <?=$produto->getNome()?>, <?=$produto->getPreco()?> adicionado com sucesso!</p>
    <?php
}else{
    $msg = mysqli_error($conexao);
    ?>
    <p class="alert alert-danger"> Produto <?= $produto->getNome()?>, não foi adicionado: <?= $msg ?></p>
    <?php
}
    die();
    ?>
1 resposta
solução!

Olá Lucas,

Isso acontece porque quando enviamos um informação via POST de um campo do tipo "checkbox" precisamos validar se ele foi marcado ou não, caso ele não tenha sido marcado seu índice "usado" não será enviado ao realizarmos um "submit" no formulário, somente se ele estiver marcado.

Veja o exemplo de uma validação para resolver seu problema:

class ProdutoFactory {

    private $classes = array("Produto", "Ebook", "LivroFisico");

    public function criaPor($tipoProduto, $params) {

        $nome = $params['nome'];
        $preco = $params['preco'];
        $descricao = $params['descricao'];
        $categoria = new Categoria();
        $usado = isset($params['usado']) ? 1 : 0;

        if (in_array($tipoProduto, $this->classes)) {
            return new $tipoProduto($nome, $preco, $descricao, $categoria, $usado);
        }

        return new Produto($nome, $preco, $descricao, $categoria, $usado);
    }
}

Caso tiver sido marcado o campo salva com o valor 1, ao contrário será marcado 0. Utilizando essa condição ternária já evitamos erros de índice.

Espero ter ajudado.