E ae?
Vamos ver um exemplo simples de como calcular automaticamente o valor total dos itens em um formulário.
A idéia: O cálculo é realizado em tempo real conforme o usuário informa a quantidade de determinados itens, cada item/produto terá o valor em um índice do array no PHP.
Em princípio, o array possui valores fixos, no entanto, partimos da idéia de que esse array seja resultante de uma consulta no banco.
Utilizaremos jQuery e PHP para realizar o cálculo.
Vamos começar pelo bom e velho HTML contendo o formulário com os supostos códigos dos produtos.
<form name="produto" id="produto"> <label>Produto 1:</label> <input type="text" name="produto_1" id="produto_1" /> <label>Produto 2:</label> <input type="text" name="produto_2" id="produto_2" /> <label>Produto 3:</label> <input type="text" name="produto_3" id="produto_3" /> <label>Produto 4:</label> <input type="text" name="produto_4" id="produto_4" /> <label>Produto 5:</label> <input type="text" name="produto_5" id="produto_5" /> <label>Produto N:</label> <input type="text" name="produto_n" id="produto_n" /> <label>Valor Total:</label> <span id="total"></span> <input type="hidden" name="total_compra" id="total_compra" /> </form>
Perceba que o elementos possuem NAME e ID com os supostos nomes ou códigos dos produtos, o negócio está aí!
Os nomes utilizados em name e id devem corresponder aos indíces do array que veremos a seguir.
Temos também um campo hidden que armazena o valor total para utilizarmos ao submetermos o formulário.
Vamos ver agora como monitorar os campos com o método .bind() do jQuery e enviar ao PHP os valores contidos em cada campo do formulário.
Chamei o arquivo Javascript de calculo.js, vejamos:
$(document).ready(function(){
// monitorando o evento change dos campos
$('#produto input').bind('change',function(){
// enviando os valores atuais dos campos ao PHP
$.post('calculo.php',{
// serializando o formulario
dataForm: $("#produto").serialize()
},
function(data){
// obtendo o retorno do PHP / atualizando o valor
$('#total').html(data)
// informando o total ao campo hidden
// sera utilizado ao submeter o form
$('#total_compra').val(data)
})
})
// realiza o calculo no inicio ou após um refresh
$.post('calculo.php',{
dataForm: $("#produto").serialize()
},
function(data){
$('#total').html(data)
$('#total_compra').val(data)
})
})
Acredito que os comentários no código bastam, mas…
O evento $(document).ready(function(){ //code }) é como o velho window.onload, ou seja, irá realizar os precidementos contidos dentro do block ao carregar o documento.
Dentro desse bloco nós utilizamos o $(‘#produto input’).bind(‘change’,function(){ //code }) para monitorar o evento change dos campos, ou seja, a cada vez que o campo tiver seu valor alterado as ações contidas no monitoramente serão realizadas, nesse caso a ação é realizada por:
$.post(‘calculo.php’,{//post vars },function(data){ //code })
Esse cara, o $.post é quem envia por post os dados para o PHP, passamos à ele a var dataForm contendo os dados serializados do formulário através de $(“#produto”).serialize(), esse pega todos os valores dos campos existentes no formulário de ID produto e serializa passando à var dataForm que por sua vez é enviada ao PHP.
Sei que ficou um pouco redundante mas as vezes a redundancia fixa o raciocínio (nem acredito que eu disse isso, mas também olha a hora).
Após enviar os dados via post o retorno é armazenado na var data que está em function(data) e esse valor nada mais é que o cálculo dos campos retornados do PHP, apenas isso.
E porque aparecem 2 vezes o bloco abaixo?
$.post('calculo.php',{
dataForm: $("#produto").serialize()},
function(data){
$('#total').html(data)
$('#total_compra').val(data)
})
Eu explico, claro!
Acontece que o primeiro bloco está dentro do .bind() e irá acontecer apenas se algum campo tiver seu valor alterado.
O segundo ocorre na inicialização para realizar o primeiro cálculo que retornará 0(zero), mas isso também está aí porque se o usuário der um refresh na tela depois de ter alterado algum campo o valor que aparece no total irá desaparecer, isso porque o valor está em um elemento span, no entanto o mesmo valor está contido em um campo oculto, campo do tipo hidden que deve ser utilizado para recuperar o valor total dos itens ao submetermos o formulário.
Quando ocorre o $(‘#total’).html(data) o valor está sendo passado ao elemento span apenas para visualização do usuário, não poderia ser um campo input text para que o usuário não alterasse o valor total. :0
No entanto, após setar o valor do elemento span é chamado também o $(‘#total_compra’).val(data) que guarda o valor no campo oculto.
Tá legal, vamos ver como o cálculo realmente é feito, até agora só vimos como enviar e recuperar o valor mas como é realizada a soma, ainda não.
E chegou a vez do PHP mostrar sua arte também, ué!
Chamei o arquivo PHP de calculo.php
<?php
// Indices e valores dos produtos
$valor = array(
'produto_1' => 20,
'produto_2' => 10.50,
'produto_3' => 15,
'produto_4' => 30,
'produto_5' => 20,
'produto_n' => 2.50
);
// valor total inicial = 0
$total = 0;
// passando os dados do form para um array
$params = array();
parse_str($_POST['dataForm'], $params);
// calculando o valor dos produtos e somando ao total
foreach($params as $item => $value)
{
if(isset($valor[$item]) && !empty($item))
$total += $valor[$item] * $value;
}
// retornando o total calculado e formatado BRL
echo number_format($total,2, ',', '.');
?>
Como está comentado no código, o array de nome $valor contém em seus índices os códigos dos itens (que devem ser iguais ao do formulário para que ocorra o cálculo correto) e também os valores dos mesmos.
Seria assim:
o produto_1 custa 20 rúpias.
Importante: os valores devem ser separados por ponto(.) e não vírgula(,) para que o cálculo ocorre corretamente, não se esqueça disso para não ficar sofrendo aí.
obs: E eu escrevo como se alguém fosse utilizar mesmo o código kas kas kas kas.
Enfim,
A linha parse_str($_POST['dataForm'], $params); passa para um array os valores recebidos do jQuery através do dataForm: $(“#produto”).serialize(), lembra né? blz!
Após passar para o array $params realizamos a verificação if(isset($valor[$item]) && !empty($item)), ou seja, verificamos se existe no array $valor o índice contido em $params.
No foreach nos percorremos todos os índices de $params que nada mais é que os campos do form e verificamos se existe aquele índice no array $valor.
Para fixar a idéia:
$param são os campos do formulário e $valor é o array que contém os índices de mesmo nome que os campos do form, então:
$params['produto_1'] = valor['produto_1']
E a partir disso vamos somando/multiplicando ao $total como a linha:
$total += $valor[$item] * $value;
Essa linha diz o seguinte:
$total += $valor['produto_1'] * $quantidade_digitada_no_produto_1
O echo retorna o jQuery o total calculado, no jQuery é retornado esse valor em function(data), lembra né? blz!
Obs: o valor só atualizado quando o campo é alterado e isso implica em você “sair” daquele campo, mudar de o focu do cursor!
Bom, fica aí a demo para você curtir: demo | fontes
Links:
jQuery $.post
PHP parse_str
PHP numer_format
Abraços e até logo++,
Seria de grande proveito, se eu soubesse php, hahahah, eh nois irmao.
Hahaha é só trocar o calculo.php por calculo.aspx só tem 4 linhas mesmo hehehehe.
Abs irmão, até mais.
Me diz uma coisa se eu tiver um formulario maior, onde eu some várias linhas, eu mudo a quantidade de arrays?
Eu sou noob em php e estou apanhando justamente nisso
Darlan, exatamente isso!
Se você adicionar no formulario o produto_x você precisa adicionar no array.
Ex:
No array:
‘produto_x’ => 10.50
Em outra oportunidade farei esse exemplo com BD ao invés de Array.
Abs
Bom dia Rafael, eu acho que me expressei errado, é que eu estou com um problemão aqui que é este aqui http://www.anuskaconfeccoes.com.br/pedido_representantes.php e queria saber se com o script que vc montou daria para fazer isso ou eu teria que alterar muito.
Rapaz, a resposta é a mesma!
Sim o script faz isso, você precisa adicionar mais indices no array (nomes e valores).
Os indíces devem possuir os nomes dos campos do formulário, como no exemplo do post.
Vlw, vc é fera mesmo, eu vou tentar aqui e postarei o resultado, vou deixar de ser um noob hehehehe, muito o brigado mesmo por responder
Se eu quiser que o usuário mesmo digite o valor do produto como que faço?
Terá que adicionar o campo valor e receber esse valor do campo no array onde originalmente estão os valores.
Você terá que criar um array a partir dos campos com os valores dos produtos.;
array ( ‘produto_1_valor’ => $_POST['produto_1_valor'])
supondo que produto_1_valor é o campo que adicionou no formulário para inserção do valor e o array criado no local do array que contém os preços fixos.
E no caso de funcionar como select ao invés do input, como seria? Por exemplo eu vi que passar os dados pelo input, só que eu precisaria jogar por seleção no caso de vários produtos, tentei mudar a parte input por select mais não tive resultado. Eu vi que funciona bem até com o radiobuton, mais o selection tem ao invés de input option e aí não adiciona o valor. Agradeço por uma sugestão e parabéns pelo script. meu email: hospdesigner@gmail.com
Helder, nesse caso você pode criar o select normalmente, acontece que o nome/id do select deve estar contido também no calculo.php que possui os nomes dos campos!
Olá Rafel obrigado pela resposta amigo, mais me perdi aqui porque por exemplo, estou usando está função não para contar por quantidade e sim por produto.
Neste caso meu código ficou assim.
http://vargasinformatica.com.br/monte-seu-pc/ Está sem layout sem nada só para amostra. Só que por exemplo isso é para amostra em um pc e não acesso a todos na net. Só que com o select ficaria menor a página devido a quantidade de produto a escolher.
No meu caso ficou assim.
$valor = array(
‘Monitor_20_sansung’ => 650.00,
‘Monitor_18_sansung’ => 590.00,
‘Monitor_15_sansung’ => 520.00,
‘Processador_intel_dual_core’ => 325.00,
‘Processador_intel_quad_core’ => 420.00,
‘Impressora_hp_multfuncional_fax’ => 350.00
);
Só que com o select que eu usei assim.
Escolha o Monitor
Monitor Sansung 20″
Monitor Sansung 18″
Monitor Sansung 15″
Ele não contabiliza. O que vi é que ele pega tudo que vem do input, só que não consegui pelo select.
Eu coloquei o nome e id do select como produto que é o mesmo nome do form. Só que não entendi a parte de incluir no array acima, como ficaria, poderia me mandar pelo menos uma amostra, usando os dados acima.
Fico grato pela ajuda.
Att
Helder Smith
01 = O select não pegou aqui, estou tentando colocar novamente:
02 =
03 = Escolha o Monitor
04 = Monitor Sansung 20″
06 = Monitor Sansung 18″
08 = Monitor Sansung 15″
10 =
vamos ver se agora aparece.
aguardo…
Acho que só tirando algumas tags, apague os comentários que não deram certo o select por favor.
select name=”produto” class=”VariationSelect” id=”produto” style=”width: 246;height:22″
option value=”">Escolha o MonitorMonitor Sansung 20″Monitor Sansung 18″Monitor Sansung 15″</option
select
Então cara, mas se você não setar os “value” do option não vai aparecer nada mesmo mesmo
option value=”produto X”
option value=”produto Y”
Testa ai com value no option pra ver
Gostaria de Agradecer ao grande amigo Rafael Clares, pela ajuda na modificação do script em questão. Parabéns pelo blog. Continue assim. Obrigado mesmo.
Olá Rafael gostei de seus posts.. sou um pouco leiga no assunto estou aprendendo agora… adorei esse exemplo.. mais estou com a mesma dúvida do colega acima.. o usuário deverá digitar o preço do produto, no caso é somente um produto .. só que não estou conseguindo “pegar” o valor digitado pelo usuário =/..
Veja meu código
Quantidade de Plantas:
Valor Muda (Unidade):
…..
calculo.php
$preco = $_POST['preco']; //o post não tem nadaa =/
$valor = array(
‘quantidade’ => $preco,
);
Obrigada
Aline, me mande o código em rafadinix@gmail.com para eu ver como está.
Tente explicar no e-mail o que deveria acontencer.
Ah, não respondo dúvidas por email, nem os abro. Apenas envie o código para eu ver ok
Até logo,
Rafael obrigada pela ajuda.. Já mandei o código modificado no seu email…
de como “deveria acontecer”.
O raciocínio é simples mais não consigo fazer…
No seu exemplo definimos o preço do produto no próprio código.
Ex: ‘produto_1′ => 3, (três seria o valor que vou atribuir ao preço do produto_1)
Gostaria de ao invés de atribuir um valor fixo para o produto_1 que eu atribuísse o valor digitado pelo usuário na na input preco.
Obrigada pela ajuda!
Rafael era exatamente isso!
Obrigada pela ajuda! TCC salvo por você nos 45 min do segundo tempo!
=)