[resolu] pagination du contenu via $_POST ou $_GET

février 2023 modifié dans Entraide

Bonjour,

Quelqu'un a t-il l'astuce pour passer une variable en $_POST ou $_GET dans une page statique à elle même ?
L'idée est de faire une pagination .

Pour le moment , j'utilise un cookie, initialisé via javascript puis lu via PHP en me servant d'un select. Ce n'est pas des plus sexy, mais c'est fonctionnel si cookies okay :)

Ses deux variables sont traités et nettoyés en amont de l'affichage, sont-ils accessible via un hook au travers d'une page statique ou cela est déjà trop tard dans le processus de traitement?

Cdt


Cordialement,
gcyrillus

Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonsoir,
    Dans le thème kzCleanlook, tu as le template static-contact . La fonction processContact() gère le retour du formulaire de contact par la méthode POST.
    Pas compatible avec PHP 8.0 à cause de la constante FILTER_SANITIZE_STRING.
    Pour une pagination la méthode GET me semble plus pertinente. A traiter avant le include 'header.php'; dans ce cas.

  • Merci @bazooka07 .

    Si je comprend bien, j'en deduis qu'il faudrait alors générer cette page via un plugin et ensuite la faire squatter le tableau des pages statiques si l'on veut faire ça proprement. Je vais y réfléchir, la méthode get semble effectivement la manière la plus appropriée.

    Merki


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Non c'est un template (gabarit en français) dans ton thème.
    Et chacunes des pages statiques concernées doivent utiliser ce template.
    Le problème est de savoir comment enchainer les pages statiques. Le plus simple est de jouer avec les urls des pages statiques :
    mon-beau-sujet-01
    mon-beau-sujet-02
    mon-beau-sujet-03
    ...
    mon-beau-sujet-10
    mon-beau-sujet-11

    Supposons que l'url de la page courante soit "mon-beau-sujet-03". Pour connaitre les pages précèdente et suivante,il suffit avec preg_replace() de remplacer 03 par 02 et 04 respectivement.
    Le plus dur est de détecter la dernière page. Il faut filtrer le tableau $plxMotor->aStats pour ne garder que les éléments avec une url avec le regex "#^mon-beau-sujet-\d+$#" et prendre le dernier élément du résultat.

  • février 2023 modifié

    @bazooka07 En fait, l'idée n'est pas de faire une pagination entre pages statiques , mais de faire une pagination dans le contenu d'une unique page statique.
    Dans mon cas ce contenu est extrait avec la fonction lastArtList() à laquelle je donne un $max démesuré qui est tempéré en amont par un array_slice() sur le tableau des articles dispos dans la/les catégorie(s) filtrée(s). C'est l'une des valeurs à appliquer au calcul du premier offset dearray_slice() qui m’intéresse pour faire ma tranche que je souhaite transmettre d'une page à une autre sans me soucier du nombre d'enregistrement total et à afficher par pages.
    Si passer d'une statique à une autre est une option, elle n'est pas perenne dans ce cas, le nombre potentiel d'articles filtrés est évolutif.

    En racourcis, je fait


    // sauvegarde aFIles avant modif $saveAfiles = $this->plxMotor->plxGlob_arts->aFiles; // modif aFiles , celles que je garde $motif = '/^[0-9]{4}.((?:[0-9]|home|,)*(?:'.$filtre.')(?:[0-9]|home|,)*).[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/'; $newAfiles = $this->plxMotor->plxGlob_arts->query($motif, 'art', 'rsort', 0, 9999, 'before'); // ... initialisation nombre d'item par page, nbre de page, etc .. // je me tranche un steak $newAfiles = array_slice($newAfiles, $start,$nbPerPage); $this->plxMotor->plxGlob_arts->aFiles = $newAfiles; // .... // je met le steak sur le grill $plxShow->lastArtList(); // affichage d'une tranche // ... // reinitialisation , servis, je laisse PluXml reprendre son cours $this->plxMotor->plxGlob_arts->aFiles = $saveAfiles;

    En gros, c'est $start que je voulais passé par l’URL de préférences. La page en ligne concernée est https://pluxthemes.com/listing-des-themes :(

    Cdt


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Il faut passer $page en paramètre, et calculer $start =($page - 1) * $nbPerPage;
    Tu devrais regarder comment fonctionne la pagination dans core/admin/index.php. C'est vers la fin du script PHP.

  • @bazooka07 je décroche pour le moment, mais une fois de plus, il semblerait que PluXml est tellement résilient qu'il à déjà tout prévu et que c'est toujours plus simple qu'il n'y parait.

    Je reviens sur le sujet dés que j'ai attrapé ce lièvre :)

    Cdt


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • février 2023 modifié

    Hello, je reviens rapidement. Je m’était au préalable intéressé à $plxShow->pagination() avec laquelle je n'avais réussi qu'a levé des messages d'erreur dans $plxGlob->search` ligne 137 sans y remédier sauf à mettre un beau chaos dans l'affichage.

    En testant , sans passer en plugin, la fonction de pagination de plxAdmin, je génère bien les liens de paginations , mais avec une page statique qui n'existe pas sitôt qu'un ?page=x ou &page=x est passé dans l'url.

    J'en reste pour le moment avec mon cookie coté front et en page statique. Cela semble fonctionner comme attendu.

    Cdt


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    février 2023 modifié

    Contenu de la page statique pour faire le job. Affiche les articles pour une catégorie donnée ( voir $catId ) :

    <?php
    # $this is $plxShow
    
    $catId = '005'; # Choose the right category
    $motif = '#^\d{4}\.(home,|pin,|\d{3},)*' . $catId . '(,\d{3})*\.\d{3}\.\d{12}\.[\w-]+\.xml$#';
    $tri = $this->plxMotor->aCats[$catId]['tri'];
    $bypage = $this->plxMotor->aCats[$catId]['bypage'];
    # $this->plxMotor->getPage() is protected
    $page = preg_match('#\bpage(\d*)#',$this->plxMotor->get, $capture) ? intval($capture[1]) : 1;
    $start = ($page - 1) * $bypage;
    $publi = 'before';
    $aFiles = $this->plxMotor->plxGlob_arts->query($motif, 'art', $tri, $start, $bypage, $publi);
    
    # On boucle sur les articles
    $artsList = [];
    foreach($aFiles as $v){
            $art = $this->plxMotor->parseArticle(PLX_ROOT . $this->plxMotor->aConf['racine_articles'] . $v);
            if(!empty($art)) {
                    $artsList[] = $art;
            }
    }
    $this->plxMotor->plxRecord_arts = new plxRecord($artsList);
    while($this->plxMotor->plxRecord_arts->loop()) {
    ?>
            <article>
                    <h2><?php $this->artTitle('link'); ?></h2>
                    <?php $this->artChapo(); ?>
            </article>
    <?php
    }
    
    # On sauvegarde certains valeurs de plxMotor au cas où...
    $saved_motif = $this->plxMotor->motif;
    $saved_bypage = $this->plxMotor->bypage;
    $saved_page = $this->plxMotor->page;
    
    $this->plxMotor->motif = $motif;
    $this->plxMotor->bypage = $bypage;
    $this->plxMotor->page = $page;
    ?>
            <nav id="pagination" class="pagination text-center">
    <?php $this->pagination(); ?>
            </nav>
    <?php
    $this->plxMotor->motif = $saved_motif;
    $this->plxMotor->bypage = $saved_bypage;
    $this->plxMotor->page = $saved_page;
    ?>
    

    Attention aux anti-slashs pendant la sauvegarde de la page statique.
    On doit pouvoir faire quelques optimisations.

  • février 2023 modifié

    Bonsoir, @bazooka07 .

    Bon du coup, face à un code qui fonctionne à coup sur. j'ai enfin compris pourquoi toutes mes tentatives ont échouées.

    Le fautif principal : MyBetterUrls qui rend inopérant la pagination et reste invariablement en page 1 (ou me renvoi un 404 en faisant autrement que le code proposé ci-dessus) .
    puis , l'autre fautif, moi même donc, dans mes autres tests, j'avais aussi omis la fonction urlRewrtite() (comptant sur le htaccess faisant son office en me renvoyant sur une URL réécrite) .
    Je n'avais à priori aucunes chances de faire fonctionné quoi que ce soit sans commencé en partant d'une config sans urlrewriting activé, j'ai aussi encore du mal à me situer dans le déroulé du code en continuant à appelé $plxShow au lieu de $this dans une page statique.Je cumule :).

    En raccourcie, la pagination dans une page statique a tendance à coincé des que MyBetterUrl est activé et configuré.

    Cdt


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • février 2023 modifié

    Pour finaliser ce post résolu:

    Avec le code de @bazooka07 et qui fonctionne avec MyBetterUrls, qui permet donc d'utiliser la fonction pagination() de PluXml, voici ce que j'ai qui fonctionne. avec ou sans urlrewriting activé et avec ou sans MyBetterUrls dans PluXml 5.8.9

    J'ai du reprendre le $motif que j'utilisais pour ma version à cookie pour qu'il fonctionne et du utiliser $_SERVER['REQUEST_URI'] pour le rendre compatible avec MyBetterUrls .

    <?php
    
    # initialisation de(s) catégories à trier et nombre article par page
    $catId = '001'; # Choose the right category
    $bypage = 10;
    # tri 
    $tri = 'rsort';
    $publi = 'before';
    
    # filtrage des articles
    $motif = '/^[0-9]{4}.((?:[0-9]|home|,)*(?:'. $catId.')(?:[0-9]|home|,)*).[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';      
    
    # on affiche quelle page ?
    $page = preg_match('#\\bpage(\\d*)#',$_SERVER['REQUEST_URI'], $capture) ? intval($capture[1]) : 1;
    
    echo '<p>Page '.$page.'</p><hr>'; // Si on veut affiché un truc ici.
    
    #calcul ou commencer l'extraction
    $start = ($page - 1) * $bypage;
    #on met à jour le tableau des articles à afficher
    $aFiles =  $this->plxMotor->plxGlob_arts->query($motif, 'art', $tri, $start, $bypage, $publi);
    
    
    # On sauvegarde certains valeurs de plxMotor au cas où...
    $saved_motif = $this->plxMotor->motif;
    $saved_bypage = $this->plxMotor->bypage;
    $saved_page = $this->plxMotor->page;
    
    #Maj temporaire des valeurs qui nous interessent
    $this->plxMotor->motif = $motif;
    $this->plxMotor->bypage = $bypage;
    $this->plxMotor->page = $page;
    ?>
        <nav id="pagination" class="pagination text-center">
            <?php $this->pagination(); ?>
        </nav>
    <?php
    # On boucle sur les articles pour recuperer leurs contenus et infos
    $artsList = [];
    foreach($aFiles as $v){
            $art = $this->plxMotor->parseArticle(PLX_ROOT . $this->plxMotor->aConf['racine_articles'] . $v);
            if(!empty($art)) {
                    $artsList[] = $art;
            }
    }
    $this->plxMotor->plxRecord_arts = new plxRecord($artsList);
    ?>
    <div class="art_listing">
    <?php
    # Affichage des articles filtrés
    while($this->plxMotor->plxRecord_arts->loop()) {
    ?>
            <article>
                    <h2><?php $this->artTitle('link'); ?></h2>
                    <?php $this->artChapo(); ?>
            </article>
    <?php
    }
    
    ?>
    </div>
        <nav id="pagination" class="pagination text-center">
            <?php $this->pagination(); ?>
        </nav>
    <?php
    $this->plxMotor->motif = $saved_motif;
    $this->plxMotor->bypage = $saved_bypage;
    $this->plxMotor->page = $saved_page;
    ?>
    
    

    Pour la version avec un select, lastartList() et 1 cookie (la navigation d'une page à l'autre n'apparait pas dans l'url ! et un retour en arrière demandera a revalider la requête)

    <div class="pagination-article">
    <?php
    
    #mise en plce du cookie pour determiner les articles dans la page à affichée
    if(isset($_COOKIE['page']))  $_COOKIE['page']  =trim($_COOKIE['page'] );
    else  $_COOKIE['page'] = 1;
    
    #selection de la categorie à affichée
    $catId = '001';
    
    #sauvegarde du tableau aFiles avant filtrages
    $saveAfiles = $this->plxMotor->plxGlob_arts->aFiles;
    
    # motif de filtrages
    $motif = '/^[0-9]{4}.((?:[0-9]|home|,)*(?:'.$catId.')(?:[0-9]|home|,)*).[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
    
    # modification temporaire de notre tableau d'articles dispo
    $newAfiles = $this->plxMotor->plxGlob_arts->query($motif, 'art', 'rsort', 0, 9999, 'before');   
    
    
    # initialisation  de la pagination
    $nbPerPage = 25;    
    $nbThemes = count($newAfiles);
    $nbPage =  ceil($nbThemes / $nbPerPage );
    
    # positionement de depart dans le tableau 
    $start = $nbPerPage *  $_COOKIE['page']  - $nbPerPage;
    
    # on ne garde qu'une partie des articles 
    $newAfiles =  array_slice($newAfiles, $start,$nbPerPage);
    # seconde mise à jour du tableau , prés pour affichage
    $this->plxMotor->plxGlob_arts->aFiles = $newAfiles;
    
    $this->catList('','<h3>#art_nb  Articles.</h3>',$catId); // Si on veut affiché un truc ici
    
    
    
    
    
    # creation et initialisation de notre select pour la navigation
    echo '<form method="post"><label><sup>'.$nbPerPage.'</sup>/<small>pages</small> </label><select id="viewPage"  onchange="document.cookie = \\'page=\\'+this.value ;this.form.submit()">';
    for ($x = 1; $x <= $nbPage ; $x++) {
    $selected="";
    $pagenb= $x;
    if($_COOKIE['page'] == $pagenb) $selected='selected="selected"';
      echo '<option value="'.$x.'" '.$selected.'>page '.$pagenb.'</option>';
    }
    echo '</select></form>'; 
    
    $plxShow->lastArtList('<div>#art_thumbnail <div>#art_chapo() </div><a href="#art_url" title="#art_title">voir</a></div>', 9999, $catId );
    
    #show nav
    echo '<form method="post" style="grid-column:1/-1"><label><sup>'.$nbPerPage.'</sup>/<small>pages</small> </label><select id="viewPage"  onchange="document.cookie = \\'page=\\'+this.value ;this.form.submit()">';
    for ($x = 1; $x <= $nbPage ; $x++) {
    $selected="";
    $pagenb= $x;
    if($_COOKIE['page'] == $pagenb) $selected='selected="selected"';
      echo '<option value="'.$x.'" '.$selected.'>page '.$pagenb.'</option>';
    }
    echo '</select></form>'; 
    
    #on redonne la main à pluxml avec tous ces articles
    $this->plxMotor->plxGlob_arts->aFiles = $saveAfiles;
    ?>
    </div>
    
    

    Voilà, les deux ont de commun de modifier le tableau des articles chargé par PluXml. Il est nécessaire de le sauvegarder avant de le modifier pour trier les articles et de le restaurer en fin de script afin que toutes les autres fonctions de PluXml y trouvent les informations dont elles ont besoin (dans la sidebar par exemple).

    Entre les deux options, je ne sais pas trop laquelle choisir, le select me va bien finalement , mais je ne le conseillerais pas forcément car il soumet un formulaire à chaque changement de page sans l'inscrire dans l'URL(pas de référencement possible des autres pages), dépend d'un cookie et peut-être agaçant.

    Cdt

    ps, j'affiche deux fois la pagination en début et fin, car je suis fainéant de la roulette à souris :p


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

Connectez-vous ou Inscrivez-vous pour répondre.