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

Problema ao testar tipo da Classe

Ao testar o tipo da classe, ele não tá carregando os valores do banco, ficando as propriedades ISBN, Taxa de Impressão e WaterMark, em branco.

O que pode ser?

No Produto.php, tenho esse código:

    public function temIsbn() {
        return ($this instanceof Livro); // || ($this instanceof LivroFisico) || ($this instanceof Ebook);
    }

    public function temTaxaImpressao() {
        return $this instanceof LivroFisico;

    }

    public function temWaterMark() {
        return $this instanceof Ebook;
    }

    public function atualizaBaseadoEm($params) {
        if ($this->temIsbn) {
            $this->setIsbn($params['isbn']);
        }
        if ($this->temTaxaImpressao) {
            $this->setTaxaImpressao($params['taxaImpressao']);
        }  
        if ($this->temWaterMark) {
            $this->setWaterMark($params['waterMark']);
        }
    }

E no produto-formulário, tenho esse código:

<?php require_once("cabecalho.php"); 
      require_once("logica-usuario.php");


verificaUsuario();

$tipoProduto = $_POST['tipoProduto'];
$factory = new ProdutoFactory();
$produto = $factory->criaPor($tipoProduto, $_POST);
$produto->atualizaBaseadoEm($_POST);
$produto->getCategoria($categoria)->setId(2);

$categoriaDao = new CategoriaDao($conexao);
$categorias = $categoriaDao->listaCategorias();
?>

<h1>Formulário de cadastro</h1>
<form action="adiciona-produto.php" method="post">
    <table class="table">
        <?php include("produto-formulario-base.php"); ?>
        <tr>
            <td colspan="2"><button class="btn btn-primary" type="submit">Cadastrar</button></td>
        </tr>
    </table>
</form>

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

E no produto-formulario-base.php, tem esse código:

        <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 class="form-control" name="descricao"><?=$produto->getDescricao()?></textarea></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="checkbox" name="usado" value="true" <?=$produto->getUsado()?"checked":""?>> Usado</td>
        </tr>
        <tr>
            <td>Categoria</td>
            <td>
                <select name="categoria_id" class="form-control">
                <?php foreach($categorias as $categoria) : ?>
                    <option value="<?=$categoria->getId()?>" <?=$produto->getCategoria()->getId()==$categoria->getId()?"selected":""?>><?=$categoria->getNome()?></option>
                <?php endforeach ?>
                </select>
            </td>
        </tr>
        <tr>
            <td>Tipo do produto</td>
            <td>
                <select name="tipoProduto" class="form-control">
                    <?php 
                    $tipos = array("Produto", "Livro Fisico", "Ebook");
                    foreach($tipos as $tipo) : 
                        $tipoSemEspaco = str_replace(' ', '', $tipo);
                        $esseEhOTipo = get_class($produto) == $tipoSemEspaco;
                        $selecaoTipo = $esseEhOTipo ? "selected='selected'" : "";
                    ?>
                        <?php if ($tipo == "Livro Fisico") : ?>
                            <optgroup label="Livros">
                        <?php endif ?>
                                <option value="<?=$tipoSemEspaco?>" <?=$selecaoTipo?>>
                                    <?=$tipo?>
                                </option>
                        <?php if ($tipo == "Ebook") : ?>
                            </optgroup>
                        <?php endif ?>
                    <?php endforeach ?>
                </select>
            </td>
        </tr>
        <tr>
            <td>ISBN (caso seja um livro)</td>
            <td><input type="text" class="form-control" name="isbn" value="<?=$produto->temIsbn() ? $produto->getIsbn() : ""?>"></td>
        </tr>
        <tr>
            <td>Taxa Impressão (caso seja um Livro Físico)</td>
            <td><input type="text" class="form-control" name="taxaImpressao" value="<?=$produto->temTaxaImpressao() ? $produto->getTaxaImpressao() : ""?>"></td>
        </tr>
        <tr>
            <td>Marca D'água (caso seja um Ebook)</td>
            <td><input type="text" class="form-control" name="waterMark" value="<?=$produto->temWaterMark() ? $produto->getWaterMark() : ""?>"></td>
        </tr>
2 respostas
solução!

Fiz uma página de testes e descobri o meu erro.

Na rotina, estava faltando os parenteses, pois é um método.

Como está:

public function atualizaBaseadoEm($params) {
        if ($this->temIsbn) {
            $this->setIsbn($params['isbn']);
        }
        if ($this->temTaxaImpressao) {
            $this->setTaxaImpressao($params['taxaImpressao']);
        }  
        if ($this->temWaterMark) {
            $this->setWaterMark($params['waterMark']);
        }
}

Como deve ser:

public function atualizaBaseadoEm($params) {
        if ($this->temIsbn()) {
            $this->setIsbn($params['isbn']);
        }
        if ($this->temTaxaImpressao()) {
            $this->setTaxaImpressao($params['taxaImpressao']);
        }  
        if ($this->temWaterMark()) {
            $this->setWaterMark($params['waterMark']);
        }
}

Opa! Ótimo Carlos, isso mesmo. Obrigado por compartilhar a solução aqui, desculpa a demora, mas felizmente você descobriu o problema. Bons estudos!