bonsoir a tt les grafikarts
j'ai réaliser un site web grace au tutos de grafikart.fr developper un site web de A à Z
le probléme est que dans ma vue (l'accueil du site)
j'ai plusieurs articles jusqu’à 20 articles
et dans la pagination j'ai comme ça :

1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20

j'aimerai faire comme ça :

1-2-3-4...19-20

voici mon code
index.php

<div class="pagination">

    <?php for($i=1; $i <= $page; $i++): ?>
        <li <?php if($i==$this->request->page) echo 'class="active"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
    <?php endfor; ?>
  </ul>
        </div>

et au postscontroller.php

function index(){
            $perPage = 1;
            $this->loadModel('Post');
            $condition = array(
                'online' => 1,
                'type'=>'post');
            $d'posts'] = $this->Post->find(array(
                'conditions' => $condition,
                'order' => 'id DESC',
                'limit' => ($perPage*($this->request->page-1)).','.$perPage

            ));
            $d'total'] = $this->Post->findCount($condition);
            $d'page'] = ceil($d'total'] / $perPage);
            $this->set($d);
        }

        function view($id,$slug){
            $this->loadModel('Post');
            $d'post'] = $this->Post->findFirst(array(
                'fields'    => 'id,slug,content,name',
                'conditions' => array('online' => 1,'id'=>$id,'type'=>'post')
            ));
            if(empty($d'post'])){
                $this->e404('Page introuvable');
            }
            if($slug != $d'post']->slug){
                $this->redirect("posts/view/id:$id/slug:".$d'post']->slug,301);
            }
            $this->set($d);

        }

9 réponses


I-dev
Auteur
Réponse acceptée

merci lartak11 grace a vous j'ai fait un effort voici la pagination réaliser :

<!------------------------------pagination------------------------------->
<?php 
if (ceil($total/4) > 1){ 
?>

    <ul id="pagination" style="float:right;">

       <?php
    //boutton précédent
        $current = $this->request->page;
        $prev = $current - 1; // numéro de la page précédente
        $next = $current + 1; // numéro de la page suivante
        $pagination = ' ';
        $adj = 3;
        $condition = array(
                'online' => 1,
                'type'=>'post'
                );

        ?>

    <?php if($current==1){ 
        echo ' ';
        }elseif( ($current>1) && (ceil($total/4) > 1 )){
    ?>      
            <li class="navigation"><a href="?page=<?php echo $prev; ?>">??????</a></li>

    <?php   }?>

<!--début du pagination-->    
<!-------------------------------------------------------------------------------------------------->    

    <!--CAS 1 au moin 12 pages -> pas de troncature-->

        <?php if (ceil($total/4) < 2 + ($adj * 2)) {?>

            <li <?php if($this->request->page==1) echo 'class="current"'; ?>><a href="?page=1">1</a></li>

            <?php // Pour les pages restantes on utilise itère
            for ($i=2; $i <= ceil($total/4); $i++): ?>

                <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>

            <?php endfor; ?>
     <!---FIN---CAS 1-->

     <!--CAS 2 : au plus 13 pages -> troncature-->
   <?php 
     }else{ ?>
        <!--Troncature 1--> <!--if total kbir 3la 8-->
        <?php if ($current < 1+($adj * 2)) { ?>

                <li <?php if($this->request->page==1) echo 'class="current"'; ?>><a href="?page=1">1</a></li>

            <?php  
                // puis des huit autres suivants
                for ($i = 2; $i < 3 + ($adj * 2); $i++) : ?>

                    <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>

                <?php endfor; ?>

                <li class="points"><a href="#">...</a></li>

                <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href="?page=<?php echo ceil($total/4)-1; ?>"><?php echo ceil($total/4)-1; ?></a></li>
                <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href="?page=<?php echo ceil($total/4); ?>"><?php echo ceil($total/4); ?></a></li>

              <!--Troncature 2-->
              <?php }elseif ( (($adj * 2) < $current) && ($current < ceil($total/4) - ($adj * 2)) ) { ?>

                <li><a href="?page=1">1</a></li>
                <li><a href="?page=2">2</a></li>
                <li class="points"><a href="#">...</a></li>

                  <?php // les pages du milieu : les trois précédant la page courante, la page courante, puis les trois lui succédant
                    for ($i = $current - $adj; $i <= $current + $adj; $i++) : ?>

                    <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>

                  <?php endfor; ?>

                  <li class="points"><a href="#">...</a></li>

                <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href=""><?php echo ceil($total/4)-1; ?></a></li>
                <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href=""><?php echo ceil($total/4); ?></a></li>

              <?php }else{?>
              <!----Troncature 3-->
                    <li><a href="?page=1">1</a></li>
                    <li><a href="?page=2">2</a></li>
                    <li class="points"><a href="#">...</a></li>

                    <?php for ($i = ceil($total/4) - (1 + ($adj * 2)); $i <= ceil($total/4); $i++) : ?>
      <li <?php if($i==$this->request->page) echo 'class="current"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>

                    <?php endfor; ?>

              <?php }?>

        <!---FIN---CAS 2-->
        <?php }?>

<!------------------------------------------------------------------------------------------------->
<!--fin du pagination-->    

    <!--booton-suivant-->

    <?php 
        if($current==ceil($total/4)){ 
            echo ' ';
        }elseif($current>=1){

    ?>

    <li class="navigation"><a href="?page=<?php echo $next; ?>">??????</a></li>
    <?php   }?>

  </ul>

<?php   }?>

Voila ce que tu aurait pu trouver en une demi seconde grâce à Google :)

<?php
/**
* Affiche la pagination à l'endroit où cette fonction est appelée
* @param string $url L'URL ou nom de la page appelant la fonction, ex: 'index.php' ou 'http://example.com/'
* @param string $link La nom du paramètre pour la page affichée dans l'URL, ex: '?page=' ou '?&p='
* @param int $total Le nombre total de pages
* @param int $current Le numéro de la page courante
* @param int $adj (facultatif) Le nombre de pages affichées de chaque côté de la page courante (défaut : 3)
* @return La chaîne de caractères permettant d'afficher la pagination
*/
function paginate($url, $link, $total, $current, $adj=3) {
    // Initialisation des variables
    $prev = $current - 1; // numéro de la page précédente
    $next = $current + 1; // numéro de la page suivante
    $penultimate = $total - 1; // numéro de l'avant-dernière page
    $pagination = ''; // variable retour de la fonction : vide tant qu'il n'y a pas au moins 2 pages
    if ($total > 1) {
        // Remplissage de la chaîne de caractères à retourner
        $pagination .= "<div class=\"pagination\">\n";
        /* =================================
         * Affichage du bouton [précédent]
         * ================================= */
        if ($current == 2) {
            // la page courante est la 2, le bouton renvoie donc sur la page 1, remarquez qu'il est inutile de mettre $url{$link}1
            $pagination .= "<a href=\"{$url}\">?</a>";
        } elseif ($current > 2) {
            // la page courante est supérieure à 2, le bouton renvoie sur la page dont le numéro est immédiatement inférieur
            $pagination .= "<a href=\"{$url}{$link}{$prev}\">?</a>";
        } else {
            // dans tous les autres, cas la page est 1 : désactivation du bouton [précédent]
            $pagination .= '<span class="inactive">?</span>';
        }
        /**
         * Début affichage des pages, l'exemple reprend le cas de 3 numéros de pages adjacents (par défaut) de chaque côté du numéro courant
         * - CAS 1 : il y a au plus 12 pages, insuffisant pour faire une troncature
         * - CAS 2 : il y a au moins 13 pages, on effectue la troncature pour afficher 11 numéros de pages au total
         */
        /* ===============================================
         * CAS 1 : au plus 12 pages -> pas de troncature
         * =============================================== */
        if ($total < 7 + ($adj * 2)) {
            // Ajout de la page 1 : on la traite en dehors de la boucle pour n'avoir que index.php au lieu de index.php?p=1 et ainsi éviter le duplicate content
            $pagination .= ($current == 1) ? '<span class="active">1</span>' : "<a href=\"{$url}\">1</a>"; // Opérateur ternaire : (condition) ? 'valeur si vrai' : 'valeur si fausse'
            // Pour les pages restantes on utilise itère
            for ($i=2; $i<=$total; $i++) {
                if ($i == $current) {
                    // Le numéro de la page courante est mis en évidence (cf. CSS)
                    $pagination .= "<span class=\"active\">{$i}</span>";
                } else {
                    // Les autres sont affichées normalement
                    $pagination .= "<a href=\"{$url}{$link}{$i}\">{$i}</a>";
                }
            }
        }
        /* =========================================
         * CAS 2 : au moins 13 pages -> troncature
         * ========================================= */
        else {
            /**
             * Troncature 1 : on se situe dans la partie proche des premières pages, on tronque donc la fin de la pagination.
             * l'affichage sera de neuf numéros de pages à gauche ... deux à droite
             * 1 2 3 4 5 6 7 8 9 … 16 17
             */
            if ($current < 2 + ($adj * 2)) {
                // Affichage du numéro de page 1
                $pagination .= ($current == 1) ? "<span class=\"active\">1</span>" : "<a href=\"{$url}\">1</a>";
                // puis des huit autres suivants
                for ($i = 2; $i < 4 + ($adj * 2); $i++) {
                    if ($i == $current) {
                        $pagination .= "<span class=\"active\">{$i}</span>";
                    } else {
                        $pagination .= "<a href=\"{$url}{$link}{$i}\">{$i}</a>";
                    }
                }
                // ... pour marquer la troncature
                $pagination .= '…';
                // et enfin les deux derniers numéros
                $pagination .= "<a href=\"{$url}{$link}{$penultimate}\">{$penultimate}</a>";
                $pagination .= "<a href=\"{$url}{$link}{$total}\">{$total}</a>";
            }
            /**
             * Troncature 2 : on se situe dans la partie centrale de notre pagination, on tronque donc le début et la fin de la pagination.
             * l'affichage sera deux numéros de pages à gauche ... sept au centre ... deux à droite
             * 1 2 … 5 6 7 8 9 10 11 … 16 17
             */
            elseif ( (($adj * 2) + 1 < $current) && ($current < $total - ($adj * 2)) ) {
                // Affichage des numéros 1 et 2
                $pagination .= "<a href=\"{$url}\">1</a>";
                $pagination .= "<a href=\"{$url}{$link}2\">2</a>";
                $pagination .= '…';
                // les pages du milieu : les trois précédant la page courante, la page courante, puis les trois lui succédant
                for ($i = $current - $adj; $i <= $current + $adj; $i++) {
                    if ($i == $current) {
                        $pagination .= "<span class=\"active\">{$i}</span>";
                    } else {
                        $pagination .= "<a href=\"{$url}{$link}{$i}\">{$i}</a>";
                    }
                }
                $pagination .= '…';
                // et les deux derniers numéros
                $pagination .= "<a href=\"{$url}{$link}{$penultimate}\">{$penultimate}</a>";
                $pagination .= "<a href=\"{$url}{$link}{$total}\">{$total}</a>";
            }
            /**
             * Troncature 3 : on se situe dans la partie de droite, on tronque donc le début de la pagination.
             * l'affichage sera deux numéros de pages à gauche ... neuf à droite
             * 1 2 … 9 10 11 12 13 14 15 16 17
             */
            else {
                // Affichage des numéros 1 et 2
                $pagination .= "<a href=\"{$url}\">1</a>";
                $pagination .= "<a href=\"{$url}{$link}2\">2</a>";
                $pagination .= '…';
                // puis des neuf derniers numéros
                for ($i = $total - (2 + ($adj * 2)); $i <= $total; $i++) {
                    if ($i == $current) {
                        $pagination .= "<span class=\"active\">{$i}</span>";
                    } else {
                        $pagination .= "<a href=\"{$url}{$link}{$i}\">{$i}</a>";
                    }
                }
            }
        }
        /* ===============================
         * Affichage du bouton [suivant]
         * =============================== */
        if ($current == $total)
            $pagination .= "<span class=\"inactive\">?</span>\n";
        else
            $pagination .= "<a href=\"{$url}{$link}{$next}\">?</a>\n";
        // Fermeture de la <div> d'affichage
        $pagination .= "</div>\n";
    }
    return ($pagination);
}
?>
I-dev
Auteur

merci
mais ou je dois placer ça.
dans le PostsController.php

I-dev
Auteur

et dans l'index.php
je mets quoi? pck j'ai laisser comme

<div class="pagination">

    <?php for($i=1; $i <= $page; $i++): ?>
        <li <?php if($i==$this->request->page) echo 'class="active"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
    <?php endfor; ?>
  </ul>
        </div>

sans résultat

Bonsoir. Voilà le lien de la source du code que t'a donné ToinouPHP : [url=www.petit-kiwi.com/php-creation-pagination-avancee]PHP : création d’une pagination avancée[/url]. Tu devrais mieux comprendre comment l'adapter pour ton cas comme ça.

I-dev
Auteur

aider moi Lartak11 svp
j'attend votre réponse...

I-dev
Auteur

aider moi

Bonsoir.
Nous t'avons donné tout ce que tu as besoin.
Il me semble que le tutoriel est basé sur un site MVC, il doit donc être question dans le tutoriel des créations de classes, de helpers, etc...
Tu devrais donc t'en sortir.
Un tutoriel ne sert pas juste à recopier du code, mais à comprendre comment faire et adapter un minimum avec ses besoins.
L'assistanat n'a jamais été bon pour l'apprentissage, alors à toi d'apprendre avec ce qui t'a été fourni via le tutoriel et ici en réponse à ton sujet.

+1 avec Lartak11, apprendre via les tutoriels est bon, copier coller un tutoriel sans le comprendre ne te servira à rien.