Jump to content

Recommended Posts

Posted (edited)

Boa tarde a todos,

No Front-End, na visualização de imóveis estou a fazer uns filtros de pesquisa e necessito de ajuda.

O que estou a desenvolver está visível nesta página de teste: http://andre-lc.webuda.com/index2.php

Por defeito, a ideia inicial é quando se entra na página poder visualizar-se os imóveis ordenados por id, por ordem decrescente com limite de 3 imóveis por página e até aqui tudo bem. Posteriormente se se escolher uma opção no filtro, está a filtrar, mas quando se mexe na paginação dá problema porque volta ao select inicial. Sei que na query estou a fazer a consulta para mostrar todos os imóveis e que é daí, mas não estou a ver como interligar, pois se colocar a query de filtro retorna que a ordem, sentido e quant, não estão definidos.

1. Como corrijo a paginação para que esteja certa de acordo com o filtro que se efectuou?

À frente do Total de imóveis a ideia será visualizar o total de imóveis da query de filtragem que se faz. Pois, ao escolher por exemplo por número de quartos, aqui o total irá variar.

2. Sei que é fazer um count, mas não estou a ver onde colocá-lo, até porque só depois aplico as querys e aqui inicialmente é que queria que aparecesse o respectivo total.

O código que tenho (sem a paginação s/refresh à página para que seja mais fácil de perceber):

<?php
session_start();
if (count($_GET) == 0) {
unset($_SESSION['pesq']); // entrada na pagina pela 1 vez;
unset($_SESSION['nreg']);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Imóveis | Ver Imóveis</title>
<link rel="icon" type="image/x-icon" href="../favicon.ico" />
<link href="../css/template.css" rel="stylesheet" type="text/css" />
<link href="../css/pages.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="ajaxContent">

  <form name="filtrar" action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST">
  <label>Total de imóveis: <?php $total; ?> </label><br /><br />

  <label>N.º de Quartos: </label>
  <select name="quarto">
		<?php

			require 'config/connect.php';
			$iselCats = "SELECT * FROM quartos";
			$iqrCats  = mysql_query($iselCats);
			while ($ilinhaCat = mysql_fetch_array($iqrCats)) {
		?>
				<option value="<?php echo $ilinhaCat['designacao'];?>"><?php echo $ilinhaCat['designacao'];?></option>
		<?php
	   	 }
		?>
  </select>

  <br /><br />
  <label>Ordenar por:</label>

  <select name="ordem">
	<option value="preco">Preço</option>
	<option value="area">Área</option>´
	<option value="tipologia">Tipologia</option>
  </select>

  <select name="sentido">
	<option value="asc">Crescente</option>
	<option value="desc">Decrescente</option>
  </select>
  <br /><br />
  <label>Imóveis p/ pág: </label>
  <input type="radio" value="5"  name="quant" id="5">5
  <input type="radio" value="10" name="quant" id="10">10
  <input type="radio" value="25" name="quant" id="25">20
  <input type="radio" value="50" name="quant" id="50">50	

  <input type="hidden" name="accao" value="filtrar" />
  <input type="submit" name="button" value="Filtrar"/> <br /><br />
</form>


 <?php

//Área para visualizar os imóveis ordenados pelo id antes de filtrar

//inclusão da ligação com a BD
require("../config/connect.php");
//A quantidade de valor a ser exibida
$quantidade = 5;
//a pagina actual
$pagina	 = (isset($_GET['pagina'])) ? (int) $_GET['pagina'] : 1;
//Calcula a pagina de qual valor será exibido
$inicio	 = ($quantidade * $pagina) - $quantidade;

//$sql = "SELECT * FROM imoveis ORDER BY ID DESC LIMIT $inicio, $quantidade";
//Mostrar resultados - De 0 ate ao nr que queremos mostrar por pagina
if (!isset($_POST['accao'])) {
if (!isset($_SESSION['pesq'])) {
	$sql = "SELECT * FROM imoveis ORDER BY id DESC LIMIT $inicio, $quantidade";
} else {
	$sql = $_SESSION['pesq'] . " ORDER BY id LIMIT $inicio, $quantidade";
}

// echo $sql;
//Executa o SQL
$qr = mysql_query($sql) or die(mysql_error());
//Nr de Linhas retornado
//$total = mysql_num_rows($qr);
//Percorre os campos da tabela
while ($ln = mysql_fetch_assoc($qr)) {
	$id			 = $ln['id'];
	$id_para		= $ln['id_para'];
	$id_tipologia   = $ln['id_tipologia'];
	$id_categoria   = $ln['id_categoria'];
	$id_estado	  = $ln['id_estado'];
	$area_util	  = $ln['area_util'];
	$area_bruta	 = $ln['area_bruta'];
	$area_terreno   = $ln['area_terreno'];
	$montante	   = $ln['montante'];
	$id_distrito	= $ln['id_distrito'];
	$id_concelho	= $ln['id_concelho'];
	$id_freguesia   = $ln['id_freguesia'];
	$mini_descricao = $ln['mini_descricao'];
	$Imagem1		= $ln['Imagem1'];

	echo "<div class=\"area_reservada_pesquisa_txt1\">";

	if ($Imagem1 != "") {
		echo "<a href='ver_imoveis_maisinfo.php?id=$id' target='_self'><img width='150' height='150' src='img/Imoveis/$Imagem1' alt='' /></a>";
	} else {
		echo "<a href='ver_imoveis_maisinfo.php?id=$id' target='_self'><img width='150' height='150' src='img/Imoveis/default.png' alt='' /></a>";
	}

	echo "Tipo de Negócio: " . $negocio . "<br>";
	echo "Estado: " . $id_estado . "<br>";
	//echo "Estado: ".$id_estado."  | Tipo de Negócio: (".$negocio.")<br>";
	echo "Área útil: " . $area_util . " <label>m²</label><br>";
	echo "Área Bruta: " . $area_bruta . " <label>m²</label><br>";
	echo "Área Terreno: " . $area_terreno . " <label>m²</label><br>";
	echo "Valor: " . $montante . " <label>€</label>";
	echo "<br><br>";
	echo "<a href='ver_imoveis_maisinfo.php?id=$id' target='_self'><font color='#BC202C'>+ Mais Informação</font></a>";
	echo "</div>";

} //while
} //if accao		
?>

</div>

<!-- Área de Filtros -->
 <?php
if (isset($_POST['accao']) && $_POST['accao'] == 'filtrar') {
switch (isset($_POST['ordem'])) {
	case 'preco':
		$ordem = "ORDER BY montante ";
		break;
	case 'area':
		$ordem = "ORDER BY area_util ";
		break;
	case 'tipologia':
		$ordem = "ORDER BY id_tipologia ";
		break;
	default:
		$ordem = "ORDER BY id ";
}

switch (isset($_POST['sentido'])) {
	case 'asc':
		$sentido = "ASC ";
		break;
	case 'desc':
		$sentido = "DESC ";
		break;
	default:
		$sentido = "DESC ";
}

switch (isset($_POST['quant'])) {
	case '5':
		$quantidade = 5;
		break;
	case '10':
		$quantidade = 10;
		break;
	case '25':
		$quantidade = 25;
		break;
	case '50':
		$quantidade = 50;
		break;
	default:
		$quantidade = 5;
}


if (!empty($_POST['quarto'])) {
	$quarto = " WHERE id_quarto = '" . $_POST['quarto'] . "' ";
} else {
	$quarto = "";
}

$sql = "SELECT * FROM imoveis $quarto $ordem $sentido LIMIT $quantidade";
echo $sql;


//Executa o SQL
$qr = mysql_query($sql) or die(mysql_error());
//Nr de Linhas retornado
$total	= mysql_num_rows($qr);
//Percorre os campos da tabela
$contador = 0;
while ($ln = mysql_fetch_assoc($qr)) {
	$id			 = $ln['id'];
	$id_para		= $ln['id_para'];
	$id_tipologia   = $ln['id_tipologia'];
	$id_categoria   = $ln['id_categoria'];
	$id_estado	  = $ln['id_estado'];
	$area_util	  = $ln['area_util'];
	$area_bruta	 = $ln['area_bruta'];
	$area_terreno   = $ln['area_terreno'];
	$montante	   = $ln['montante'];
	$id_distrito	= $ln['id_distrito'];
	$id_concelho	= $ln['id_concelho'];
	$id_freguesia   = $ln['id_freguesia'];
	$mini_descricao = $ln['mini_descricao'];
	$Imagem1		= $ln['Imagem1'];

	$contador++;
	if ($contador > $quantidade)
		break;

	echo "<div class=\"area_reservada_pesquisa_txt1\">";

	if ($Imagem1 != "") {
		echo "<a href='ver_imoveis_maisinfo.php?id=$id' target='_self'><img width='150' height='150' src='img/Imoveis/$Imagem1' alt='' /></a>";
	} else {
		echo "<a href='ver_imoveis_maisinfo.php?id=$id' target='_self'><img width='150' height='150' src='img/Imoveis/default.png' alt='' /></a>";
	}

	echo "Tipo de Negócio: " . $negocio . "<br>";
	echo "Estado: " . $id_estado . "<br>";
	//echo "Estado: ".$id_estado."  | Tipo de Negócio: (".$negocio.")<br>";
	echo "Área útil: " . $area_util . " <label>m²</label><br>";
	echo "Área Bruta: " . $area_bruta . " <label>m²</label><br>";
	echo "Área Terreno: " . $area_terreno . " <label>m²</label><br>";
	echo "Valor: " . $montante . " <label>€</label>";
	echo "<br><br>";
	echo "<a href='ver_imoveis_maisinfo.php?id=$id' target='_self'><font color='#BC202C'>+ Mais Informação</font></a>";
	echo "</div>";

}
?>

<!-- Paginação -->
<div class="pesquisa_page">

<?php

/* Sei que é daqui o "problema" porque estou a mostrar todos os imóveis
Mas como interligo isto aqui?
Se colocar a query de filtro retorna que o post de ordem, sentido e quant, não estão definidos!	  
*/
$sqlTotal = "SELECT * FROM imoveis";
//echo $sqlTotal;
//Executa o SQL
$qrTotal = mysql_query($sqlTotal) or die(mysql_error());
//Total de Registos na tabela
$numTotal	= mysql_num_rows($qrTotal);
//Calculo do Total de páginas a serem exibidas
$totalPagina = ceil($numTotal / $quantidade);
//Defini o valor máximo a ser exibido na página tanto para a direita como para a esquerda
$exibir	  = 5;
//Pagina Anterior - Caso o valor seja zero, por padrão ficará o valor 1
$anterior	= (($pagina - 1) == 0) ? 1 : $pagina - 1;
//Pagina Seguinte - Caso a pagina +1 for maior ou igual ao total, terá o valor do total
//caso contrario fica com o valor da página + 1
$posterior   = (($pagina + 1) >= $totalPagina) ? $totalPagina : $pagina + 1;
//Primeira Página e Anterior

echo '<a href="?pagina=1">Primeira</a> | ';
echo "<a href=\"?pagina=$anterior\">Anterior</a> | ";

//Exibe (expande) as páginas à esquerda

for ($i = $pagina - $exibir; $i <= $pagina - 1; $i++) {
	if ($i > 0)
		echo '<a href="?pagina=' . $i . '"> ' . $i . ' </a>';
}
//Pagina actual

echo '<a href="?pagina=' . $pagina . '"><strong><font color=#BC202C>' . $pagina . '</font></strong></a>';
//Exibe (expande) as páginas à direita

for ($i = $pagina + 1; $i < $pagina + $exibir; $i++) {
	if ($i <= $totalPagina)
		echo '<a href="?pagina=' . $i . '"> ' . $i . ' </a>';
}
//Proxima e Ultima Pagina
echo " | <a href=\"?pagina=$posterior\">Seguinte</a> | ";
echo "   <a href=\"?pagina=$totalPagina\">Última</a>";

?>
</div>

</body>
</html>

Obrigado pela vossa ajuda e atenção.

Edited by AndreLC

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Posted (edited)

Sugeria que separasses os dados do layout de apresentação. Fica mais fácil entender o código. Existem outros estilos mas este para começar é o melhor...

Por exemplo... antes do index:

<?php
// Ler tudo o que seja dados da base de dados aqui
$criterio_quartos = bla bla bla...
$quarto_selecionado = $_POST['quarto'];

// Só depois de se ter os dados todos e validados, escreve-se o html...
?>
<!DOCTYPE html>
<html>
bla bla bla...
<? if (empty($criterio_quartos))  : ?>
<p>Não existem critérios para o número de quartos</p>
<? else: ?>
<select>
	<? foreach ($criterio_quartos as $quarto) { ?>
	<option value="<?=$quarto->designacao?>
	<? if ($quarto_selecionado == $quarto->designacao) : ?> selected="selected" <? endif; ?>
	><?=$quarto->designacao?></option>
 </select>
 <? endif; ?>
bla bla bla...
Edited by taviroquai
Posted

Não consegui separar muito mais sem ser essa parte dos quartos, pois se separar o resto torna-se confuso, como é relativo à paginação ou talvez seja eu que estou a fazer confusão em separar isto... Podem dar-me uma ajuda?

Obrigado.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Posted

Viva,

Para a paginação é a mesma coisa. Antes do HTML lês os registos que precisas ler (já com os filtros) e calculas logo as variáveis que usas na paginação. Depois basta colocares as variáveis e o FOR no HTML 🙂

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.