Comment corriger ma fonction "getBufferLimit" en PHP ???
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
J'ai un petit nouveau bug de changement d'affichage de menu de mon projet USSD (ce que j'appelle: "PAGINATION") qui pourtant fonctionnait avant que je ne fasse des modifications dans une autre partie de mon projet.
Comme vous pouvez le constater sur la capture d'écran que je viens de vous envoyer, la Page suivante (7 à 12) sélectionnée en bleu sur cette capture d'écran, du Menu apparait juste en dessous de l'index alors que quand on envoie le message "99" qui actionne l'option "Next", la 1ère liste de Menu de l'index par défaut (1 à 6) devrait disparaître et laisser place à la liste de Menus suivante (7 à 12).
LE CODE QUI GERE L'AFFICHAGE DES MENUS EST LE SUIVANT:
function toString(){ $objectString=''; $items=$this->children; $bufferLimit=(count($items)==0)?1:$this->getBufferLimit()+1; echo "<pre>"; echo $this->getBufferLimit()+1; echo "</pre>"; do{ $bufferLimit-=1; $objectString=$this->recurseMenu($items,$bufferLimit); }while(strlen($objectString>160)); $this->index=$bufferLimit; /* echo "<pre>"; echo $this->index; echo "</pre>"; */ /* echo "<pre>"; echo $objectString; echo "</pre>"; */ return $objectString; } function getBufferLimit() { $len=count($this->children); $margin=$len-$this->index; if($margin<5) return $this->index+$margin; else return $this->index+5; //Permet de définir le Nombre de Menu à afficher au niveau de l'index "/ussd/receiver.php" dont le Menu est "/ussd/MyTree.php". } function recurseMenu($items,$bufferLimit) { $objectString="<strong>". $this->getTitle() . "</strong>" . PHP_EOL; $lastMenu=false; if(count($items)>0) { foreach ($items as $i => $item) { if ($i >= $bufferLimit){ break; } $num = $i + 1; //get node by name $userSessions = $_SESSION['userSessions']; $currUserSession = $userSessions[$this->address]; $node = $currUserSession->getNode($item); $title = $node->getTitle(); $objectString .= PHP_EOL . $num . '. ' . $title; } } else { $objectString=$objectString.PHP_EOL . 'NO DATA AVAILABLE, TRY AGAIN LATER'; } $lastMenu=$bufferLimit==count($items); $objectString=$objectString . PHP_EOL . PHP_EOL . "<strong>0. Exit</strong>"; if($this->getParent() != '0'){ $objectString=$objectString . PHP_EOL . "<strong>#. Back</strong>"; } if($lastMenu===false){ $rem=count($items)-$this->index; $objectString=$objectString . PHP_EOL . "<strong>99. Next (".$rem.")</strong>"; } return $objectString; }
Quand je cherche à débuguer "$this->getBufferLimit()+1" dans la fonction "toString" ci-dessus comme ceci:
echo "<pre>"; echo $this->getBufferLimit()+1; echo "</pre>";
La 1ère entrée de "99. Next", me retourne 6.
La 2ème entrée de "99. Next", me retourne 11.
La 3ème entrée de "99. Next", me retourne 13.
Je précise qu'il y actuellement 12 Menus en tout que je cherche à afficher par lot de 5 à chaque fois que j'actionne le "99. Next".
Comment donc modifier le "return $this->index+5" dans ma fonction "getBufferLimit" pour qu'il affiche SEULEMENT les 6 prochaines liste de Menu même quand on clique sur l'action "99. Next" au lieu de les afficher en dessous des précédents comme on le voit actuellement sur la capture d'écran ci-dessus sachant qu'elle est également utilisé dans la fonction "toString" ci-dessous ???
Merci de m'aider s'il vous plaît.
- Comment corriger ma fonction "getBufferLimit" en PHP ???
- Fonction si et - Guide
- Easy php - Télécharger - Divers Web & Internet
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Expert php pinterest - Télécharger - Langages
4 réponses
Bonjour,
Dans ta boucle, tu testes bien si tu es arrivé au "max" à afficher .. mais par contre, tu ne testes pas si tu es bien au min ...
Tu boucles sur tous tes items à chaque fois ( en commençant par le 0 ... alors que tu devrais commencer au next non ? )
Je viens d'essayer et ça ne marche touche pas la navigation entre les menus et les sous-menus. Du coup, je suis revenu avec mon foreach.
Ne pourrez-vous m'aider à limiter par lot de 5 maximum l'affichage de la liste des menus ???
Je demande juste de m'aider à ne afficher que 5 liste de Menu à chaque appel de "99. Next" au lieu d'ajouter comme sur les 5 existants à chaque fois
$start = $bufferLimit -5 ; $end = $bufferLimit; foreach ($items as $i => $item) { if ($i >= $end){ break; } if($i >= $start && $i < $end ){ $num = $i + 1; //get node by name $userSessions = $_SESSION['userSessions']; $currUserSession = $userSessions[$this->address]; $node = $currUserSession->getNode($item); $title = $node->getTitle(); $objectString .= PHP_EOL . $num . '. ' . $title; } }
Ca pourrait ressembler à un truc du genre
D'ailleurs, si ta variable $items est un array, tu pourrais aussi essayer de ne traiter que les données souhaitées en passant par un array_slice
https://www.php.net/array_slice
De cette façon.. pas besoin de parcourir tout le tableau pour trouver le début et la fin...
Tu ne ferais ton foreach ( sans les if ) que sur les éléments que tu souhaites afficher.
Merci jordane45 pour la réponse. Un exemple de code m'aidera grandement car je ne comprends encore rien. J'ai vraiment besoin d'un exemple de code pour mieux cerner votre explication.
Comment donc procéder s'il vous plaît ???
Comment devrais tester si je suis arrivé au min dans ma boucle ???
Et laquelle des boucle est le foreach dans la fonction recurseMenu ou le do{ ... } while() dans la fonction "toString" ???
J'ai vraiment besoin d'exemple et d'éclairage s'il vous plaît.
Comprends tu ce que fais ton code ? Est-ce toi qui l'a écrit ?
Dans la boucle do while .. tu fais visiblement une limitation par rapport au nombre de caractères (160 ) .. pas en fonction du nombre d'item du menu à afficher...
D'ailleurs.. si j'utilise le mot "item" depuis tout à l'heure.. ce n'est pas pour rien..
Bref, dans ton foreach, tu vérifies bien si tu as atteins l'indice "max" à afficher... non ?
Merci encore une fois pour le retour.
Bien sur que dans ma boucle do{ ... } while() j'ai limité le nombre de caractère à 160. Mais devrais procéder autrement vous pensez ???
Comme ceci:
Peut-être ???
Ceci correspond t-il à ce que vous voulez dire ???
Si non, veuillez me corriger s'il vous plaît.
Non ce n'est pas ce que j'ai voulu dire ...
As tu compris pourquoi je parle d'items ? Si la réponse est non.. et bien.. relis simplement ton code ... ça devrait te sauter aux yeux