Ir para conteúdo
Fórum Script Brasil
  • 0

Objeto se subscrevendo!


Carlos Rocha

Pergunta

Olá, estou tentando fazer com que haja apenas 1 instancia do objeto da minha classe Carrinho.
Mas por mais que eu tente, não dá certo!

Classe CarrinhoDao.php

<?php

class CarrinhoDao {
  private $carrinhoProdutos = Array();
  private $cont = 0;
  private static $instancia = null;

  private function __construct() { 
  }

  public function insereProduto($_produto, $_qtde) {

      if($this->encontrou($_produto) == false) {

        $this->carrinhoProdutos[$this->cont][0] = $_produto;
        $this->carrinhoProdutos[$this->cont][1] = $_qtde;
        $this->cont++;
      }
  }

  public static function getInstancia() {
   if (is_null(CarrinhoDao::$instancia)) {
      CarrinhoDao::$instancia = new CarrinhoDao();
    }
    return CarrinhoDao::$instancia;
  }  

  private function encontrou ($_produto) {
      $encontrou = false;
      foreach ($this->carrinhoProdutos as $produto) {
          if($produto[0]->getIdProdutos() == $_produto->getIdProdutos()) {
              $encontrou = true;
              break;
          }
      }
      return $encontrou;
  }
  
  public function getCarrinho () {
      return $this->carrinhoProdutos;
  }
  
  public function removeItem ($_item) {
      unset($this->carrinhoProdutos[$_item]);
  }

  public function alteraItem ($_item, $qde) {
      $this->carrinhoProdutos[$_item][1] = $qde;
  }
}
?>

CarrinhoConteudo.php

 

<h1 class="h1Centralizado">
    Carrinho
</h1>           

<?php
 require_once "controlls/util/Conexao.php";
 require_once "controlls/models/Produtos.php";
 require_once "controlls/models/Carrinho.php";
 require_once "controlls/daos/ProdutosDao.php";
 require_once "controlls/daos/CarrinhoDao.php";
 require_once "controlls/util/PhpUtil.php";

  $connection = new Conexao();
  $conexao = $connection->abreConexao();
  $produtoDao = new ProdutosDao($conexao);
  $phpUtil = new PhpUtil();  
  
  //Verificando se a variavel de sessão foi criada
  if(!isset($_SESSION["MeuCarrinho"])) {
        $CarrinhoDaoO = CarrinhoDao::getInstancia();
        $_SESSION["MeuCarrinho"] = serialize($CarrinhoDaoO);
  }

  $CarrinhoDao = unserialize($_SESSION["MeuCarrinho"]);
  
  session_write_close();

  print "<pre>";
  print_r($CarrinhoDao->getCarrinho());
  print "</pre>";
  
?>

<?php
 if(isset($_GET["acao"]) && $_GET["acao"] == "adicionar") {
     $novoProduto = $produtoDao->pesquisaProdutoEdicao($_GET["idProduto"]);
     
     if($novoProduto != null) {         
         $CarrinhoDao->insereProduto($novoProduto, 1);
     }
     //header("Location: ?");     
 }
?>

<?php
 if(isset($_GET["acao"]) && $_GET["acao"] == "excluir") {
  $CarrinhoDao->removeItem($_GET["indice"]);
  //header("Location: ?");     
 }
?>

<?php
/*
f$CarrinhoDao->alteraItem(2, 123);
*/
$mensagem = "Deseja excluir este Produto?";
$imagem = "<img src='_img/bloquear.png' height=30px  title='Excluir Produto' />";

echo "<table style='width:800px'";
echo "  <tr>";
echo "    <th>Produto</th>";
echo "    <th>Tamanho</th>";
echo "    <th>Preço Unitário</th>";
echo "    <th>Quantidade</th>";
echo "    <th>Preço Total</th>";
echo "    <th>Remover</th>";
echo "  </tr>";

foreach ($CarrinhoDao->getCarrinho() as $k=>$produto) {
  echo "  <tr>";
  echo "    <td style='text-align:left'>".$produto[0]->getNome()."</td>";
  echo "    <td style='text-align:center'>".$produto[0]->getTamanho()."</td>";
  echo "    <td style='text-align:right'>".$phpUtil->formataMoeda($produto[0]->getPreco())."</td>";
  echo "    <td style='text-align:center'><input type='text' id='qtde' name='qtde' class='typetextpequeno' style='text-align:right' value='".$produto[1]."'></td>";
  echo "    <td style='text-align:right'>".$phpUtil->formataMoeda($produto[0]->getPreco() * $produto[1])."</td>";
  echo "    <td style='text-align:center'><a href='?acao=remove&indice=".$k."' onclick=\"return verifica('".$mensagem."')\" '>".$imagem."</a>";
  echo "  </tr>";
}

echo "</table>";

print "<pre>";
print_r($CarrinhoDao->getCarrinho());
print "</pre>";
?>

 

Página de produtos       

<h1 class="h1Centralizado">
    Listagem de Produtos
</h1>    

<?php
 require_once "controlls/util/Conexao.php";
 require_once "controlls/models/Produtos.php";
 require_once "controlls/daos/ProdutosDao.php";
 require_once "controlls/util/PhpUtil.php";

$connection = new Conexao();
$conexao = $connection->abreConexao();

$produtoDao = new ProdutosDao($conexao);
$phpUtil = new PhpUtil();

$imagemAdd = "<img src='_img/add.png' style='height:30px;'";

echo "<table style='width:800px'";
echo "  <tr>";
echo "    <th>Produto</th>";
echo "    <th>Tamanho</th>";
echo "    <th>Preço Unitário</th>";
echo "    <th>Adicionar</th>";
echo "  </tr>";

foreach ($produtoDao->pesquisaProdutos() as $k=>$produto) {
  echo "  <tr>";
  echo "    <td style='text-align:left'>".$produto->getNome()."</td>";
  echo "    <td style='text-align:center'>".$produto->getTamanho()."</td>";
  echo "    <td style='text-align:right'>".$phpUtil->formataMoeda($produto->getPreco())."</td>";
  echo "    <td style='text-align:center'><a href='carrinho.php?acao=adicionar&idProduto=".$produto->getIdProdutos()."'>".$imagemAdd."</a>";
  echo "  </tr>";
}

echo "</table>";
?>

<?php
 if(isset($_GET["acao"]) && $_GET["acao"] == "adicionar") {
  $CarrinhoDao->removeItem($_GET["indice"]);
  header("Location: ?");     
 }
?>


Tudo funciona bem, a listagem dos produtos e tudo mais. Porem, assim que adiciona um produto ao carrinho, ele é adidionado. Ao adicionar o segundo produto ao carrinho, parece que o Objeto CarrinhoDao é perdido e criado um novo.
E, nesse caso, não consigo ter 2 produtos no carrinho.

Onde estou errando?

Sim,na primeira linha de todas as páginas tem session_start();
 

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Cara, não teste seu código, e também não sou nenhum expert, mas acho que você usou o padrão Singleton nesse CarrinhoDao, certo? O método private __construir() e o getInstancia() são características desse padrão... Acho q esse padrão não se encaixa tão bem pra essa tarefa... Mas também não tenho uma resposta pra qual padrão seria o certo...

Quando ele sobrescreve o produto, ele realmente sobrescreve, ou o objeto CqrrinhoDao é sobrescrito?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...