S'enregistrer | Rechercher | FAQ | Liste des Membres | Groupes d'utilisateurs | Connexion

  Nom d'utilisateur:    Mot de passe:       

  

Poster un nouveau sujet   Répondre au sujet Page 1 sur 1
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
MessagePosté le: Ven Déc 14, 2012 4:22 pm    Sujet du message: Class de Pagination Répondre en citant

SHEPSHEP
Projets


 
Inscrit le: 08 Avr 2009
Messages: 268
Localisation: /dev/null



Salut Ă  tous,

Tout d'abord, je sais que ce Post serais plus à ça place sur DevBBS mais vu qu'il y a 4 Post par an, j'ai préféré le mettre ici.

Un truc récurrent quand on développe, c'est la pagination.
Jusqu’à maintenant je la recodais à chaque fois mais la j'ai eu un peu plus de temps que d'habitude donc j'ai fait une classe dédiée.

Plutôt que de me la garder, la voici. Si vous avez des idées d'améliorations a y apporter ne vous gêner pas !
Il y a le code Twig en bas.

Code:
<?php

/**
 * Class de Pagination
 *
 * @author 2ShEp
 * @version 0.1
 */

class Pagination {

    private $nbEleByPage = null;
    private $nbEle = null;
    private $nbPage = null;
    private $currentPage = null;
    private $output = array();
   
    public function __construct() {
    }
   
    /**
     * Initialise les attributs de la classe
     *
     * @param Integer $nbEle
     * @param Integer $nbEleByPage
     * @param Integer $currentPage
     * @throws Exception
     */
    public function init($nbEle, $nbEleByPage = 20, $currentPage = 1) {
        $this->nbEle = (int) $nbEle;
        $this->nbEleByPage = (int) $nbEleByPage;
        $this->nbPage = ceil($this->nbEle / $this->nbEleByPage);
        $this->currentPage = (is_numeric($currentPage)) ? $currentPage : 1;

        if ($this->currentPage > $this->nbPage)
            throw new Exception("Page inexistante");
       
        return true;
    }
   
    /**
     * GĂ©nère le tableau d'informations
     *
     * @param String $type ENUM('reduce','all')
     * @param Integer $nb_liens
     * @return Boolean
     */
    public function generate($type = 'reduce', $nb_liens = 7){
       
        switch($type){
            case "all":

                break;
            case "reduce":

                // first & previous
                if ($this->currentPage > 1) {
                    // first
                    $this->output[] = array('lien_actif' => 1, 'num_page' => 1, 'lib' => '<<');
                    // previous
                    $this->output[] = array('lien_actif' => 1, 'num_page' => $this->currentPage-1, 'lib' => '<');
                }

                // liste
                $median = ceil(($nb_liens-1)/2);

                $i = $this->currentPage - $median;

                if ($this->currentPage + $median >= $this->nbPage) {
                     $i = $this->nbPage - $nb_liens + 1;
                }

                if ($i <= 0) {
                    $i = 1;
                }
               
                while ($i < $this->currentPage) {
                    $this->output[] = array('lien_actif' => 1, 'num_page' => $i, 'lib' => $i);
                    $i++;
                }
               
                $i = $this->currentPage;
                while (($i <= ($this->currentPage + $median) || $i <= $nb_liens) && $i <= $this->nbPage) {
                    $this->output[] = array('lien_actif' => (($i != $this->currentPage) ? 1 : 0), 'num_page' => $i, 'lib' => $i);
                    $i++;
                }
               
                // next & last
                if ($this->currentPage < $this->nbPage) {
                    // next
                    $this->output[] = array('lien_actif' => 1, 'num_page' => $this->currentPage+1, 'lib' => '>');
                    // last
                    $this->output[] = array('lien_actif' => 1, 'num_page' => $this->nbPage, 'lib' => '>>');
                }

                break;
        }

        return true;
    }
   
    /**
     *
     * @return Array
     */
    public function getOutput(){
        return $this->output;
    }
   
   /**
     * Retourne un code HTML basique
     *
     * @return String : Code HTML
     */
   public function getHtmlOutput(){
      $html_output = "";
      if($this->nbPage > 1){
         $html_output .= "<div class=\"pagination\"><span>Pages : </span>";
         foreach($this->output as $page){
            $html_output .=  "<span>";
            if($page["lien_actif"] == 1){
                    if(strstr($_SERVER["REQUEST_URI"],"no_page"))
                        $url = preg_replace("#&no_page=[0-9]*#","&no_page=".$page["num_page"],$_SERVER["REQUEST_URI"]);
                    else
                        $url = $_SERVER["REQUEST_URI"]."&no_page=".$page["num_page"];
               $html_output .=  "<a href=\"".$url."\">".$page["lib"]."</a>&nbsp";
            }else{
               $html_output .=  "<strong>".$page["num_page"]."</strong>&nbsp";
            }
            $html_output .=  "</span>";
         }
         $html_output .=  "</div>";
      }
      return $html_output;
    }
   
   public function getNbPage(){
      return $this->nbPage;
   }
}
?>


Voici le code Twig qui va avec, si ca en intéresse certains.

Code:
{% block pagination %}
{% if pagination|length > 1 %}
<div class="pagination">
    Pages :
    {% for p in pagination %}
    <span>
        {% if p.lien_actif == 1 %}
            {% set parameters = parameters|merge({'page': p.num_page}) %}
            <a href="{{ path(app.request.attributes.get('_route'), parameters) }}">{{ p.lib }}</a>&nbsp;
        {% else %}
            <strong>{{ p.num_page }}</strong>&nbsp;
        {% endif %}
    </span>
    {% endfor %}
</div>
{% endif %}
{% endblock %}


Merci d'avoir lu jusqu’à la Smile

++
2ShEp
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur
MessagePosté le: Ven Déc 14, 2012 11:46 pm    Sujet du message: Répondre en citant

Korigan
Site Admin


 
Inscrit le: 29 Mai 2007
Messages: 1781



Merci pour ce partage Shepshep.

Pour devbbs on va faire quelquechose. Peut être que les règles concernant les nouvelles inscriptions sont trop restrictives. Et il y a aussi un problème de visibilité.
Nous pouvons Ă©galement nous interroger sur son maintient.
Nous devons en parler entre nous rapidement.

Cordialement,
Korigan
Voir le profil de l'utilisateur Envoyer un message privés Envoyer un e-mail
MessagePosté le: Lun Déc 17, 2012 12:32 pm    Sujet du message: Répondre en citant

SHEPSHEP
Projets


 
Inscrit le: 08 Avr 2009
Messages: 268
Localisation: /dev/null



Salut Korigan,

Je ne connais pas les règles d'inscription à DevBBS.
Par contre, concernant la visibilité, il est clair que DevBBS n'est pas assez mis en avant si vous voulez le conserver.

Mon avis perso :
Je ne pense pas que DevBBS soit vraiment un plus pour l'univers BBS.
Les discussions sur le développement sont assez rares sur le forum et la section "Programmation" est amplement suffisante pour répondre aux besoins de la communauté.

++
2ShEp
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur
Poster un nouveau sujet   Répondre au sujet Page 1 sur 1

  


 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum



110251 Attacks blocked