Bonjour,

Ca fait quelque temps maintenant que je cherche a résoudre ceci, la fonction est encore en amélioration car j'apprend toujour, mais avant d'aller plus loin je cherche a ce que la base fonctionne.

J'ai un forum et une pagination et je la regle sur 10 réponses par pages et là j'ai un soucis si j'ai atteint le max de topic par pages ça créer la page 11 mais je reste redirigé vers la page 10 alors que logiquement je devrais être redirigé vers la page 11 au moment ou elle se créer pendant le poste.

Je ne vois pas comment faire la condition pour faire la redirection.

Ma pagination ce trouve sur github

ici c'est l'action :

    /**
     * postResponses post une nouvelle réponse et met a jour les dates topic et topic track 
     *
     * @param  int $page
     * @return self
     */
    public function postResponses(int $page):self
    {
        if(isset($_POST['topics'])){
            $this->app->isNotConnect('forum');
            $this->validator->methodPostValid('POST');
            $this->session->checkCsrf();
            $match = $this->router->matchRoute();
            $id = (int) $match['params']['id'];
            $userid = (int) $_SESSION['auth']->id;
            $content = strip_tags(trim($_POST['f_topic_content']));
            $this->validator->minLength($content, 100,'response content');
            if($this->validator->isValid())
            {
                $this->cnx->Request("INSERT INTO f_topics_reponse SET f_user_id = ?, f_topic_reponse = ?, f_topic_id = ?, f_topic_rep_date = NOW()", [$userid,$content, $id]);
                $lastid = $this->cnx->LastInsertID(); //pour la redirection
                //on met a jour la date du premier topic pour mettre en avant 
                $this->cnx->Request("UPDATE f_topics SET f_topic_message_date = NOW() WHERE id = ?",[$id]);
                //on update topic track en fonction de l'utilisateur
                sleep(1);
                //tester une redirection vers la page en court et redirigé dessus si une nouvelle page se créer
                $this->app->setFlash('Votre réponse a bien été poster');
                if(isset($_GET['page']) && $page > 1){
                    $this->app->redirect($this->router->routeGenerate('viewtopic',['id' => $match['params']['id'] .'?page='.$page.'#rep-' . $lastid]));
                }
                $this->app->redirect($this->router->routeGenerate('viewtopic',['id' => $match['params']['id'] .'#rep-' . $lastid]));
            }
            $this->errors = $this->validator->getErrors();
        }
        return $this;
    }

ici c'est le controller :

    public function viewtopic(int $id)
    {
        $pagination = new Pagination;
        $forum      = new ForumAction;
        $pagination->CountIdForpagination('SELECT COUNT(id) FROM f_topics_reponse WHERE f_topic_id = ?', $id);
        $pagination->isExistPage();
        $Response   = (new TopicAction())
                    ->postResponses($pagination->isPage())
                    ->viewNotView()
                    ->resolved()
                    ->sticky()
                    ->nbView()
                    ->getTopicExist();

        $this->render('viewtopic',compact('forum','Response','pagination'));
    }

En vous remerciant bonne soirée !

5 réponses


Salut, j'ai l'impession qu'il y a un problème avec cette condition :

if(isset($_GET['page']) && $page > 1)

Comment vérifies-tu qu'une nouvelle page 2 a été créée après l'ajout du commentaire 11 ? Là il reprend juste la valeur de $page avant l'ajout du dernier commentaire si j'inteprète correctement ton code...

Voici ce que tu peux tester:

  • Enlève la condition $page > 1 :

if (isset($_GET['page'])) {
$this->app->redirect($this->router->routeGenerate('viewtopic', ['id' => $match['params']['id'] .'?page='.$page.'#rep-' . $lastid]));
}

  • Check la variable $page et assures toi qu'elle contienne la bonne valeur après l'ajout d'une réponse. Assure-toi qu'elle est mise à jour conformément à la pagination de ton forum.

  • Déplace la redirection avant le message flash
    Dans ton code, tu rediriges après avoir défini le message flash. Inverse l'ordre pour éviter les interférences.

if (isset($_GET['page'])) {
$this->app->redirect($this->router->routeGenerate('viewtopic', ['id' => $match['params']['id'] .'?page='.$page.'#rep-' . $lastid]));
}

$this->app->setFlash('Votre réponse a bien été postée');

neecride
Auteur

Bonjour,

Pourquoi cette condition ? c'est juste un teste et c'est là tout le problème je sais que j'ai une get page donc j'ai essayez de faire une condition dessus pour que chaque message renvois vers la denière page si j'en ai une, mais c'étais pas avec get page car cette valeur n'existe pas toujours.

Premier cas de figure si j'ai 9 page j'envois un message alors que je suis sur la page 4 ça devrais logiquement me renvoyez vers la page 9 et pas la 4. Et si j'ai pas de page et bien ça créer pas de pagination.

Dexième cas si j'ai atteint le nombre max de page qui est 10 dans mon cas, l'ors de la réponse le script devrais savoir que j'ai incrémenté la pagination d'une nouvelle page qui n'existé pas avant et c'est vers celle-ci que je devrais être redirigé.

Reste a savoir quelle variable utilisé pour cette redirection, variable que j'envois dans mon controller !

c'est pourquoi j'avais testé cette condition car si je n'ai pas de page en get je dois resté sur la version sans page. Tout est dans la condition et la fameuse variable page mais pas celle dans l'url

j'ai deux variable la page courante et le total de page qui est calculé par la fonction ceil et c'est cette variable total que j'envois dans mon controller elle est censé compté le max total de page mais le problème c'est qu'elle ne change pas pendant l'envoie mais après du coup ça devrais pas.

Okay, du coup une idée pourrait être de calculer le nombre total de messages répartis sur tes différentes pages. Divisé par le nombre de messages que tu veux afficher par page tu auras une variable qui indiquera vers quel numéro de page l'utilisateur doit être renvoyé...

neecride
Auteur

Bonjour,

Voilà avec quoi je jongle dans ma pagination

Donc ici je prend le nombre d'ID des messages en bdd lié a un topic

    /**
     * CountIdForpagination compte le nombre d'enregistrement en base de donnée
     *
     * @param  mixed $statement
     * @param  mixed $attr
     * @return void
     */
    public function CountIdForpagination(string $statement, ?int $attr=null)
    {
        if(!is_null($attr)){
            if(is_null($this->count)){
                $smtp = $this->cnx->thisPdo()->prepare($statement);
                $smtp->execute([intval($attr)]);
                $this->count = (int) $smtp->fetch(PDO::FETCH_NUM)[0];
            }
            return $this->count;
        }else{
            if(is_null($this->count)){
                $this->count = (int) $this->cnx->thisPdo()->query($statement)->fetch(PDO::FETCH_NUM)[0];
            }
            return $this->count;
        }
    }

Ici on connait $this->countqui et caculé par la méthode au dessus et GetParam(2) correspond au paramètre de ma pagination qui est réglé dans la base de donnée ici c'est réglé sur 10 page et donc il me donne le nombre total de page (d'ailleur je dois renommé cette méthode)

    /**
     * isPage le total de page
     *
     * @return int
     */
    public function isPage(): int
    {
        return ceil($this->count/$this->parameters->GetParam(2));
    }

Normalement j'ai déjà tout avec isPage qui me renvoie bien le nombre total de page actuelle je divise 10 par count !! je ne suis pas assez bon en math mais ceil() arrondit au nombre supérieur, normalement je devrais juste mettre isPage dans ma redirection je ferais juste un isset get page si j'ai une page en GET qui existe j'utilise isPage car le nombre de page total est déjà calculé dans tout les cas par la methode CountIdForpagination .

si isPage et égal a 2 ou 11 je serais toujours redirigé ver page=2 ou page=11 topic/page=isPage même si j'en ai 100 puisse que ça calcule le nombre de page actuelle sur 10

mais je le fais déjà ici au moment de posté une réponse mais ça ne fonctionne pas : (lastid c'est l'ascenseur)

if(isset($_GET['page'])){
    $this->app->redirect($this->router->routeGenerate('viewtopic',['id' => $match['params']['id'] .'?page='. isPage() .'#rep-' . $lastid]));
}
//sinon version sans get page 
$this->app->redirect($this->router->routeGenerate('viewtopic',['id' => $match['params']['id'] .'#rep-' . $lastid]));

j'ai peut être un problème de logique mais c'est sensé fonctionné.