<?php /* A classe navbar de Copyright Joao Prado Maia (jpm@phpbrasil.com) e tradu��o de Thomas Gonzalez Miranda (thomasgm@hotmail.com) baixada do site www.phpbrasil.com em 06/05/2002 foi modificada para melhor entendimento do seu funcionamento e aperfei�oada deste que apareceram alguns "bugs", sendo transformada como classe Mult_Pag (Multiplas paginas). As informa��es acima foram retiradas da vers�o 1.3 da classe navbar do arquivo navbar.zip. Adapta��o realizada por Marco A. D. Freitas (madf@splicenet.com.br) entre 06 e 09/05/2002. Altera��es realizadas por Gustavo Villa (php@sitework.com.br) entre em 30/01/2004, com a inser��o da funcionalidade de n�o exibir o menu de navega��o caso seja necess�ria apenas 1 p�gina e permitir o acesso � quantidade total de p�ginas ********************************************************************************************** Altera��es abaixo realizadas por Lauro A L Brito (lab.design@globo.com) inserindo a funcionalidade de acesso no retorno porque: image ter 90 p�ginas de registros contendo cada p�gina 20 registros. O avan�o tudo bem, ele fazia com que o primeiro link fosse o �ltimo + 1 mas o retorno ja complicava porque se tive na pagina 80 por exemplo, teria que clicar 79 vezes para voltar � primeira p�gina, portanto dessa forma, o link anterior retorna o n�mero de posi��es informadas no $max_links e portanto estando o usuario na pagina 80, e o $max_links fosse definido como 10, bastaria 8 clicks que j� estaria na primeira p�gina novamente. Claro que cada um tem uma vis�o e uma solu��o diferente. dessa forma a estrutura ficou assim: anterior 1 2 3 4 5 6 7 8 9 10 pr�xima onde: anterior n�o tem link e proxima aponta para a p�gina 11 anterior 11 12 13 14 15 16 17 18 19 20 pr�xima onde: anterior aponta para pagina 10 e proxima aponta para 21 Outro detalhe: Eu embuti algumas variaveis para facilitar o uso dessa class: $max_links que antes deveria ser passada da chamada onde foi incluida a class Tudo que precisa ser feito agora �: Na pagina de inclus�o: $conn = mysql_connect($host,$userDB, $pwdDB); // cria a conex�o com o mysql mysql_select_db($dataBase); // seleciona a base de dados require 'navbar.php'; // inclui o class $mult_pag =new Mult_Pag(); // cria o objeto class $mult_pag->num_pesq_pag=18; // define o m�ximo de registros por pagina $mult_pag->max_links=10; // define o m�ximo de links a mostrar na barra de navega��o // cria a sql para a pesquisa no banco de dados $sql="select distinct(cnpj), empresa, contato from pf_pedidos where dst={$_SESSION['dst']} order by empresa"; // chama o class para acessar a base de dados $rsQuery=$mult_pag->executar($sql, $conn,"otimizada","mysql") or die("erro $sql" . mysql_error()); // numRegs informa o total de registros lidos ou 0 se n�o achou $numRegs=mysql_numrows($rsQuery); if($numRegs==0) { echo "<p align=center>Nenhum registro localizado !</p>"; exit; } $counter = 0; while ($counter < $numRegs) { $result=mysql_fetch_object($rsQuery); $empresa=substr($result->empresa, 0, 50); // cria a linha para envio pra tela } // fecha o loop while // acrescente essa linha no final da p�gina para mostrar a barra de navega��o <? $links = $mult_pag->Construir_Links(); ?> *********************************************************************************************** Construi esta pequena classe para navega��o din�mica de links. Observe por favor a simplicidade deste c�digo. Este c�digo � livre em toda maneira que voc� puder imaginar. Se voc� o usar em seu pr�prio script, por favor deixe os cr�ditos como est�o. Tamb�m, envie-me um e-mail se voc� o fizer, isto me deixa feliz :-) */ // classe que multiplica paginas class Mult_Pag { // Valores padr�o para a navega��o dos links var $max_links; // m�ximo de registro por pagina var $num_pesq_pag; // m�ximo de registro por pagina var $str_anterior = "<<"; var $str_proxima = ">>"; // Vari�veis usadas internamente var $nome_arq; // nome da url var $total_reg; // total de registros na pesquisa var $pagina; // p�gina atual var $qtd_paginas; var $exibir_menu; /* Metodo construtor. Isto � somente usado para setar o n�mero atual de colunas e outros m�todos que podem ser re-usados mais tarde. */ function Mult_Pag () { global $pagina; $this->pagina = $pagina ? $pagina : 1; } /* O pr�ximo m�todo roda o que � necess�rio para as queries. � preciso rod�-lo para que ele pegue o total de colunas retornadas, e em segundo para pegar o total de links limitados. $sql par�metro: . o par�metro atual da query que ser� executada $conexao par�metro: . a liga��o da conex�o do banco de dados $tipo par�metro: . "mysql" - usa fun��es php mysql . "pgsql" - usa fun��es pgsql php */ function Executar($sql, $conexao, $velocidade, $tipo) { // variavel para o inicio das pesquisas if ($this->pagina==0) $inicio_pesq = $this->pagina * $this->num_pesq_pag; else $inicio_pesq = ($this->pagina -1) * $this->num_pesq_pag; if ($velocidade == "otimizada") { $total_sql = preg_replace("/SELECT (.*?) FROM /sei", "'SELECT COUNT(*) FROM '", $sql); } else { $total_sql = $sql; } // tipo da pesquisa if ($tipo == "mysql") { $resultado = mysql_query($total_sql, $conexao); $this->total_reg = mysql_result($resultado, 0, 0); // total de registros da pesquisa inteira $sql .= " LIMIT $inicio_pesq , $this->num_pesq_pag"; $resultado = mysql_query($sql, $conexao); // pesquisa com limites por pagina } elseif ($tipo == "pgsql") { $resultado = pg_Exec($conexao, $total_sql); $this->total_reg = pg_Result($resultado, 0, 0); // total de registros da pesquisa inteira $sql .= " LIMIT $this->num_pesq_pag, $comeco"; $resultado = pg_Exec($conexao, $sql); // pesquisa com limites por pagina } return $resultado; } /* Este m�todo cria uma string que ir� ser adicionada � url dos links de navega��o. Isto � especialmente importante para criar links din�micos, ent�o se voc� quiser adicionar op��es adicionais � estas queries, a classe de navega��o ir� adicionar automaticamente aos links de navega��o din�micos. */ function Construir_Url() { global $REQUEST_URI, $REQUEST_METHOD, $HTTP_GET_VARS, $HTTP_POST_VARS; // separa o link em 2 strings @list($this->nome_arq, $voided) = @explode("?", $REQUEST_URI); if ($REQUEST_METHOD == "GET") $cgi = $HTTP_GET_VARS; else $cgi = $HTTP_POST_VARS; reset($cgi); // posiciona no inicio do array // separa a coluna com o seu respectivo valor while (list($chave, $valor) = each($cgi)) if ($chave != "pagina") $query_string .= "&" . $chave . "=" . $valor; return $query_string; } /* Este m�todo cria uma liga��o de todos os links da barra de navega��o. Isto � �til, pois � totalmente independete do layout ou design da p�gina. Este m�todo retorna a liga��o dos links chamados no script php, sendo assim, voc� pode criar links de navega��o com o conte�do atual da p�gina. $opcao par�metro: . "todos" - retorna todos os links de navega��o . "numeracao" - retorna apenas p�ginas com links numerados . "strings" - retornar somente os links 'Pr�xima' e/ou 'Anterior' $mostra_string par�metro: . "nao" - mostra 'Pr�xima' ou 'Anterior' apenas quando for necess�rios . "sim" - mostra 'Pr�xima' ou 'Anterior' de qualqur maneira */ function Construir_Links() { $extra_vars = $this->Construir_Url(); $num_mult_pag = ceil($this->total_reg / $this->num_pesq_pag); // numero de multiplas paginas $inicio = floor(($this->pagina-1) / $this->max_links) * $this->max_links; $lnk=$inicio - $this->max_links+1; // deve apontar para o primeiro elemento no link menos total de links if ($lnk > 0) $array[0] = "<a href='{$this->nome_arq}?pagina=$lnk$extra_vars'>"; $array[0] .= "{$this->str_anterior}</a>"; if ($num_mult_pag <= $this->max_links) $max=$num_mult_pag; elseif ($inicio + $this->max_links > $num_mult_pag) $max=($inicio + $this->max_links) - $num_mult_pag; else $max=$this->max_links; for ($atual=1; $atual <= $max; $atual++) { // escreve a numeracao (1 2 3 ...) $lnk=$inicio + $atual; if ($lnk!=$this->pagina) $array[$atual]= "<a href='{$this->nome_arq}?pagina=$lnk$extra_vars'>"; $array[$atual] .= "$lnk</a>"; } // o valor de $atual deve apontar para a proxima posi��o ou seja max_links +1 // escreve a string direita (Proxima Pagina) se tiver pr�xima p�gina $lnk++; if ($lnk < $num_mult_pag-1) $array[$atual] = "<a href='{$this->nome_arq}?pagina=$lnk$extra_vars'>{$this->str_proxima}</a>"; else $array[$atual] = $this->str_proxima; $this->qtd_paginas = count($array); // Faz a contagem da quantidade de p�ginas que ser�o utilizadas if ($this->qtd_paginas != 3) { // Caso a quantidade de p�ginas seja 1, o menu de navega��o n�o � exibido for ($n = 0; $n < $this->qtd_paginas; $n++) { echo $array[$n] . " "; } echo " [$num_mult_pag pgs.]"; } else $this->exibir_menu = false; } } // fim da class ?>