montano 0 Denunciar post Postado Setembro 12, 2009 boa noite, tenho uma classe de carrinho de compra, e esta funcionando bem,porem eu gostaria de atribuir agora o campo quantidade a minha compra, nao estou conseguindo. <?php require_once("executar.php"); class Carrinho extends Model { function __construct() { parent::__construct('localhost','root','','apul'); session_start(); if (empty($_SESSION['carrinho'])) { self::novoCarrinho(); } } function novoCarrinho() { $_SESSION['carrinho'] = array(); } function addProduto($produto) { array_push($_SESSION['carrinho'], $produto); } function delProduto($produto) { $i = array_search($produto, $_SESSION['carrinho']); unset($_SESSION['carrinho'][$i]); } function mostraCarrinho() { foreach ($_SESSION['carrinho'] as $produto) { echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>"; echo '<p>' . $produto . '</p>'; echo "<input type='hidden' name='delProduto' value='$produto'>"; echo "<input type='submit' name='botao' value='Deletar'>"; echo "</form>"; } } function gerarPedido() { foreach ($_SESSION['carrinho'] as $produto) { $this->execute("INSERT INTO tb_pedidos (session,produto) VALUES ('" . session_id() . "','" . $produto . "')"); } session_destroy(); $this->redireciona(); } } ?> No caso eu teria que criar: $_SESSION['carrinho']['produto'] = array(); $_SESSION['carrinho']['quantidade'] = array(); e dae usar do mesmo jeito nas function? Agradeço muito.. vlw Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 12, 2009 Isto mesmo. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 function existe($produto) { return array_search($produto, $_SESSION['produto']); } function jaExiste($produto) { echo "<script>alert('$produto já existe em seu carrinho.'); window.location='" . $_SERVER['PHP_SELF'] . "'</script>"; } //PRODUTO SÒ PODE CADASTRAR UMA VEZ function addProduto($produto) { if ($this->existe($produto) != 0) array_push($_SESSION['produto'], $produto); else $this->jaExiste(); } Porque isso nao funciona? Eu nao posso deichar cadastrar dois produto igual. Eu estou trabalhando com valores do array, nao teria que ser a chave dele? como eu trabalho com a 'PrimaryKEY' digamos assim de um array? valeuuu Matias, eu nao tenho que criar dois array? $_SESSIO['produto'] = array(); $_SESSION['qnt'] = array(); ou $_SESSION['carrinho']['produto'] = array(); $_SESSIO['carrinho']['qnt'] =array (); Compartilhar este post Link para o post Compartilhar em outros sites
~TiuTalk~ 7 Denunciar post Postado Setembro 12, 2009 Você pode usar a função serialize() pra isso.. Ela transforma um array em string e a unserialize() transforma a string em array. Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 nao entendi a sua colocação tiutalk, procurei no phpmanual mas nao entendi direito onde pode me ser util, pode me da uma luz? Compartilhar este post Link para o post Compartilhar em outros sites
~TiuTalk~ 7 Denunciar post Postado Setembro 12, 2009 Transforme seu array (que você deseja salvar na sessão) em string, e salve-a em uma única variável da sessão. Depois, pegue a string que está na sessão e converta em array novamente antes de trabalhar. :) Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 okay, isso para conferir se existe o produto cadastrado ? :S Eu estou com uma duvida, pois nao sei como fazer 2 coisas 1ª conferir se o produto ja existe no carrinho. 2ª Digitar a quantidade de produto depois de incluido no carrinho, e associar essa quantidade a tal produto. tipo vou ter 2 arrays, um produto e outro quantidade, ou 1 vetor de 2 lugares (se é possivel) vlw Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 12, 2009 Como eu montaria o array... $_SESSION['carrinho'][aqui_vai_o_id_do_produto]['quantidade']; $_SESSION['carrinho'][aqui_vai_o_id_do_produto]['valor']; Aí, se for incluído outro produto, imaginando que o id deste produto seja 1, você testa assim... if(isset($_SESSION['carrinho'][1]['quantidade']) { $_SESSION['carrinho'][1]['quantidade']++; } else { $_SESSION['carrinho'][1]['quantidade'] = 1; } Para pegar a chave separada depois, use um foreach... Assim foreach($_SESSION['carrinho'] as $chave => $valor) { echo 'O produto de id '.$chave.' tem a quantidade selecionada de '.$valor['quatidade'].', com o valor unitário de '.$valor['valor'].'.<br/>'; } Mais ou menos isto Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 <?php require_once ("executar.php"); class Carrinho extends Model { //Estancia MODEL, cria carrinho caso ele nao exista function __construct() { parent::__construct('localhost', 'root', '', 'apul'); session_start(); if (empty($_SESSION['carrinho'])) { self::novoCarrinho(); } } //Cria carrinho function novoCarrinho() { $_SESSION['carrinho']['produto']['qnt'] = array(); } //Verifica se existe produto no carrinho e adiciona +1 na quantidade caso exista function existe($produto) { if (isset($_SESSION['carrinho'][$produto]['quantidade'])) { $_SESSION['carrinho'][$produto]['quantidade']++; return 1; } } //PRODUTO SÒ PODE CADASTRAR UMA VEZ function addProduto($produto) { if ($this->existe($produto) == 1){ array_push($_SESSION['carrinho']['produto']['qnt'], $produto); } } function delProduto($produto) { $i = array_search($produto, $_SESSION['carrinho'][$produto]['qnt']); unset($_SESSION['carrinho'][$i]['qnt']); } function addQuantidade($produto, $qnt) { $i = array_search($produto, $_SESSION['carrinho']['produto']['qnt']); $_SESSION['carrinho']['produto'][$i] + $qnt; } function mostraCarrinho() { foreach ($_SESSION['carrinho']['produto']['qnt'] as $produto) { echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>"; echo '<p>' . $produto; echo "<input type='hidden' name='delProduto' value='$produto'>"; echo "<input type='submit' name='botao' value='Deletar'></p>"; echo "</form>"; } } function gerarPedido() { foreach ($_SESSION['carrinho']['produto']['qnt'] as $produto) { $this->execute("INSERT INTO tb_pedidos (session,produto) VALUES ('" . session_id() . "','" . $produto . "')"); } session_destroy(); $this->redireciona(); } } ?> Nao ta funcionando, ele nao identifica que o produto ja existe, nao sei se to trabalhando certo com esses array :S Esse meu codigo esta certo? Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 12, 2009 Dá uma revisada no teu código... Você está usando 2 padrões para o array... $_SESSION['carrinho']['produto']['qnt'] E $_SESSION['carrinho'][$produto]['quantidade']) Padronize. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 Agora esta funcionando, eu consigo adicionar um produto no carrinho, depois no carrinho adicionar a quantidade que eu quero e gravar no bd confirmando o pedido e destruindo a sessao. Se nao for pedir de mais voce poderia da uma ultima olhada ja que tem mais experiencia, sistema desses nao da pra dar erro. valeu Matias <?php require_once ("executar.php"); class Carrinho extends Model { function __construct() { parent::__construct('localhost', 'root', '', 'apul'); session_start(); if (empty($_SESSION['produto'])) { self::novoCarrinho(); } } function novoCarrinho() { $_SESSION['produto'] = array(); $_SESSION['qnt'] = array(); } function keyProduto($produto) { return array_search($produto, $_SESSION['produto']); } function addProduto($produto) { array_push($_SESSION['produto'], $produto); } function delProduto($produto) { $i = array_search($produto, $_SESSION['produto']); unset($_SESSION['produto'][$i]); unset($_SESSION['qnt'][$i]); } function addQuantidade($produto, $qnt) { $i = array_search($produto, $_SESSION['produto']); $_SESSION['qnt'][$i] = $qnt; } function mostraCarrinho() { foreach ($_SESSION['produto'] as $produto) { echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>"; echo "<p>". $produto; $key = $this->keyProduto($produto); echo "<input type='text' name='addQuantidade' value='" . $_SESSION['qnt'][$key] . "' size='2'>"; echo "<input type='hidden' name='delProduto' value='" . $produto . "'>"; echo "<input type='submit' name='botao' value='+'>"; echo "<input type='submit' name='botao' value='Deletar'></p>"; echo "</form>"; } } function gerarPedido() { foreach ($_SESSION['produto'] as $produto) { $key = $this->keyProduto($produto); $this->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada) VALUES ('" . session_id() . "','" . $produto . "','" . $_SESSION['qnt'][$key] . "')"); } session_destroy(); $this->redireciona(); } } ?> Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 Me surgiu uma duvida, como eu pego a Key de um array? porque eu tenho 2 problemas mas eu só preciso corrigir 1: 1ª ou eu permito que a pessoa adiciona só 1 vez o produto, (dae eu posso fazer referencia pelo nome do produto) 2ª ou eu aprendo a pegar a referencia da key do array. Porque quando eu adiciona 2 vezes Produto A e modifico a quantidade em 1 deles, ele modifica para os dois Produto A, entende? heheheh nao tem unicidade. Oque voces aconselha? Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 Ta ai , esta agora verificando se existe o produto e adiciona +1 caso exista, obrigado matias pela ajuda, codigo ta ai pra ser usado por qualquer um, sei que minhas duvidas sao de outros varios. matias caso tenho algo errado no codigo peço que poste ^^. valeuu <?php require_once ("executar.php"); class Carrinho extends Model { function __construct() { parent::__construct('localhost', 'root', '', 'apul'); session_start(); if (empty($_SESSION['produto'])) { self::novoCarrinho(); } } function novoCarrinho() { $_SESSION['produto'] = array(); $_SESSION['qnt'] = array(); } function addProduto($produto) { $key = $this->keyProduto($produto); if (empty($key)) array_push($_SESSION['produto'], $produto); else $this->addQuantidade($produto,$_SESSION['qnt'][$key] + 1); } function delProduto($produto) { $key = $this->keyProduto($produto); unset($_SESSION['produto'][$key]); unset($_SESSION['qnt'][$key]); } function addQuantidade($produto, $qnt) { $key = $this->keyProduto($produto); $_SESSION['qnt'][$key] = $qnt; } function mostraCarrinho() { foreach ($_SESSION['produto'] as $produto) { echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>"; echo "<p>". $produto; $key = $this->keyProduto($produto); echo "<input type='text' name='addQuantidade' value='" . $_SESSION['qnt'][$key] . "' size='2'>"; echo "<input type='hidden' name='delProduto' value='" . $produto . "'>"; echo "<input type='submit' name='botao' value='+'>"; echo "<input type='submit' name='botao' value='Deletar'></p>"; echo "</form>"; } } function keyProduto($produto) { return array_search($produto, $_SESSION['produto']); } function gerarPedido() { foreach ($_SESSION['produto'] as $produto) { $key = $this->keyProduto($produto); $this->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada) VALUES ('" . session_id() . "','" . $produto . "','" . $_SESSION['qnt'][$key] . "')"); } session_destroy(); $this->redireciona(); } } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 12, 2009 Eu faria diferente o array da SESSION... Como fica quando tem um produto, olha só... $_SESSION['produto'][$i] $_SESSION['qnt'][$i] Eu faria tudo em uma linha só... $_SESSION['carrinho'][$i]['quantidade'] Na parte de adicionar produto, você cria 2 métodos, um para adicionar produto, e outro para adicionar quantidade... Daria para fazer tudo em um só (utilizando o formato de session que eu coloquei) function addProduto($produto,$qtde) { if(isset($_SESSION['carrinho'][$produto]['qtde'])) { $_SESSION['carrinho'][$produto]['qtde'] += $qtde; } else { $_SESSION['carrinho'][$produto]['qtde'] = $qtde; } } Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 Tem um erro que ta ocorrendo só, é que o primeiro produto cadastrado na session ele nao acha depois para conferir se ja existe, isso acontece só com o 1ª produto adicionado :S Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 12, 2009 Posta aí como está o seu código agora... Estava pensando aqui e tem um jeito melhor... Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 12, 2009 <?php include ('config/config.php'); require_once ('model/executar.php'); class Carrinho extends Executar { function __construct($servidor, $usuario, $senha, $bd) { parent::__construct($servidor, $ususario, $senha, $bd); session_start(); if (empty($_SESSION['produto'])) { self::novoCarrinho(); } } function novoCarrinho() { $_SESSION['produto'] = array(); $_SESSION['qnt'] = array(); } function addProduto($produto) { $key = $this->keyProduto($produto); if (empty($key)) array_push($_SESSION['produto'], $produto); else $this->addQuantidade($produto, $_SESSION['qnt'][$key] + 1); } function delProduto($produto) { $key = $this->keyProduto($produto); unset($_SESSION['produto'][$key]); unset($_SESSION['qnt'][$key]); } function addQuantidade($produto, $qnt) { $key = $this->keyProduto($produto); $_SESSION['qnt'][$key] = $qnt; } function mostraCarrinho() { echo '<table>'; echo '<tr><td>Produto</td><td>Quantidade</td><td>Estatus</td></tr>'; foreach ($_SESSION['produto'] as $produto) { echo '<tr>'; echo "<form method='POST' action='?menu=produtos'>"; echo "<td>" . $produto . '</td>'; $key = $this->keyProduto($produto); echo "<td><input type='text' name='addQuantidade' value='" . $_SESSION['qnt'][$key] . "' size='3'></td>"; echo '<td></td>'; echo "<input type='hidden' name='delProduto' value='" . $produto . "'>"; echo "<td><input type='submit' name='botao' value='+'></td>"; echo "<td><input type='submit' name='botao' value='Deletar'></td>"; echo "</form>"; echo '</tr>'; } echo '</table>'; } function keyProduto($produto) { return array_search($produto, $_SESSION['produto']); } function gerarPedido() { foreach ($_SESSION['produto'] as $produto) { $key = $this->keyProduto($produto); $this->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada) VALUES ('" . session_id() . "','" . $produto . "','" . $_SESSION['qnt'][$key] . "')"); } session_destroy(); $this->redireciona(); } } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 12, 2009 Olha, dei uma arrumada... Dá uma olhada aí... <?php class Carrinho { function __construct() { session_start(); if (empty($_SESSION['carrinho'])) { $this->novoCarrinho(); } } function novoCarrinho() { $_SESSION['carrinho'] = array(); } function addProduto($produto, $qtde) { if (isset($_SESSION['carrinho'][$produto])) $_SESSION['carrinho'][$produto] += $qtde; else $_SESSION['carrinho'][$produto] = $qtde; } function delProduto($produto) { unset($_SESSION['carrinho'][$produto]); } function mostraCarrinho() { echo '<table>'; echo '<tr><td>Produto</td><td>Quantidade</td><td>Estatus</td></tr>'; foreach ($_SESSION['carrinho'] as $produto => $qtde) { echo '<tr>'; echo "<form method='POST' action='?menu=produtos'>"; echo "<td>" . $produto . '</td>'; echo "<td><input type='text' name='addQuantidade' value='" . $qtde . "' size='3'></td>"; echo '<td></td>'; echo "<input type='hidden' name='delProduto' value='" . $produto . "'>"; echo "<td><input type='submit' name='botao' value='+'></td>"; echo "<td><input type='submit' name='botao' value='Deletar'></td>"; echo "</form>"; echo '</tr>'; } echo '</table>'; } function gerarPedido() { require_once ('model/executar.php'); $model = new Executar($servidor, $usuario, $senha, $bd); foreach ($_SESSION['carrinho'] as $produto => $qtde) { $model->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada) VALUES ('" . session_id() . "','" . $produto . "','" . $qtde . "')"); } session_destroy(); $this->redireciona(); } } ?> Olha só... Não precisa iniciar a conexão com o banco de dados toda vez que iniciar a classe... Nem precisa estender a classe... Apenas use-a quando precisar, ou seja, somente quando gerar pedido. Outra coisa... Dá uma olhada na função __autoload... http://br2.php.net/__autoload Também sugiro que dê uma olhada na série de tutoriais do hinom sobre MVC. http://forum.imasters.com.br/index.php?/topic/362243-mvc-em-php-tutorial-pratico/ Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
montano 0 Denunciar post Postado Setembro 13, 2009 Não testei o script ainda, mas entendi oque você quis dizer, achei interessante a sua dica de só conectar o BD caso gere o pedido, faz sentido e eu acho que vai diminuir o tempo de carregamento da pagina. Obrigado pelas dicas. vlw Compartilhar este post Link para o post Compartilhar em outros sites