Bonjour à tous,

OK, je sais, vu le titre, vous allez me dire de chercher sur notre ami Google pour une question aussi simple xD

En fait, j'ai déjà cherché mais je n'arrive pas à trouver de réponse pour mon cas bien précis.
Au niveau de ma vue, j'ai une liste de vidéos classées en fonction du nombre de points décroissants, le tout affiché dans un beau tableau ^^. Sur la première colonne du tableau, j'affiche la position au classement de chaque vidéo.
Pour résumé, j'ai ceci :

Position ------- Nom de la vidéo ------ Points
1                     xxxxxx            21315
2                    xxxxxx         21314
...

Tout ça c'est bien mais si on commence à avoir 200 vidéos de listés, autant mettre une pagination. Et c'est là que commence le problème...
Je souhaite mettre, à la place d'une pagination, un infiniteScroll.
Le problème, c'est que je ne vois pas comment mettre à jour le chiffre de la position vu qu'il fait partie intégrante des données que je récupère en ajax.

Voici le code de ma vue concernée :

<table class="table table-center">
    <thead>
        <tr>
            <th>Position</th>
            <th>Nom</th>
            <th>Points</th>
            <th>Écouter</th>
        </tr>
    </thead>
    <tbody id="infiniteScroll">
        <?php $rang = 1; ?>
        <?php foreach ($musics as $music): ?>
            <tr id="tune-<?= $music['Music']['id']; ?>">
            <td class="range"><?= $rang++; ?></td>
            <td><?= $music['Music']['name']; ?></td>
            <td><?= $music['Music']['points']; ?></td>                          
            <td><a href="#" data-url="<?= $this->Html->url(array('controller' => 'musics', 'action' => 'play', $music['Music']['id'])); ?>" class="play"><span class="glyphicon glyphicon-play" aria-hidden="true"></span></a></td>
        </tr>
        <?php endforeach ?>
    </tbody>
</table>

Et le code js pour récupérer les données en ajax :

    $(window).scroll(function(){
        if( ( $(window).scrollTop() == $(document).height() - $(window).height() ) && busy === false ){     
            i++;
            busy = true;
            // $loader.show();
            $.get(document.location.href + '/page/' + i)
                .done( function(data){
                    var $data = $(data);
                    $content = $data.find('#infiniteScroll').html();
                    $('#infiniteScroll').append($content);                  
                    busy = false;
                    // $loader.hide();
                })
                .fail(function(){
                    // $loader.hide();
                });
        }
    });

Avez-vous une idée de la marche à suivre ?
Merci d'avance ;)

5 réponses


Maenhyr
Réponse acceptée

Salut,
tu connais le nombre d'éléments que tu affiches par page et tu as la page.
Du coup, si tu affiches 50 éléments par page :

position = (page - 1) * nbElementsParPage + $index;

page 1 : (1 - 1)50+1 à (1 - 1)50 + 50 -> de 1 à 50
page 2 : (2 - 1) 50 + 1 à (2 - 1) 50 + 50 -> de 51 à 100
....

Si c'est de l'ajax, fait plutot un script en php appelé par ta fonction ajax ?
En suite, fais-tu appelle à une base de donnée pour ta liste ?
Si c'est le cas, il faut voir du coté de LIMIT

Sinon, ton foreach() renvoie forcément tout; il faut donc que tu utilises un break; avant la fin de ton foreach() sur la condition du nombre d'élément que tu veux afficher.

Romano83
Auteur

Salut prbaron,
C'est une bonne solution mais je ne vois pas trop où il faudrait que je l'implémente... Ce serait au niveau de mon script JS ou au niveau de mon php ?
Je précise quand même que je suis sous CakePHP ;)

Vu le code que tu as fourni, il vaut mieux que tu fasses ça côté serveur, avant l'envoi des données.

Romano83
Auteur

Merci prbaron !
Tout fonctionne à merveille ;)