AndreLC Posted May 17, 2012 at 03:20 PM Report #456423 Posted May 17, 2012 at 03:20 PM (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 May 21, 2012 at 11:59 AM by AndreLC echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
taviroquai Posted May 20, 2012 at 09:09 PM Report #457031 Posted May 20, 2012 at 09:09 PM (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 May 20, 2012 at 09:11 PM by taviroquai
AndreLC Posted May 21, 2012 at 09:55 AM Author Report #457099 Posted May 21, 2012 at 09:55 AM 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.";
taviroquai Posted May 21, 2012 at 11:46 AM Report #457117 Posted May 21, 2012 at 11:46 AM 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 🙂
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now