← Desenvolvimento

Paginação, how to..

Lida 7502 vezes

Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

É assim, eu tenho uma paginação, com anterior e próximo e tal..mas eu queria acrescentar uma função ou algo que quando as páginas fossem superiores a 5 ele troca-se o que aparece..vou dar um exemplo:

Abaixo dos 5

<< Anterior 1,2,3,4,5 Próxima >>

Acima de 5 (Na página 1)

<< Anterior 1,2,3,4,5 Próxima >>

Acima de 5 (Na página 2)

<< Anterior 2,3,4,5,6 Próxima >>

Acima de 5 (Na página 3)

<< Anterior 3,4,5,6,7 Próxima >>

...e por ai fora..vou deixar a parte que interessa do código:

Código: [Seleccione]
$listar = 5;
$total = mysql_num_rows($sql);
$total_paginas = ceil($total / $listar);

if ($pg == 1) {
echo "<span class=\"mlinks\"><< Anterior</span> | ";
}else{
echo "<a class=\"mlinks\" href=\"pesquisa.php?pg=".($pg - 1)."\"><< <b>Anterior</b></a> | ";
}
for ($i=1; $i<=$total_paginas; $i++){
if ($pg == $i){
echo "<span class=\"sconteudo\">".$i."</span> ";
}else{
echo "<a class=\"conteudo\" href=\"pesquisa.php?pg=".$i."\">".$i."</a> ";
}
}
if ($pg == $total_paginas) {
echo "| <span class=\"mlinks\">Próxima >></span>";
}else{
echo "| <a class=\"mlinks\" href=\"pesquisa.php?pg=".($pg + 1)."\"><b>Próxima</b> >></a>";
}
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Humm..não me parece que alguém tenha experiência em algo deste género :|
Offline

SSPT 
Membro
Mensagens 408 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Pq n fazes do genero

Código: [Seleccione]

if($pg < 3){echo "1 2 3 4 5"}
elseif(($pg + 2) == $total_paginas)
{echo $total_paginas -1 . " " . $total_paginas -2 . " " . $total_paginas -3 . " " . $total_paginas -4 . " " . $total_paginas -5; }
else{echo $page_number-2 . " " . $page_number-1 . " " . $page_number . " " . $page_number+1 . " " . $page_number+1; }
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Vou verificar bem o código que disses-te e testar depois digo qualquer coisa ;)
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Vê lá se é mais ou menos isto:

Código: [Seleccione]
if (isset($_GET['pg'])) {
$pg = $_GET['pg'];
} else {
$pg = 1;
}

$listar = 5;
$total = 100;
$total_paginas = ceil($total / $listar);

if ($pg == 1) {
echo "<span class=\"mlinks\"><< Anterior</span> | ";
} else {
echo "<a class=\"mlinks\" href=\"".$_SERVER['PHP_SELF']."?pg=".($pg - 1)."\"><< <b>Anterior</b></a> | ";
}

if ($total_paginas > $listar) {
$i = $pg;
} else {
$i = 1;
}

if ($pg+$listar > $total_paginas) {
$to = $total_paginas+1;
} else {
$to = $pg+$listar;
}

for ($i; $i<$to; $i++) {
if ($pg == $i){
echo "<span class=\"sconteudo\">".$i."</span> ";
} else {
echo "<a class=\"conteudo\" href=\"".$_SERVER['PHP_SELF']."?pg=".$i."\">".$i."</a> ";
}
}

if ($pg == $total_paginas) {
echo "| <span class=\"mlinks\">Próxima >></span>";
} else {
echo "| <a class=\"mlinks\" href=\"".$_SERVER['PHP_SELF']."?pg=".($pg + 1)."\"><b>Próxima</b> >></a>";
}


pela tua descrição pareceu-me ser isto, mas axo que seria melhor algo do genero, tens X páginas, mas só queres que apareça 5 links para paginas mais o link anterior e proximo. se tivermos 20 paginas, acho que devia ser apresentado do tipo:

tamos na pagina 1:
<< Anterior | 1 2 3 4 5 | Próxima >>

tamos na pagina 10:
<< Anterior | 8 9 10 11 12 | Próxima >>

tamos na pagina 20:
<< Anterior | 16 17 18 19 20 | Próxima >>

só uma ideia.
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Nazgulled, isso não funciona como estás a dizer..

Por exemplo eu tenho 10 páginas e fica assim:

Página 2:

<< Anterior | 2 3 4 5 6 | Próxima >>

Página 3:

<< Anterior | 3 4 5 6 7 | Próxima >>

Página 7:

<< Anterior | 7 8 9 10 | Próxima >>

Página 9:

<< Anterior | 9 10 | Próxima >>

Página 10:

<< Anterior | 10 | Próxima >>

Depois do 5 as páginas começam a desaparecer... :|
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Citação de: "SSPT"
Pq n fazes do genero

Código: [Seleccione]

if($pg < 3){echo "1 2 3 4 5"}
elseif(($pg + 2) == $total_paginas)
{echo $total_paginas -1 . " " . $total_paginas -2 . " " . $total_paginas -3 . " " . $total_paginas -4 . " " . $total_paginas -5; }
else{echo $page_number-2 . " " . $page_number-1 . " " . $page_number . " " . $page_number+1 . " " . $page_number+1; }


Com isto tive um fracaço ainda maior :|
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

lolol... eu sei que não funciona como eu disse... eu pos a funcionar como tu pediste, ou como me pareceu que tinhas pedido. o que eu disse depois foi uma sugestão minha de como deveria funcionar porque acho que tem mais lógica
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Nazgulled, apesar de não tar como disses-te..também não está como disse, se verificares o meu primeiro post e o post depois de ter experimentado não era bem isto que tinha pedido..eu não quero que as páginas desapareçam..quero que estejam la sempre 5 páginas..
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

dá um exemplo de como queres que funcione, tipo, em 10 paginas, mostra-me um exemplo como queres que fique em cada pagina, da 1ª ate a 10ª.
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Citação de: "OFFICER"
Nazgulled, isso não funciona como estás a dizer..

Por exemplo eu tenho 10 páginas e fica assim:

Página 2:

<< Anterior | 2 3 4 5 6 | Próxima >>

Página 3:

<< Anterior | 3 4 5 6 7 | Próxima >>

(...)

Depois do 5 as páginas começam a desaparecer... :|


Tenta fazer algo mais simples como:

Pagina 1:

<< 1 2 3 4 5 >>

Pagina 2

<< 1 2 3 4 5 >>

Pagina 3

<< 1 2 3 4 5 >>

(.....)
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Tive a ver e da maneira que quero não dá! Portanto daquela maneira que disses-te é bom!

Página 1:

<< Anterior | 1 2 3 4 5 | Próxima >>

Página 2:

<< Anterior | 1 2 3 4 5 | Próxima >>

Página 3:

<< Anterior | 1 2 3 4 5 | Próxima >>

Página 4:

<< Anterior | 2 3 4 5 6 | Próxima >>

Página 5:

<< Anterior | 3 4 5 6 7 | Próxima >>

Página 6:

<< Anterior | 4 5 6 7 8 | Próxima >>

Página 7:

<< Anterior | 5 6 7 8 9 | Próxima >>

Página 8:

<< Anterior | 6 7 8 9 10 | Próxima >>

Página 9:

<< Anterior | 6 7 8 9 10 | Próxima >>

Página 10:

<< Anterior | 6 7 8 9 10 | Próxima >>
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Vê lá isto então:

Código: [Seleccione]
<?php

// Número de links a mostrar e total de páginas

$pages_show 5;
$pages_count 10;

// Que página estamos a ver?

if &#40;isset&#40;$_GET['page'&#93;&#41;&#41; &#123;
$page $_GET['page'&#93;;

// Verifica se a página está dentro dos limites

if &#40;$page < 1&#41; &#123;
$page 1;
&#125; elseif &#40;$page > $pages_count&#41; &#123;
$page $pages_count;
&#125;
&#125; else &#123;
$page 1;
&
#125;

// Calcula o início e fim do ciclo

$start $page floor&#40;$pages_show/2&#41;;
$end $page floor&#40;$pages_show/2&#41;;

/* Define manualmente o início e fim do ciclo se
   estivermos nas primeiras ou últimas páginas */

if &#40;$start < 1&#41; &#123;
$start 1;
$end $pages_show;
&
#125; else if &#40;$end > $pages_count&#41; &#123;
$start $pages_count $pages_show 1;
$end 10;
&
#125; else &#123;
/* Incrementa 1 valor ao início do ciclo se o número de links
   for par, caso contrário iremos ter um link a mais */

if &#40;!&#40;$pages_show%2&#41;&#41; &#123;
$start++;
&#125;
&#125;

// Define o link para a página anterior à actual

if &#40;$page == 1&#41; &#123;
$pages_html '<< Anterior | ';
&
#125; else &#123;
$pages_html '<a href="'.$_SERVER['PHP_SELF'&#93;.'?page='.&#40;$page-1&#41;.'"><< Anterior</a> | ';
&#125;

//

for &#40;$i = $start; $i <= $end; $i++&#41; &#123;
if &#40;$i == $page&#41; &#123;
$pages_html .= $i.' ';
&#125; else &#123;
$pages_html .= '<a href="'.$_SERVER['PHP_SELF'&#93;.'?page='.$i.'">'.$i.'</a> ';
&#125;
&#125;

// Define o link para a página a seguir à actual

if &#40;$page >= $pages_count&#41; &#123;
$pages_html .= '| Seguinte >>';
&
#125; else &#123;
$pages_html .= '| <a href="'.$_SERVER['PHP_SELF'&#93;.'?page='.&#40;$page+1&#41;.'">Seguinte >></a>';
&#125;

// Imprime a paginação no ecrã

echo $pages_html;

?>
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Só uma coisinha..onde fica a mysql nisto? lol

É que tem que haver a limitação na mysql.. :|


Vou postar o que interessa...

Código: [Seleccione]
$query = "SELECT * FROM busca WHERE texto LIKE '%".$palavra."%' or titulo LIKE '%".$palavra."%'";
$pg = @$_GET["pg"];
if (!$pg) $pg=1;
$listar = 5;
$sql = mysql_query($query);
$total = mysql_num_rows($sql);
$total_paginas = ceil($total / $listar);
$totals = ($total == 1) ? "" : "s";
$totalp = ($total_paginas == 1) ? "" : "s";
$sql2 = $query." limit ".(($pg-1)*$listar).",".$listar;
$rs = mysql_query($sql2,$con);

if ($pg == 1) {
echo "<span class=\"mlinks\"><< Anterior</span> | ";
}else{
echo "<a class=\"mlinks\" href=\"pesquisa.php?pg=".($pg - 1)."\"><< <b>Anterior</b></a> | ";
}

if ($total_paginas > $listar) {
   $i = $pg;
} else {
   $i = 1;
}

if ($pg+$listar > $total_paginas) {
   $to = $total_paginas+1;
} else {
   $to = $pg+$listar;
}

for ($i; $i<$to; $i++) {
if ($pg == $i){
echo "<span class=\"sconteudo\">".$i."</span> ";
}else{
echo "<a class=\"conteudo\" href=\"pesquisa.php?pg=".$i."\">".$i."</a> ";
}
}
if ($pg == $total_paginas) {
echo "| <span class=\"mlinks\">Próxima >></span>";
}else{
echo "| <a class=\"mlinks\" href=\"pesquisa.php?pg=".($pg + 1)."\"><b>Próxima</b> >></a>";
}


Este é o code actual, com aquela maneira que postas-te anteriormente..
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

usa o novo código, ou adapta o novo código ao teu site, porque funciona melhor e foi testado para certificar que funciona tudo direito e sem erros (claro que pode ter escapado qualquer coisa...). Básicamente só teras de mudaro $pages_show para definires a quantidade de links numericos que aparecem, $pages_count para definir a quantidade de paginas, aqui poes igual ao mysql_num_rows() da tua query a dividir pelo numero de registos que queres por página, como tinhas antes. Depois alteras o $_GET[] para ter o nome da tua variavel e também os conteudo que será escrito no browser, ou seja, tudo que tenha $pages_html, editas ai para ficar como queres com os nomes das variaveis que queres.

quanto à limitação no SQL tens de fazer algo do genero:

query = "SELECT * FROM busca WHERE texto LIKE '%".$palavra."%' or titulo LIKE '%".$palavra."%' LIMIT $i_registos, $f_registos";

Depois usas o numero de registos no total e numero de registos a dividir pelo numero de paginas para calcular o inicio e o fim do registos na query, $i_registo e $f_registos respectivamente.