IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Ajax avec une architecture MVC en PHP


Sujet :

jQuery

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant en développement informatique
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant en développement informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Ajax avec une architecture MVC en PHP
    Bonjour,

    Je suis actuellement en train de créer un blog avec une architecture MVC. Je souhaite faire une sorte d'index qui affiche tous mes articles, mais à la place de mettre une pagination, j'ai décidé de faire un scroll infini avec JQuery. Le soucis c'est que j'ai quelque problème avec mon script qui au lieu de me retourner les articles au fur et a mesure du scroll, celui ci(le script) me fait une sorte d'inception de page(il m'affiche le contenu de la page plein de fois).
    Même si je n'aime pas foutre des blocs de codes complet, je vais fournir quelque parti afin de comprendre mon problème

    Voici ma vu qui comporte le script JQuery et l'affichage des articles (appelé post)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <script>
        $(window).scroll(function(){
            var offset = $('#container_01_block a:last').offset();
            if($(window).scrollTop()+ $(window).height() > $(window).height())
            {
                $("#loader").show();
                $.ajax({
                    url : "?lastid="+ $("#container_01_block a:last").attr("id"),
     
                    success : function(html)
                    {
                        $("#content").append(html);
                        $("#loader").hide();
     
                    }
                });
     
            }
     
        });
    </script>
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <div id="content">
    <?php
    foreach ($posts as $k => $v) {
    ?>
        <div id="container_01_block">
            <div id="categ"><a href="<?php echo Router::url("categorie/$v->categorie_id");?>"><?php echo strtoupper($v->categorie_name);?></a></div>
            <h2><?php echo $v->name; ?></h2><br/>
            <cite>le <?php echo $v->created;?></cite> par <strong><?php echo $v->user_id;?></strong><br/>
            <?php echo $v->intro;?>
            <a id="<?php echo $v->id ?>" href="<?php echo Router::url("posts/view/id:{$v->id}/slug:$v->slug");?>">Lire la suite &rarr;</a>
        </div>
    <?php
    }
    ?>
     
        <div id="loader">
            <img src="http://www.bandedessinee.info/zone/templates/tmpl_tc/images/loading.gif" alt="loader" title="" />
        </div>
    Voici le Controller avec la méthode Index qui dois récupérer le dernier id affiché:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php 
     
    class PostsController extends Controller{
     
     
        function index(){
            $perPage = 2;
            $this->loadModel('Post');
            if (isset($this->request->lastid)) {
                $conditions = array('online' => 1, 'type' => 'post', 'id <'=>($this->request->lastid));
            }
            else{
                $conditions = array('online' => 1, 'type' => 'post');
            }
            $d['posts'] = $this->Post->find(array(
                'conditions' => $conditions,
                'limit' => '0,'.$perPage
     
            ));
            $this->loadModel('User');
            $this->loadModel('Categorie');
            foreach ($d['posts'] as $k => $v) {
                $user_name  = $this->User->findFirst(array(
                    'fields' => 'login',
                    'conditions' => array('id' =>$d['posts'][$k]->user_id )
                ));
                $categ_name  = $this->Categorie->findFirst(array(
                    'fields' => 'name',
                    'conditions' => array('id' =>$d['posts'][$k]->categorie_id )
                ));
     
                $d['posts'][$k]->categorie_name = ucfirst($categ_name->name);
                $d['posts'][$k]->user_id = ucfirst($user_name->login);
                $d['posts'][$k]->created = date('d-m-Y à H:i',strtotime($d['posts'][$k]->created));
            }
     
            $d['total'] = $this->Post->findCount($conditions);
            $d['page'] = ceil($d['total']/$perPage);
            $this->set($d);
     
        }
    }
    Voila j'espère avoir bien exposé mon problème est qu'une solution existe

    Merci d'avance

  2. #2
    Membre régulier Avatar de vrd-74
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 76
    Points : 102
    Points
    102
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($(window).scrollTop()+ $(window).height() > $(window).height())
    Cette condition déclenchera une requête ajax à chaque fois que l'utilisateur scroll. Il serait plus logique de faire quelque chose en ce sens là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($("#container_01_block a:last").offset().top-$(window).height() < $(window).scrollTop())
    Essaye déjà ça, et assure toi que la requête se déclenche bien uniquement quand tu scroll jusqu'au dernier article.
    Si ce qui est retourné n'est toujours pas correct, il faut voir du côté du PHP (je ne l'ai pas regardé).

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Comme indiqué dans Les règles incontournables d'utilisation de ce forum, le code PHP auquel s'applique le code JavaScript ne sert à rien ! JavaScript travaille à partir d'une arborescence DOM, c'est à dire une structure HTML.

    Sinon, on remarque quand même que tu définis des id dans une boucle foreach, tu as du coup des id dupliqués ce qui n'est pas valide : un id doit être unique dans la page (je me demande même si c'est pas pour ça qu'on appelle cela un identifiant ).
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant en développement informatique
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant en développement informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    La requête se déclenche bien (dans la console j'ai bien le lien avec le dernier id)
    Mais le soucis actuellement c'est qu'il me recharge la totalité de la page plusieurs fois au lieu de m'afficher juste les nouveaux commentaires

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant en développement informatique
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant en développement informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oui je comprend bien que mon foreach fait deux fois le même travail, mais le soucis c'est qu'il me charge la totalité de la page et non pas juste les articles

  6. #6
    Membre régulier Avatar de vrd-74
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 76
    Points : 102
    Points
    102
    Par défaut
    En reregardant, je viens de voir ceci :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    foreach ($posts as $k => $v) {
    ?>
        <div id="container_01_block">

    Et ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     url : "?lastid="+ $("#container_01_block a:last").attr("id"),
    Ton id "container_01_block" est dans ta boucle. Donc déjà duplicate id, puis $("#container_01_block a:last") récupére le dernier lien du premier élément container_01_block.

Discussions similaires

  1. Évoluer vers une architecture MVC en PHP
    Par Community Management dans le forum Langage
    Réponses: 66
    Dernier message: 31/05/2019, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo