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

Bibliothèques et frameworks PHP Discussion :

[Smarty] Array multidimentionnel non symétrique


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut [Smarty] Array multidimentionnel non symétrique
    Bonjour à tous,
    je tien à m'excuser si je me suis tromper d'endroit pour poster ce post, je suis un peu perdu avec tous les forum.

    Bref, je suis entrain de créé un site web (sans blague) avec Smarty.

    Le soucis, c'est que j'ai un menu, composé de différents bloque qui sont affiché ou pas selon la page.

    Le menu est composé comme suite:
    - section1 (définni selon la page, permet de choisir les block

    - block1
    - lien 1
    - url
    - texte

    - lien 2
    - url
    - texte
    - block 2
    -lien 3
    -url
    -texte
    -section 2
    -block 3
    -lien 4
    -url
    -texte
    ....



    Le soucis, c'est que avec smarty, j'ai un tableau assé compliquer!
    Et comme la liste n'est pas complète, je vais me perdre à cout sûr!

    Ici avec smarty j'y suis arrivé comme suite:

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    <?php
    switch($MySection[1]) { 
    	// Audio
    		case 'audio' : 
    			$MTitre = array(  $M['accueil'], 
    							 'Episodes',
    							 'Personnages'
    							); 
    			break;
    	// Jeu
    		case 'jeu' : $MTitre = array(); 
    			break;
    	// Forum
    		case 'forum' : $MTitre = array(); 
    			break;
    	// Default / Accueil / Histoire
    		default: $MTitre = array( 'Programmation de Mendrock',
    								  $M['accueil'], 
    								  'Test'); 
    			break;
    }
    $smarty->assign('MenuTitre',$MTitre);
     
    unset($MySection); unset($jsFMTitreile);
    ################################
    ### Nom des liens
     
     
    switch($SelectMenu) { 
    	// Audio
    		case 'audio' : 
    			$MName = array(
    				array(  $M['accueil'], 
    						$M['photos']
    				),
    				array(  $M['accueil'], 
    						$M['photos']
    				),
    				array(  $M['accueil'], 
    						$M['photos']
    				)
    			);
    			break;
    	// Jeu
    		case 'jeu' : 
    			$MName = array(); 
    			break;
    	// Forum
    		case 'forum' : 
    			$MName = array(); 
    			break;
    	// Default / Accueil / Histoire
    		default: 
    			$MName = array(
    				array(  'Balises', 'infos site'),
    				array(  $M['accueil'], 
    						$M['photos'], 
    						$M['livreOr'], 
    						$M['aideMendrock'], 
    						$M['merci'], 
    						$M['dedierJoe'], 
    						$M['download']
    				),
                	array(  $M['accueil'], 
    						$M['photos'], 
    						$M['livreOr']
    				)
    			);
    			break;
    }
     
    $smarty->assign('MenuNom', $MName);
     
    unset($MName); 
    ################################
    ### Lien des liens
    switch($SelectMenu) { 
    	// Audio
    		case 'audio' : 
    			$MLink = array(
    				array(  '?page=indexAudio', 
    						'?page=audio'
    				),
    				array(  '?page=indexAudio', 
    						'?page=audio'
    				),
    				array(  '?page=indexAudio', 
    						'?page=audio'
    				)
    			);
    			break;
    	// Jeu
    		case 'jeu' : 
    			$MLink = array(); 
    			break;
    	// Forum
    		case 'forum' : 
    			$MLink = array(); 
    			break;
    	// Default / Accueil / Histoire
    		default: 
    			$MLink = array(
    				array('?page=balise', '?page=infoCodagePhpPourSeb'),
    				array(  '?page=indexAccueil', 
    						'?page=photos', 
    						'?page=accueil', 
    						'?page=accueil', 
    						'?page=accueil', 
    						'?page=accueil', 
    						'?page=accueil'
    				),
                	array(  '?page=indexAccueil', 
    						'?page=accueil', 
    						'?page=accueil'
    				)
    			);
    			break;
    }
     
    $smarty->assign('MenuLink', $MLink);
    unset($SelectMenu); unset($MLink); 
    $smarty->assign('linktop','<a href="' .URLlast. '#top">Top</a>');
    ?>
    Et le template qui va avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {section name=titre loop=$MenuTitre}
    <div class="menuBlock">
        <div class="titreMenu">{$MenuTitre[titre]}</div>
        <ul>
            {section name=nom loop=$MenuNom[titre]}
                <a href="{$MenuLink[titre][nom]}"><li>{$MenuNom[titre][nom]}</li></a>
            {/section}
        </ul>
    </div>
    {/section}
    J'ai déjà essayé avec un tableau simple (car ici il y en a deux) mais je n'yu suis pas arriver.
    J'ai également pensé à un menu fait à partir de xml, mais alors je n'arrive pas à utiliser les variables de langue.


    Par ailleur, j'ai aussi essayer en POO, mais déjà dans l'édition des class je me plante pour dire que un lien appartient à un block.
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <?php
    class lien {
    	protected $url = "";
    	protected $texte = "";
     
    	function __construct($url, $texte){
    		$this->url = $url;
    		$this->texte = $texte;
     
    	}
     
    	function getUrl(){
    		return $this->url;
    	}
    	function setUrl($NewUrl){
    		$this->url = $NewUrl;
    	}
    	function getTexte(){
    		return $this->Texte;
    	}
    	function setTexte($NewTexte){
    		$this->texte = $NewTexte;
    	}
    }
    class block {
     
    	protected $titre = "";
     
    	function __construct($titre){
    		$this->titre = $titre;
    		$this->liens = new ArrayObject();
    	}
     
    	function getTitre(){
    		return $this->titre;
    	}
    	function setTitre($newTitre){
    		$this->titre = $newTitre;
    	}
     
     
    	function addLink($url){
    	    $this->liens->offsetSet(url, $url->getUrl()); 
    	    $this->liens->offsetSet(texte, $url->getTexte()); 
    	}
     
    	function getLink(){
    		return $this->liens;
    	}
    }
     
    class section {
     
    	protected $titre = "";
     
    	function __construct($titre){
    		$this->titre = $titre;
    		$this->block = new ArrayObject();
    	}
     
    	function getTitre(){
    		return $this->titre;
    	}
    	function setTitre($newTitre){
    		$this->titre = $newTitre;
    	}
     
     
    	function addBlock($block){
    	    $this->block->offsetSet(titre, $block->getTitre()); 
    	    $this->block->offsetSet(liens, $block->getLink()); 
    	}
    	function getBlock(){
    		return $this->block;
    	}
    }
    ?>
    Pouvez vous m'aider?
    (A choisir je prefere utiliser la poo, mais toutes les bonnes méthode sont bonne...)
    Merci d'avance

  2. #2
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2006
    Messages : 317
    Par défaut
    J'ai ressorti un code smarty utilisé justement pour la restitution de menu récursif (ça remonte à vraiment longtemps)

    Voici le code epuré de tout le superficiel

    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
     
    	<div>
    	<{foreach item=Menu from=$block.Menu}>
     
    		<{if $Menu.Decalage<$Menu.DecalageS}>
    				<div><a>&nbsp;<{$Menu.Nom}></a></div>
    				<div>
    		<{elseif $Menu.Decalage==$Menu.DecalageS}>
    				<div><a>&nbsp;<{$Menu.Nom}></a>
    				</div>
    		<{else $Menu.Decalage>$Menu.DecalageS}>
    				<div><a>&nbsp;<{$Menu.Nom}></a>
    				</div><{$Menu.DivFin}>
    		<{/if}>
    	<{/foreach}>
    	</div></div>
    On utilisait un tableau 1D que l'on parcourait de type (DecalageCourant,DecalageSuivant,Nom,nombre DivFin).
    Si je me souviens bien l'algo :
    - 1 ere condition : si la ligne suivante est plus identé que la ligne courante
    - 2 eme condition : Si la ligne suivante est au meme niveau que la ligne courante
    - 3 eme condition : C'est le cas le plus critique. Si le decalage suivant est moins important que le decalage courant(parfois 3 niveaux de differences) on complete avec les div calculés lors du php.

    En esperant que ça t'aide

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut
    Hum....

    Pas bête!
    Je vais essayer (en simplifiant un peu ^^)
    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
    <?php
    // type 0 = block
    // type 1 = url
    // type 2 = texte de l url
    switch($_SESSION['section']){
       case 'section1' :  $monMenu = array (     
                                             array('type' => 0, 'ul' =>0, 'Nom' => 'Block1'),
                                                 array('type' => 1, 'ul' =>0, 'Nom' => 'url1'),
                                                 array('type' => 2, 'ul' =>0, 'Nom' => 'texte1'),
                                                 array('type' => 1, 'ul' =>0, 'Nom' => 'url2'),
                                                 array('type' => 2, 'ul' =>0, 'Nom' => 'texte2'),
                                             array('type' => 0, 'ul' =>1, 'Nom' => 'Block2'),
                                                array('type' => 1, 'ul' =>0, 'Nom' => 'url3'),
                                                array('type' => 2, 'ul' =>1, 'Nom' => 'texte3')
                                  ); break;
       case 'section2' :  $monMenu = array ( 
                                             array('type' => 0, 'ul' =>0, 'Nom' => 'Block3'),
                                                 array('type' => 1, 'ul' =>0, 'Nom' => 'url4'),
                                                 array('type' => 2, 'ul' =>1, 'Nom' => 'texte4')
                                        );
    $smarty->assign('TheMenu', $monMenu);
    ?>
    Et mon code smarty serait alors:
    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
     
    <div id="menu">
    {foreach item=Menu from=$TheMenu}		
        {if $Menu.type == 0}
            {if $Menu.ul == 1}
                    </ul>
                </div>
            {/if}
            <div class="menuBlock">
                <div class="titreMenu">{$Menu.Nom}</div>
                <ul>
        {elseif $Menu.type == 1}
                    <li><a href="{$Menu.Nom}">
        {else $Menu.type == 2}
                    {$Menu.Nom}</li>
            {if $Menu.ul == 1}
                    </ul>
                </div>
            {/if}
        {/if}
    {/foreach}
    </div>
    Voilà, j'essaye et je vous dis quoi demain ou... tantôt, au plus tard
    Merci


    edit: Après correction de quelques erreurs de syntaxe (default pour le sxitch par exemple)
    Cela fonctionne à merveille, merci !


    Néamoins, (par hasard...)
    Y a-t-il moyen d'utiliser la poo pour faire la meme chose, et non e procedural?
    Si oui comment? (simple question ^^)
    Encore merci!

  4. #4
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2006
    Messages : 317
    Par défaut
    Oui, il y'a moyen de construire un objet récursif mais le gros soucis vient de smarty qui ne gere que le procédural. (Apres, on peut toujours ecrire une fonction smarty pour la restitution).

    Au final, la solution la plus rapide est un tableau 1D.

Discussions similaires

  1. cookie = Array et non variable
    Par Titum dans le forum Langage
    Réponses: 2
    Dernier message: 11/11/2010, 17h33
  2. comparer 2 array oui / non
    Par jeorcal dans le forum Langage
    Réponses: 11
    Dernier message: 05/08/2010, 10h50
  3. Creation d'un array multidimentionnel avec la reflection
    Par faldir dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 18/03/2010, 10h16
  4. [Tableaux] Mettre à jour un array multidimentionnels (2)
    Par arnaudperfect dans le forum Langage
    Réponses: 6
    Dernier message: 04/02/2009, 11h53
  5. [Smarty] Boucle récursive Smarty array()
    Par yanice dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 01/02/2008, 23h12

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