2014-05-01 2 views
1

J'utilise la pagination bootstrap et une méthode PHP/mysql pour afficher mes résultats (ex: results.php? Results = 1 pour chaque page). Cela fonctionne très bien, mais affiche réellement la division de pagination au fond de ma page, c.-à-d. Laquelle est active, si vous pouvez cliquer sur les éléments suivants ou précédents (s'il y a réellement des résultats sur ces pages)Affichage de la pagination PHP

J'ai fait un cas spécifique pour à peu près toutes les combinaisons que je pourrais penser qui affecteraient n'importe quoi, mais ce n'est certainement pas efficace. Quelqu'un peut-il suggérer une meilleure façon de le faire? Certains des cas seront évidents, comme si je suis sur la première page, je ne veux pas montrer la page 0 et -1 dans la pagination, d'autres sont moins évidentes, comme si je suis à la page 3, et il y a pas plus de pages, je veux que la page 3 soit au milieu, car il y a 5 chiffres affichés, mais vous ne devriez pas pouvoir cliquer sur 4 et 5.

J'utilise une réplique exacte du plugin here sauf que j'ai ajouté gauche/droite augmenter/diminuer de un en plus de la première/dernière page.

<div id="pagination" style="width: 340px; margin-left: auto; margin-right: auto;"> 
<? if ($results == 1) { ?>  
<ul class="pagination"> 
    <li class="disabled"><a href="#">&nbsp;<i class="fa fa-lg fa-angle-double-left"></i>&nbsp;</a></li> 
    <li class="disabled"><a href="#">&nbsp;<i class="fa fa-lg fa-angle-left"></i>&nbsp;</a></li> 
    <li class="active"><a href="#"><? echo $results; ?> <span class="sr-only">(current)</span></a></li> 
    <li <?if ($num_rows < $num_res) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>"><? echo $results + 1; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 2)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 2); ?>"><? echo $results + 2; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 3); ?>"><? echo $results + 3; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 4)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 4); ?>"><? echo $results + 4; ?></a></li> 
    <li <?if ($num_rows < ($num_res)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-right"></i>&nbsp;</a></li> 
    <li <?if ($num_rows < ($num_res)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($last_page); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-right"></i>&nbsp;</a></li> 
</ul> 
    <? } ?> 
    <? if ($results == 2) { ?>  
<ul class="pagination"> 
    <li><a href="<? echo $url."&results=".(1); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>"><? echo $results - 1; ?></a></li> 
    <li class="active"><a href="<? echo $url."&results=".($results); ?>"><? echo $results; ?> <span class="sr-only">(current)</span></a></li> 
    <li <?if ($num_rows < ($num_res * 2)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>"><? echo $results + 1; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 2); ?>"><? echo $results + 2; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 3); ?>"><? echo $results + 3; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-right"></i>&nbsp;</a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($last_page); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-right"></i>&nbsp;</a></li> 
</ul> 
    <? } ?> 
    <? if (($results == 3) && (($last_page == 3))) { ?> 
<ul class="pagination"> 
    <li><a href="<? echo $url."&results=".(1); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 2); ?>"><? echo $results - 2; ?> </a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>"><? echo $results - 1; ?></a></li> 
    <li class="active"><a href="<? echo $url."&results=".($results); ?>"><? echo $results; ?><span class="sr-only">(current)</span></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>"><? echo $results + 1; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 2); ?>"><? echo $results + 2; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-right"></i>&nbsp;</a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($last_page); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-right"></i>&nbsp;</a></li> 
</ul> 
    <? } ?> 
    <? if (($results > 2) && ($results < ($last_page - 1))) { ?>  
<ul class="pagination"> 
    <li><a href="<? echo $url."&results=".(1); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 2); ?>"><? echo $results - 2; ?> </a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>"><? echo $results - 1; ?></a></li> 
    <li class="active"><a href="<? echo $url."&results=".($results); ?>"><? echo $results; ?><span class="sr-only">(current)</span></a></li> 
    <li><a href="<? echo $url."&results=".($results + 1); ?>"><? echo $results + 1; ?></a></li> 
    <li><a href="<? echo $url."&results=".($results + 2); ?>"><? echo $results + 2; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-right"></i>&nbsp;</a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($last_page); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-right"></i>&nbsp;</a></li> 
</ul> 
    <? } ?> 
    <? if (($results > 2) && ($results == ($last_page - 1))) { ?> 
<ul class="pagination"> 
    <li><a href="<? echo $url."&results=".(1); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 3); ?>"><? echo $results - 3; ?></a></li> 
    <li><a href="<? echo $url."&results=".($results - 2); ?>"><? echo $results - 2; ?></a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>"><? echo $results - 1; ?></a></li> 
    <li class="active"><a href="<? echo $url."&results=".($results); ?>"><? echo $results ?><span class="sr-only">(current)</span></a></li> 
    <li><a href="<? echo $url."&results=".($results + 1); ?>"><? echo $results + 1; ?></a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($results + 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-right"></i>&nbsp;</a></li> 
    <li <?if ($num_rows < ($num_res * 3)) { echo "class=\"disabled\""; } ?>><a href="<? echo $url."&results=".($last_page); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-right"></i>&nbsp;</a></li> 
</ul> 
    <? } ?> 
    <? if (($results > 2) && ($results == $last_page) && ($results != 3)){ ?>  
<ul class="pagination"> 
    <li><a href="<? echo $url."&results=".(1); ?>">&nbsp;<i class="fa fa-lg fa-angle-double-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>">&nbsp;<i class="fa fa-lg fa-angle-left"></i>&nbsp;</a></li> 
    <li><a href="<? echo $url."&results=".($results - 4); ?>"><? echo $results - 4; ?> </a></li> 
    <li><a href="<? echo $url."&results=".($results - 3); ?>"><? echo $results - 3; ?></a></li> 
    <li><a href="<? echo $url."&results=".($results - 2); ?>"><? echo $results - 2; ?></a></li> 
    <li><a href="<? echo $url."&results=".($results - 1); ?>"><? echo $results - 1; ?></a></li> 
    <li class="active"><a href="<? echo $url."&results=".($results); ?>"><? echo $results ?><span class="sr-only">(current)</span></a></li> 
    <li class="disabled"><a href="#">&nbsp;<i class="fa fa-lg fa-angle-right"></i>&nbsp;</a></li> 
    <li class="disabled"><a href="#">&nbsp;<i class="fa fa-lg fa-angle-double-right"></i>&nbsp;</a></li> 
</ul> 
    <? } ?> 
</div> 

Si personne ne se sent comme aider à la première partie, je comprends, il fonctionne comme il est aussi loin que je peux dire.

Mais je me demande aussi s'il y a un moyen que sur mon class="disabled", je peux supprimer les hrefs? Ou dois-je simplement mettre une instruction if sur chacun d'eux? Merci.

Éditer: Basé sur les recommandations de @ Scopey. J'ai changé quelques choses comme je l'entendais, ainsi que quelques noms de variables.

$numberOfPages = ceil($num_rows/$num_res); 
$numberOfPages = (int)$numberOfPages; 

$url = explode('&', $_SERVER['REQUEST_URI']); 
function myFilter($string) { 
return strpos($string, 'results=') === false; 
} 

$url = array_filter($url, 'myFilter'); 
$url = implode('&', $url); 

?> 
<ul class="pagination"> 
    <li<?php if($results === $numberOfPages): ?> class="disabled"<?php endif; ?>><a href="<?php 
if($results !== $numberOfPages){ 
    echo $url.'&results=' . 1; 
} else { echo '#'; } 
?>">&nbsp;<i class="fa fa-lg fa-angle-double-left"></i>&nbsp;</a></li> 
    <li<?php if($results === 1): ?> class="disabled"<?php endif; ?>><a href="<?php 
if($results !== 1){ 
    echo $url.'&results=' . ($results - 1); 
} else { echo '#'; } 

?>">&nbsp;<i class="fa fa-lg fa-angle-left"></i>&nbsp;</a></li> 

<?php 

// Print the pagination... 
// Minimum of 5 pages in the pagination, even if there aren't 5 pages... 
$pageCount = ($numberOfPages < 5) ? 5 : $numberOfPages; 

// Loop through from page 1 until the last page ($pageCount) 
for($i = 1; $i <= $pageCount; $i++) 
{ 
    // Echo out just the beginning of the <li> tag as we don't yet 
    // know if this needs to be disabled... 
    echo '<li'; 
    // Added to show if current page is active 
    if($i === $results) { 
      echo ' class="active"'; 
    } 
    // Check if: 
    // - This current page is greater than the amount of pages of 
    // results we have 
    // - OR, this is the currently selected page 
    if($i > $numberOfPages || $results === $i) 
    { 
      // <li> tag needs the disabled class.... 
      echo ' class="disabled"'; 
    } 
    // Finish the <li> tag and start generating the link 
    echo '><a href="'; 
    // Opposite logic from above... Only if this is a page we know about 
    // AND this is not the current page. 
    if($i < $numberOfPages && $results !== $i) 
    { 
      // The link will be your page, with the get param, and the 
      // current page number we're printing 
      echo $url.'&results=' . $i; 
    } 
    else 
    { 
      // Otherwise just a # (no link) 
      echo '#'; 
    } 
    // Finish this page... Print the page number ($i) 
    echo '">' . $i . '</a></li>'; 
} 
?> 
    <li<?php if($results === $numberOfPages): ?> class="disabled"<?php endif; ?>><a href="<?php 
if($results !== $numberOfPages){ 
    echo $url.'&results=' . ($results + 1); 
} else { echo '#'; } 
?>">&nbsp;<i class="fa fa-lg fa-angle-right"></i>&nbsp;</a></li> 
<li<?php if($results === $numberOfPages): ?> class="disabled"<?php endif; ?>><a href="<?php 
if($results !== $numberOfPages){ 
    echo $url.'&results=' . $numberOfPages; 
} else { echo '#'; } 
?>">&nbsp;<i class="fa fa-lg fa-angle-double-right"></i>&nbsp;</a></li> 

<?php 

@Scobey, cela fonctionne très bien, comme prévu, et même que mon article original, sauf pour quelques choses. Dans mon exemple, j'ai pu obtenir la page actuelle au milieu de la. Par exemple, < < 1 | 2 | | 4 | 5 >>, c'est pourquoi j'ai eu tellement de différentes déclarations avec +1 et -1, +2, -2

Deuxièmement, mon intention était d'afficher 5 options de page en tout temps, pas seulement un minimum de cinq . Donc, si j'étais à la page 6, je ne verrais que < < 4 | 5 | | 7 | 8 >>, pas 1-8. Il n'est peut-être pas nécessaire de le faire de cette façon, c'est bien d'avoir. Mais, je ne veux pas arriver à un point où j'ai plus de 50 numéros de pages différents dans la pagination.

+2

comment peut-on écrire du code comme ça? ou le lire. –

+0

C'est pourquoi je demande de l'aide ici. En ce qui concerne la lecture, c'est juste 6 de la même UL, avec des résultats différents. – dcclassics

+0

Eh bien, vous n'avez pas besoin des blocs presque identiques, une fonction \ boucle le ferait à un total de 6 lignes –

Répondre

3

pagination Généralement dynamique ne fonctionne que lorsque vous avez quelques choses

  1. Un compte de tous les résultats possibles (total)
  2. Une quantité de résultats que vous souhaitez afficher par page
  3. Le numéro de page en cours
  4. Informations sur les résultats qui devraient apparaître sur cette page.

Imaginez que vous avez une table de base de données appelée Results qui a un tas de résultats que vous voulez sur votre page paginé

1.Nombre de tous les résultats possibles

Ceci est réalisable avec une simple instruction SQL comme:

SELECT count(*) FROM Results 

2. Montant par page

Ceci est une valeur que vous arrivez à vous décider.

3. Le numéro de la page en cours

Cela est généralement 1 par défaut, mais quand la pagination est changé, il est transmis à travers un parametre.

4. Une tranche des résultats de la table

avec Réalisables:

SELECT * FROM Results LIMIT 0, 20 

Cet exemple permet de récupérer les 20 premiers résultats dans notre tableau des résultats ...

5. La pagination

Maintenant, en utilisant 20 résultats comme valeur par défaut « Count par page »

$countPerPage = 20; 

// Get the total number of results 
$result = pg_query('SELECT count(*) FROM Results'); // I'm using PostgreSQL for this example 
$totalResultCount = (int)pg_fetch_result($result, 0, 0); 

// The ceil function will round floats up. 
$numberOfPages = ceil($totalResultCount/$countPerPage); 

// Check if we have a page number in the _GET parameters 
if(!empty($_GET) && isset($_GET['page'])) 
{ 
    $page = (int)$_GET['page']; 
} 
else 
{ 
    $page = 1; 
} 

// Check that the page is within our bounds 
if($page < 0) 
{ 
    $page = 1; 
} 
elseif($page > $numberOfPages) 
{ 
    $page = $numberOfPages; 
} 

// Build the query for the results... 
$query = 'SELECT * FROM Results LIMIT ' . ($page - 1) * $countPerPage . ', ' . $countPerPage; 

$results = pg_fetch_all(pg_query($query)); 

// Deal with printing your results etc... 

?> 
<ul class="pagination"> 
    <li<?php if($page === 1): ?> class="disabled"<?php endif; ?>><a href="<?php 
if($page !== 1){ 
    echo 'page.php?page=' . $page - 1; 
} else { echo '#'; } 
?>">&laquo;</a></li> 
<?php 

// Print the pagination... 
// Minimum of 5 pages in the pagination, even if there aren't 5 pages... 
$pageCount = ($numberOfPages < 5) ? 5 : $numberOfPages; 

// Loop through from page 1 until the last page ($pageCount) 
for($i = 1; $i < $pageCount; $i++) 
{ 
    // Echo out just the beginning of the <li> tag as we don't yet 
    // know if this needs to be disabled... 
    echo '<li'; 

    // Check if: 
    // - This current page is greater than the amount of pages of 
    // results we have 
    // - OR, this is the currently selected page 
    if($i > $numberOfPages || $page === $i) 
    { 
      // <li> tag needs the disabled class.... 
      echo ' class="disabled"'; 
    } 
    // Finish the <li> tag and start generating the link 
    echo '><a href="'; 
    // Opposite logic from above... Only if this is a page we know about 
    // AND this is not the current page. 
    if($i < $numberOfPages && $page !== $i) 
    { 
      // The link will be your page, with the get param, and the 
      // current page number we're printing 
      echo 'page.php?page=' . $i; 
    } 
    else 
    { 
      // Otherwise just a # (no link) 
      echo '#'; 
    } 
    // Finish this page... Print the page number ($i) 
    echo '">' . $i . '</a></li>'; 
} 
?> 
<ul class="pagination"> 
    <li<?php if($page === $numberOfPages): ?> class="disabled"<?php endif; ?>><a href="<?php 
if($page !== $numberOfPages){ 
    echo 'page.php?page=' . $page + 1; 
} else { echo '#'; } 
?>">&raquo;</a></li> 
<?php 

Responsabilité

Je me suis assis ici et écrit, je l'ai pas testé, mais l'idée générale est là. J'espère que cela a du sens. Je manque de temps et je n'ai pas le temps de le tester ou de l'améliorer, mais si cela vous intéresse, je pourrais le réparer plus tard.

Espérons que cela aide!

+0

Merci pour la réponse complète !! Je n'ai peut-être pas précisé dans mon article original, la pagination, l'affichage et l'analyse des résultats fonctionnent correctement. J'ai une variable ('$ results') qui récupère le numéro de page.J'ai aussi en haut de mon php '$ num_res = 10; $ offset = ($ results - 1) * $ num_res; 'qui détermine ma requête MySQL' LIMIT'. '$ num_res' est une option sélectionnable par l'utilisateur (10 résultats, 25, 100) Je vais essayer de convertir votre boucle pour travailler sur ma page. – dcclassics

+0

J'ai ajouté quelques commentaires à la boucle pour, espérons-le, éclaircir un peu ce qui se passe. Je veux juste vous recommander de supprimer ce que vous avez écrit dans votre message original. Je ne veux pas paraître dur mais le meilleur code est celui qui est extensible. Vous voulez écrire quelque chose, et ne pas être brisé par l'entrée de l'utilisateur. Imaginez, dans votre exemple, si vous avez permis à un Joe moyen d'ajouter plus de résultats ... Vous devriez mettre à jour votre pagination chaque fois qu'une autre page était nécessaire. – Scopey

+0

Ok, j'ai modifié votre code pour travailler avec le mien. S'il vous plaît voir ma modification dans mon post original pour mes commentaires, si vous avez le temps. Merci encore pour votre réponse. – dcclassics