Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

pfcneves

Formulario com checkbox obtido de array

Recommended Posts

Boas pessoal,

Estou aqui com um problema que não estou a ver como resolver...

Num trabalho da faculdade (onde só agora começamos a usar o php) foi colocado a seguinte questão que eu acho mal formulada, mas os tutores não dão resposta ao questionamento e assim continuo sem saber se a questão está bem elaborada mas eu não a estou a entender.

Enfim, a questão é a seguinte:

 

Escreva uma página HTML contendo um formulário com 10 checkboxes contendo uma lista de 10 itens e seus respectivos preços (a lista e os respectivos preços devem estar em um array, e serem lidos em tempo de execução e exibidos em uma tabela HTML). Escreva um programa PHP que receba essas informações e exiba uma listagem de todos os itens escolhidos pelo usuário, em ordem alfabética, assim como o preço total destes produtos selecionados. Neste mesmo formulário, mostre em um combo ou com radio, 2 formas de pagamento: “A vista” e “Cartão de Crédito”. Dependendo da escolha do usuário, ao clicar em um botão “Finalizar Compra” o usuário recebe uma mensagem:

a. Se a escolha for “A vista” -> “Pagamento a vista no valor de XXXX”
b. Se a escolha for “Cartão de Crédito” -> listar uma tabela com os valores das parcelas A vista, 2x, 3x, 4x e 8x.

Fazer um formulário HTML e enviar por $_POST ou $_GET para ser recebido num arquivo PHP e aí processar o resto das solicitações, ficava tranquilo, mas construir a tabela de produtos com valores adquiridos num ARRAY, já vasculhei tudo e não consegui entender como fazer.

Então resolvi fazer mesmo um formulário HTML dentro do PHP e montar a lista de produtos da seguinte forma:

<?php

$produtos=array('Arroz' => 5.00, 'Feijao' => 2.80, 'Batata' => 3.50, 'Farinha' => 5.50, 'Ovos' => 2.50, 'Tomate' => 1.90,
'Laranja' => 1.65, 'Banana' => 1.85, 'Leite' => 1.80, 'Maça' => 2.30);
 
echo "<h2>Tabela de Preços</h2>";
echo "<h3>Escolha os seus produtos</h3>";

echo "<table border='1'>\n";
echo  '<tr> <th>Nome</th> <th> Preço</th> <th>Escolha</th></tr>', "\n";
foreach ($produtos as $key => $value) {
echo "<td>$key</td><td>$value</td><td><input type='checkbox' name='checkbox[]' value='produto'></td></tr>\n";
}
echo '</table>';

echo "<input type='submit' name='botao_confirma' value='Confirmar'>";

?> 

Até aqui tranquilo, ele monta a tabela perfeitamente com os valores do ARRAY.

Agora vou necessitar de outro aquivo PHP (confirma.php) onde irei colocar algo como:

<?php

$chgeckboxes = $_POST['checkbox'];

?> 

Para receber os valores enviados através do formulário do arquivo PHP anterior... o meu problema é como faço nesse arquivo para dar a instrução de envio $_POST para o arquivo CONFIRMA.PHP ???

Se o formulário fosse feito normalmente num arquivo HTML, colocaria :

<form name="pedido" method="POST" action=”confirma.php”>; 

Mas neste caso, como fazer para enviar os dados do formulário e receber num ARRAY os dados selecionados no formulário de origem?

 

Se alguém poder dar uma luz... agradeço !!


Entretanto estudei um pouco melhor as possibilidades e alterei o primeiro código e já estou a conseguir enviar os valores

<?php

$produtos=array('Arroz' => 5.00, 'Feijao' => 2.80, 'Batata' => 3.50, 'Farinha' => 5.50, 'Ovos' => 2.50, 'Tomate' => 1.90,
'Laranja' => 1.65, 'Banana' => 1.85, 'Leite' => 1.80, 'Maça' => 2.30);
 

echo "<h2>Tabela de Preços</h2>";
echo "<h3>Escolha os seus produtos</h3>";


echo "<table border='1'>\n";
echo  '<tr> <th>Nome</th> <th> Preço</th> <th>Escolha</th></tr>', "\n";
foreach ($produtos as $key => $value) {

echo "<form name='checkbox' method='POST' action='confirma.php'><td>$key</td><td>$value</td><td>
<input type='checkbox' name='checkbox[]' value='$key $value'></td></tr>\n";
}
echo '</table>';

echo "<input type='submit' name='botao_confirma' value='Confirmar'></form>";

?>

No arquivo PHP que recebe, tenho o seguinte:

<?php

   echo "<pre>";
   print_r($_POST);
   echo "</pre>";


$chgeckboxes = $_POST['checkbox'];

echo "<table border='1'>\n";
echo  '<tr> <th>Nome</th> <th> Preço</th> </tr>', "\n";
foreach ($chgeckboxes as $key => $value) {

echo "<td>$key</td><td>$value</td></tr>\n";
}
echo '</table>';

?>

Estou a receber tudo, o problema é que só consegui enviar o nome do produto e o valor juntos, ficando ambos como value... o problema agora está a ser separar esses valores...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passe somente o índice

<input type='checkbox' name='checkbox[]' value='". $key ."'>

Após isso é só percorrer a matriz em busca do indice

$produtos=array('Arroz' => 5.00, 'Feijao' => 2.80, 'Batata' => 3.50, 'Farinha' => 5.50, 'Ovos' => 2.50, 'Tomate' => 1.90,
'Laranja' => 1.65, 'Banana' => 1.85, 'Leite' => 1.80, 'Maça' => 2.30);


if ($_POST) {
	
	foreach ($produtos as $key => $value) {
		foreach($_POST['checkbox'] as $arr) {			
			if($key == $arr){
				echo $arr . '--'. $value .'<br />';
			}			
		}	
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Williams,

Entendi a ideia, mas essa solução iria obrigar-me a copiar o array para o arquivo de confirmação para buscar os índices, certo?

E, nesse caso, cada vez que fossem alterados os valores do array original (que montam a checkbox) teria que fazer a alteração também no outro arquivo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi a ideia, mas essa solução iria obrigar-me a copiar o array para o arquivo de confirmação para buscar os índices, certo?

Não necessariamente, basta separar o array em outro arquivo, e chamar via um include, nas paginas onde vai usar. pois ele passa a ser seu Banco.

 

A partir dai, você pode guardar os índices dos produtos selecionados em um array na session ou cookie

$_SESSION['carrinho'] = array();

Dai em diante, você faz o que quiser, já que os dados não serão perdidos em um reload da pagina.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu!!!

 

Mas não tem segredo, qualquer dúvida, volte a postar que a galera te orienta.

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Viva,

Consegui resolver grande parte das questões e minimamente o que era solicitado está a funcionar...

Mas há aqui um detalhe que não estou a conseguir resolver e que provavelmente deve ser bastante simples.

 

Isto recebe o nome dos produtos, faz a aquisição dos valores (como o Williams sugeriu) e depois monta uma tabela com todos eles... é criada então um form com radio para escolher um tipo de pagamento e envia por $_POST para um arquivo onde haverá a confirmação e que esse está a funcionar direitinho.

<?php

//  echo "<pre>";
//  print_r($_POST);
//  echo "</pre>";

$produtos=array('Arroz' => 5.00, 'Feijao' => 2.80, 'Batata' => 3.50, 'Farinha' => 5.50, 'Ovos' => 2.50, 'Tomate' => 1.90, 'Laranja' => 1.65, 'Banana' => 1.85, 'Leite' => 1.80, 'Maça' => 2.30);

$chgeckboxes = $_POST['checkbox'];

echo "<h3>Lista de produtos escolhidos</h3>";

	
echo "<table border='1'>\n";
echo  '<tr> <th>Nome</th> <th> Preço</th> </tr>', "\n";

if ($_POST) {
	foreach ($produtos as $key => $value) {
		foreach($_POST['checkbox'] as $nome) {			
			if($key == $nome){
				echo "<td>$nome</td><td>$value</td></tr>\n";
			}			
		}	
	}
}

echo "<td><B>TOTAL</B></td><td><b>valor total</b></td></tr>";
echo '</table>';
echo "<br>";

echo "<table border='1'>\n";
echo  '<tr> <th>Forma de Pagamento</th> </tr>', "\n";
echo "<form name='pagamento' method='POST' action='comprovante.php'><td>
<input type=radio name=pag value='vista'> A Vista
<input type=radio name=pag value='credito'> Cartão Crédito</td></tr>
<input type=hidden name=tot value='20'"; // coloquei aqui o valor 20 só para enviar um valor, mas aqui ficará a string com a soma de todos os produtos
echo '</table>';
echo "<input type='submit' name='botao_confirma' value='Escolher'></form>";

?>

A minha grande dúvida é como coletar todos os valores que são gerados na listagem e os somar?

Se eles viessem via $_POST do arquivo com as chekboxs, estava tranquilo, mas assim, como faço para conseguir esses valores listados e os somar numa string???

 

Valeu desde já pela ajuda!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só iniciar um a variável com o valor zero e ir somando

if ($_POST) {
	$preco = 0;//New
	foreach ($produtos as $key => $value) {
		foreach($_POST['checkbox'] as $nome) {			
			if($key == $nome){
				echo "<td>$nome</td><td>$value</td></tr>\n";
				$preco = $preco + $value; //New
			}			
		}	
	}
}

echo $preco //output

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente muito simples mesmo...

Tu acreditas que consigo aprender mais aqui no fórum que nos materiais da disciplina...

 

Valeu Williams, com essa ajuda consegui fechar todas as demandas.

 

Obrigado!!!

 

Vou dar uma limpa no código e depois posto aqui como ficou...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tu acreditas que consigo aprender mais aqui no fórum que nos materiais da disciplina...

Assim como eu, você pegara a base teórica, mas é nos fóruns, manual, blogs, e sites de perguntas e respostas, que você encontrará as soluções de seus verdadeiros problemas do dia a dia, e claro, material mais atualizado.

 

E dependendo da disciplina você não vera muita coisa do PHP Moderno.

Só um detalhe, faça a concatenação dos html, assim você evita essa quantidade enorme de echo

$html = "<h3>Lista de produtos escolhidos</h3>";
 
//Concatena a partir da segunda linha	
$html .= "<table border='1'>\n";
$html .=  '<tr> <th>Nome</th> <th> Preço</th> </tr>', "\n";
 
if ($_POST) {
	foreach ($produtos as $key => $value) {
		foreach($_POST['checkbox'] as $nome) {			
			if($key == $nome){
				$html .= "<td>$nome</td><td>$value</td></tr>\n";
			}			
		}	
	}
}
 
$html .= "<td><B>TOTAL</B></td><td><b>valor total</b></td></tr>";
$html .= '</table>';
$html .= "<br>";
 
$html .= "<table border='1'>\n";
$html .=  '<tr> <th>Forma de Pagamento</th> </tr>', "\n";
$html .= "<form name='pagamento' method='POST' action='comprovante.php'><td>
<input type=radio name=pag value='vista'> A Vista
<input type=radio name=pag value='credito'> Cartão Crédito</td></tr>
<input type=hidden name=tot value='20'"; // coloquei aqui o valor 20 só para enviar um valor, mas aqui ficará a string com a soma de todos os produtos
$html .= '</table>';
$html .= "<input type='submit' name='botao_confirma' value='Escolher'></form>";

echo $html;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já agora o porque de trocar os echo pela concatenação dos HTML?

É por uma questão funcional ou porque assim o código fica mais limpo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além de deixar mais limpo, você evita chamar o construtor a cada linha.

 

E já vai se familiarizando, quando partir para OPP

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.