Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Templates > Smarty
Smarty Forum d'entraide sur le moteur de templates Smarty. Avant de poster -> FAQ Smarty et Cours Smarty
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2008, 22h10   #1
Invité de passage
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 4
Points : 4
Par défaut 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 :
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 :
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 :
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
ibasticour est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2008, 22h29   #2
Membre éprouvé
 
Homme
Inscription : août 2006
Messages : 313
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2006
Messages : 313
Points : 497
Points : 497
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 :
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
Phelim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2008, 01h21   #3
Invité de passage
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 4
Points : 4
Hum....

Pas bête!
Je vais essayer (en simplifiant un peu ^^)
Code :
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 :
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!
ibasticour est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 16h16   #4
Membre éprouvé
 
Homme
Inscription : août 2006
Messages : 313
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2006
Messages : 313
Points : 497
Points : 497
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.
Phelim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web