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

Langage PHP Discussion :

Modifier ma fonction PHP "recurseMenu" pour afficher les menus par liste de 5


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut Modifier ma fonction PHP "recurseMenu" pour afficher les menus par liste de 5
    Bonjour.


    Je veux pouvoir afficher les liste de Menu dans ma fonction recurseMenu par 5 à chaque fois qu'on entre 99. Next comme ceci:

    [1, 2, 3, 4, 5] => 99 => [6, 7, 8, 9, 10] => 99 => [11, 12].

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    function toString() {
            $objectString='';
            $items=$this->children;
            $bufferLimit=(count($items)==0)?1:$this->getBufferLimit()+1;
            do {
                $bufferLimit-=1;
                $objectString=$this->recurseMenu($items,$bufferLimit);
            } while(strlen($objectString>160));
            $this->index=$bufferLimit;
            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) {
                    $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;
        }

    Là, avec la fonction recurseMenu, affiche la liste totale des 12 menus:

    Nom : USSD MENU 2.png
Affichages : 62
Taille : 11,3 Ko

    Et quand j'essaie d'ajouter une condition $i >= $bufferLimit avec break dans la boucle foreach de la fonction recurseMenu comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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;
                       }
                       ...
                       ...
                       ...
                    }
                }
    }
    Les menus s'affichent en 5 en premier. Mais quand on entre la touche 99, au lieu de voir SEULEMENT AFFICHER le 2ème bloc de la liste de 6, 7, 8, 9, 10, on voit apparaître ce 2ème bloc juste en dessous du 1er bloc 1, 2, 3, 4, 5 comme ceci (1, 2, 3, 4, 5, 6, 7, 8, 9, 10):

    Nom : USSD MENU.png
Affichages : 62
Taille : 22,4 Ko


    Comment donc modifier la fonction recurseMenu pour afficher les menus par liste de 5 au lieu de voir afficher en dessous du bloc de liste précédent à chaque fois qu'on entre la touche 99 (Next) ???

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    Ton code me paraît compliqué sans bonne raison.

    Tu veux un système de pagination, mais tu n'as pas les variables nécessaires pour cela.

    Ces variables pourraient être $page (1, 2, 3) et $itemsCount (5)
    => Pour la page X tu affiches les items de ((X - 1) * $itemsCount) à (X * $itemsCount - 1)

    Autre solution, tes liens sont toujours les mêmes non ? Rien ne t'empêche de faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $items = [
        1 => ['Send Money', 'Airtime/Data', ...],
        2 => ['Check balance', ...],
        ...
    ];
    et d'afficher le contenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $page = 2;
    foreach ($items[$page] as $item) {
        echo "<strong{$item}</strong>"; // "Check balance", ...
    }
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Ton code me paraît compliqué sans bonne raison.

    Tu veux un système de pagination, mais tu n'as pas les variables nécessaires pour cela.

    Ces variables pourraient être $page (1, 2, 3) et $itemsCount (5)
    => Pour la page X tu affiches les items de ((X - 1) * $itemsCount) à (X * $itemsCount - 1)
    Merci pour votre retour.
    Mais je suis confus.
    Comment l'adapter à mon code notamment à la fonction recurseMenu dans mon code ci-dessus pour réussir la pagination ???
    Ou pensez-vous que ce n'est pas dans recurseMenu que je dois faire cela ???

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Sachant que quand j'essaie de débuguer la variable $this->index dans la fonction recurseMenu comme suit:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    function recurseMenu($items,$bufferLimit) {
    		$objectString="<strong>". $this->getTitle() . "</strong>" . PHP_EOL;
    		$lastMenu=false;
    		if(count($items)>0) {
     
                            // DEBUG:
    			echo "<pre>";
    			echo $this->index;
    			echo "</pre>";
    			// FIN DEBUG
     
    			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;
    	}
    Le débugue de $this->index retourne successivement les valeur: 0, 5, 10, et 12 à chaque fois que j'entre dans le input la touche 99 pour afficher la liste de menu suivant.
    Donc, je suis arrivé à conclure que c'est la variable $this->index qui contient le bloc des pages.

    Comment donc en me servant de cette variable $this->index, réussir à paginer par liste de 5 à chaque entrée de la touche 99 qui représente le Next ???

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Je viens aussi de spliter le tableau des données des items qui est représentée par la variable $this->children dans la fonction getBufferLimit:

    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
     
    	function getBufferLimit() {
    		$len = count($this->children);
    		$margin = $len-$this->index;
     
    		echo "<pre>";
    		print_r(array_chunk($this->children, 5, true));
    		echo "</pre>";
     
    		if($margin<5)
    			return $this->index+$margin;
    		else
    			$childrenSplited = array_chunk($this->children, 5, true);
    			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".
    	}
    Et cela me retourne:

    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
    22
    23
    24
    25
    26
    27
    Array
    (
        [0] => Array
            (
                [0] => sendmoney
                [1] => airtimedata
                [2] => withdrawcash
                [3] => paybill
                [4] => buygoods
            )
     
        [1] => Array
            (
                [5] => checkbalance
                [6] => financialservices
                [7] => myaccount
                [8] => messages
                [9] => messages1
            )
     
        [2] => Array
            (
                [10] => messages2
                [11] => messages3
            )
     
    )
    Mon problème maintenant, c'est comment utiliser trouver la PageActuelle et faire un lien entre la PageActuelle et chaque index du $childrenSplited dans la bouche foreach ???

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/05/2014, 17h38
  2. Requête pour afficher les résultats par lot
    Par devalender dans le forum SQL
    Réponses: 4
    Dernier message: 26/10/2011, 15h26
  3. [Dates] Fonction pour afficher les dernières news
    Par Justone22 dans le forum Langage
    Réponses: 23
    Dernier message: 04/08/2008, 22h57
  4. Réponses: 7
    Dernier message: 30/12/2006, 01h26
  5. Réponses: 4
    Dernier message: 07/07/2006, 12h41

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