Ir para conteúdo

POWERED BY:

Arquivado

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

narizgudo

Classe para paginção

Recommended Posts

/* AGORA COM VISIBILIDADE */

 

/* NÃO DEPENDE DA CLASSE DE GERENCIAMENTO DO DB */

 

/* ADIDIONADA A VARIAVEL $EXTRA */

 

/* ATUALIZADA 12/08/2008 */

 

Ae, fiz uma classe para paginação de resultados, bem simples de usar e não exibe nenhum estilo pre-definido, assim fica facil adaptar a qualquer site.

 

comentem! COMENTEM!

 

A classe:

<?
class paginacao {
	/**
	 * Classe de gerenciamento do banco de dados
	 *
	 * @var object
	 */
	protected $db;

	/**
	 * Resultados por página
	 *
	 * @var int
	 */
	public $rpp = 10;

	/**
	 * Comando SQL para pesquisar os resultados
	 *
	 * @var string
	 */
	public $sql = false;

	/**
	 * Variável com os dados finais
	 *
	 * @var array
	 */
	public $fim = array();
	
	/**
	 * Variável com total de páginas extras além da atual
	 *
	 * @var int
	 */
	public $extra = 3;

	public function __construct() {
		global $db; // pega a variável $db do escopo global
		$this->db = $db; // guarda a variável $db na variável $this->db
	}

	public function montaPaginacao() {
		if (!$this->sql) return false; // interrompe a execução se não tiver nenhuma query
		$this->sql = preg_replace("'LIMIT.*'","",$this->sql); // retira o LIMIT da query case tenha
		$pagina = (isset($_GET['p'])) ? intval($_GET['p']) : 1; // pega a página da URL ou define como a primeria página
		
		$total = $this->db->sql_query($this->sql); // envia query
		$total = $this->db->sql_numrows($total); // pega o total de resultados
		$this->fim['mostrando'] = array($pagina*$this->rpp-$this->rpp+1,(($total < $pagina*$this->rpp) ? $total : $pagina*$this->rpp));
		$this->fim['totalresultados'] = $total; // Total de resultados no banco de dados
		$total = ceil($total/$this->rpp); // pega o total de páginas
		$this->fim['paginaatual'] = $pagina; // Página atual
		$this->fim['totalpaginas'] = $total; // Total de páginas
		
		$limite = $pagina*$this->rpp-$this->rpp.",".$this->rpp; // define o limite de pesquisa
		$this->sql .= " LIMIT $limite"; // coloca o LIMIT na query
		$q = $this->db->sql_query($this->sql); // envia query
		if ($this->db->sql_numrows($q) > 0) { // verifica se existe algum resultado
			$this->fim['status'] = 'ok'; // coloca o status da pesquisa como ok
			
			while ($linha = $this->db->sql_fetchrow($q)) $this->fim['resultados'][] = $linha; // coloca os valores da pesquia na variável fim
			$min = $pagina-$this->extra; // coloca as 3 páginas anteriores
			while ($min <= 0) $min++; // tira valores negativos e 0 das páginas anteriores
			$max = $pagina+$this->extra; // coloca as 3 próximas páginas
			while ($max > $total) $max--; // tira os valores que passam do total de páginas
			
			if ($pagina > 1) { // se nao for a primeira página
				$this->fim['paginas'][] = array('n' => 1, 't' => '<<'); // coloca o indicador da primeira página
				$this->fim['paginas'][] = array('n' => $pagina-1, 't' => '<'); // coloca o indicador da página anterior
				for ($x=$min;$x<$pagina;$x++) $this->fim['paginas'][] = array('n' => $x, 't' => $x); // coloca as 3 páginas anteriores
			}
			
			$this->fim['paginas'][] = array('n' => $pagina, 't' => 'atual'); // coloca a página final
			
			if ($pagina < $total) { // se nao for a ultima
				for ($x=$pagina+1;$x<=$max;$x++) $this->fim['paginas'][] = array('n' => $x, 't' => $x); // coloca o indicador da ultima página
				$this->fim['paginas'][] = array('n' => $pagina+1, 't' => '>'); // coloca o indicador da próxima página
				$this->fim['paginas'][] = array('n' => $total, 't' => '>>'); // coloca as 3 próximas páginas
			}
		} else {
			$this->fim['status'] = 'sr'; // retorna sr se não tiver resultados
		}
		return $this->fim; // retorna os valores da consulta
	}
}

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que você está usando __construct() (construtor para PHP 5), use visibilidade (public, private e protected) nos métodos e propriedades de classe, em vez de var.

 

http://www.php.net/manual/pt_BR/language.oop5.visibility.php

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

É pq você não instaciou a classe.

 

antes da linha

$pg->sql = "SELECT * FROM tabela WHERE campo = '0' ORDER BY data DESC"; // query sql a ser executada

coloca

$pg = new paginacao();

 

ficando assim

 

$pg = new paginacao();

$pg->sql = "SELECT * FROM tabela WHERE campo = '0' ORDER BY data DESC"; // query sql a ser executada

...

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Noite a Todos,

 

Gente sou iniciante com PHP, atualmente utilizo uma classe desenvolvida por um membro da comunidade"Fabyo". Gostaria de saber como posso aplicar o seu sistema de paginação junto a classe de conexão feita por ele!

 

<table width="100%" class="altera_usuario">
	<tr>
		<td class="t">ID</td>
		<td class="t">Nome</td>
		<td class="t">E-mail</td>
		<td class="t">Celular</td>
		<td class="t">Usuário</td>
		<td class="t">Entidade</td>
		<td class="t">Status</td>
		<td class="t">Ação</td>
	</tr>
<?php
$classe =& Singleton::factory( "Conexao" );
$re = $classe->Executar("SELECT * FROM usuarios");
while ($exibe = $re->fetch_array(MYSQLI_ASSOC)) {
	echo "
	<tr>
		<td class='c'>" . $exibe["id_usuario"] . "</td>
		<td class='c'>" . $exibe["nome"] . " " . $exibe["sobrenome"] . "</td>
		<td class='c'>" . $exibe["email"] . "</td>
		<td class='c'>" . $exibe["celular"] . "</td>
		<td class='c'>" . $exibe["usuario"] . "</td>
		<td class='c'>" . $exibe["entidade"] . "</td>
		<td class='c'>" . $exibe["status"] . "</td>
		<td class='c'><a href='?secury=usuarios&op=A&us=" . $exibe["id_usuario"] . "' title='Alterar Usuário'>Alterar</a></td>
	</tr>
	";
}

$classe->Fechar();
?>
</table>

Queria incluir a paginação nesse script, se alguém puder me ajudar eu agradeço!

 

Abraços!

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.