Comment corriger ma fonction "getBufferLimit" en PHP ???

Fermé
chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022 - Modifié le 18 août 2022 à 17:52
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 - 18 août 2022 à 21:31

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 à 12sé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 "getBufferLimitpour 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.

A voir également:

4 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
18 août 2022 à 18:23

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 ? )


1
chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022
Modifié le 18 août 2022 à 18:56

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 ???

0
chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022
Modifié le 18 août 2022 à 19:20

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.

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718 > chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022
18 août 2022 à 19:39

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 ?

0
chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022 > jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024
Modifié le 18 août 2022 à 19:55

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:

do{
	$bufferLimit-=1;
	$objectString=$this->recurseMenu($items,$bufferLimit);
}while(count($items)<6);    // ici, j'ai compté le nombre d'items et vérifié s'ils sont inférieurs à 6

Peut-être ???

Ceci correspond t-il à ce que vous voulez dire ???

Si non, veuillez me corriger s'il vous plaît.

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718 > chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022
18 août 2022 à 19:55

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

0
chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022
Modifié le 18 août 2022 à 20:39

Comment ceci:

$num=$i;


Alors ??? 

0
chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022
18 août 2022 à 20:42

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 ???

0
chegdev Messages postés 9 Date d'inscription jeudi 18 août 2022 Statut Membre Dernière intervention 18 août 2022
18 août 2022 à 20:49

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

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
Modifié le 18 août 2022 à 21:27
$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

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718 > jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024
18 août 2022 à 21:31

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.

0