hulp gevraagd met smarty-probleempje
Ik heb een probleempje waar ik niet uit kom, ligt ongetwijfeld aan mij.
Wat is het geval: Ik heb een menu met hoofdcategeorie-en en subcategorie-en wat ik wil weergeven. Een genest menu dus.
Ik heb met php gegevens uit een database opgevraagd en dat gaf als resultaat:
Code (php)
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
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
Array (2)
hoofd => Array (2)
0 => Array (3)
main_id => "3"
maincat_desc => "A/V reparatieparts"
publish => "1"
1 => Array (3)
main_id => "1"
maincat_desc => "Halfgeleiders"
publish => "1"
sub => Array (4)
0 => Array (5)
subcat_id => "3"
main_id => "3"
subcat_desc => "Audio parts"
referer => "#"
publish => "1"
1 => Array (5)
subcat_id => "4"
main_id => "3"
subcat_desc => "Video parts"
referer => "#"
publish => "1"
2 => Array (5)
subcat_id => "2"
main_id => "1"
subcat_desc => "Fet"
referer => "#"
publish => "1"
3 => Array (5)
subcat_id => "1"
main_id => "1"
subcat_desc => "Transistor"
referer => "#"
publish => "1"
hoofd => Array (2)
0 => Array (3)
main_id => "3"
maincat_desc => "A/V reparatieparts"
publish => "1"
1 => Array (3)
main_id => "1"
maincat_desc => "Halfgeleiders"
publish => "1"
sub => Array (4)
0 => Array (5)
subcat_id => "3"
main_id => "3"
subcat_desc => "Audio parts"
referer => "#"
publish => "1"
1 => Array (5)
subcat_id => "4"
main_id => "3"
subcat_desc => "Video parts"
referer => "#"
publish => "1"
2 => Array (5)
subcat_id => "2"
main_id => "1"
subcat_desc => "Fet"
referer => "#"
publish => "1"
3 => Array (5)
subcat_id => "1"
main_id => "1"
subcat_desc => "Transistor"
referer => "#"
publish => "1"
Dit stuur ik naar smarty in de variabele menudata.
Mijn (test)-template ziet er op dit moment als volgt uit:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
{foreach from=$menudata item=maincat key=main_id}
{$main_id}{$maincat_desc}
{foreach from=$catitem item=subcat}
{$subcat.subcat_id}
{$subcat.subcat_desc}<br>
{/foreach}
<br><br>
{/foreach}
{$main_id}{$maincat_desc}
{foreach from=$catitem item=subcat}
{$subcat.subcat_id}
{$subcat.subcat_desc}<br>
{/foreach}
<br><br>
{/foreach}
Ik krijg echter met geen enkele mogelijkheid de hoofdkategorie-en met daarbij de subkategorie-en op volgorde te zien.
Het resultaat wat ik nu krijg is:
Ik moet echter krijgen:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
3 A/V Reparatieparts
3 Audio Parts
4 Video parts
1 Halfgeleiders
2 Fet
1 Transistor
3 Audio Parts
4 Video parts
1 Halfgeleiders
2 Fet
1 Transistor
Kan iemand mij svp op weg helpen ?
Gewijzigd op 01/01/1970 01:00:00 door Marcel K
Niemand die Smarty gebruikt zeker ?
bump.
Hartelijk dank weer.
Voor de modjes: sluit deze topic maar svp.
Dan kan je de oplossing zeker wel posten.
En waarom dit topic sluiten?
Ten tweede kan het altijd handig zijn om dergelijke oplossingen te vermelden.
Ten derde zou ik de structuur van je array's anders gedaan hebben, zodat je WEL makkelijk met Smarty dit kon weergeven. Jij gaf namelijk 2 losse lijstjes die verder niets met elkaar te maken hebben (jij denkt van wel, maar smarty weet dat niet). Indien je alles in 1 lijstje als bv zo iets zou gedaan hebben, waren je problemen meteen opgelost:
Code (php)
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
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
Array
(
[0] => Array
(
[naam] => Parts
[id] => 3
[subs] => Array
(
[0] => Array
(
[naam] => Diode
[id] => 5
)
[1] => Array
(
[naam] => Transistor
[id] => 10
)
[2] => Array
(
[naam] => FET
[id] => 7
)
[3] => Array
(
[naam] => Thyristor
[id] => 8
)
)
)
[1] => Array
(
[naam] => Categorin
[id] => 2
[subs] => Array
(
[0] => Array
(
[naam] => Halfgeleiders
[id] => 4
)
[1] => Array
(
[naam] => Audio
[id] => 9
)
[2] => Array
(
[naam] => Video
[id] => 6
)
)
)
)
(
[0] => Array
(
[naam] => Parts
[id] => 3
[subs] => Array
(
[0] => Array
(
[naam] => Diode
[id] => 5
)
[1] => Array
(
[naam] => Transistor
[id] => 10
)
[2] => Array
(
[naam] => FET
[id] => 7
)
[3] => Array
(
[naam] => Thyristor
[id] => 8
)
)
)
[1] => Array
(
[naam] => Categorin
[id] => 2
[subs] => Array
(
[0] => Array
(
[naam] => Halfgeleiders
[id] => 4
)
[1] => Array
(
[naam] => Audio
[id] => 9
)
[2] => Array
(
[naam] => Video
[id] => 6
)
)
)
)
Hou dergelijke opmerkingen svp maar voor je, het voegt niets toe aan dit forum.
@Hipska
1. no comment
2. zie hieronder
3. de structuur zoals ik liet zien is misschien niet geheel volgens de regels, maar die van jou gaat imho ook niet overeenkomen met hetgeen ik wil bereiken.
De oplossing hieronder werkt precies zoals ik het wil, daarmee wil ik niet zeggen dat het de enigste juiste oplossing is.
Ik sta open voor opbouwende kritiek.
Mijn oplossing:
PHP-stukje
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Glossy Categorie-Menu inlezen */
/**********************************************************/
$sql = "SELECT * FROM cat_main WHERE publish='1' ORDER BY maincat_desc ASC";
if (!($result = $db->sql_query($sql)))
{
die('Could not obtain catmain-menu information');
}
while ($regel = $db->sql_fetchrow($result)) {
$hoofd[]= $regel;
$sql2="SELECT * FROM cat_sub WHERE main_id='".$regel['main_id']."' AND publish='1' ORDER BY subcat_desc";
if (!($result2 = $db->sql_query($sql2)))
{
die('Could not obtain catsub-menu information');
}
while ($regel2 = $db->sql_fetchrow($result2)) {
$sub[]=$regel2;
}
}
$smarty->assign(array('hoofdcats' => $hoofd,'subcats' => $sub));
/**********************************************************/
$sql = "SELECT * FROM cat_main WHERE publish='1' ORDER BY maincat_desc ASC";
if (!($result = $db->sql_query($sql)))
{
die('Could not obtain catmain-menu information');
}
while ($regel = $db->sql_fetchrow($result)) {
$hoofd[]= $regel;
$sql2="SELECT * FROM cat_sub WHERE main_id='".$regel['main_id']."' AND publish='1' ORDER BY subcat_desc";
if (!($result2 = $db->sql_query($sql2)))
{
die('Could not obtain catsub-menu information');
}
while ($regel2 = $db->sql_fetchrow($result2)) {
$sub[]=$regel2;
}
}
$smarty->assign(array('hoofdcats' => $hoofd,'subcats' => $sub));
Template stukje
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class="glossymenu">
{foreach from=$hoofdcats item=maincat key=main_id}
<a class="menuitem submenuheader" href="#" class="ajaxify" target"#content">{$maincat.maincat_desc}</a>
<div class="submenu">
<ul>
{foreach from=$subcats item=subcat}
{if $maincat.main_id eq $subcat.main_id}
<li><a href="{$subcat.referer}" class="ajaxify" target"#content">{$subcat.subcat_desc}</a></li>
{/if}
{/foreach}
</ul>
</div>
{/foreach}
</div>
{foreach from=$hoofdcats item=maincat key=main_id}
<a class="menuitem submenuheader" href="#" class="ajaxify" target"#content">{$maincat.maincat_desc}</a>
<div class="submenu">
<ul>
{foreach from=$subcats item=subcat}
{if $maincat.main_id eq $subcat.main_id}
<li><a href="{$subcat.referer}" class="ajaxify" target"#content">{$subcat.subcat_desc}</a></li>
{/if}
{/foreach}
</ul>
</div>
{/foreach}
</div>
Wat als je nu nog een niveau dieper wil gaan, ga je dan nog een tabel aanmaken? Niet echt handig..
Toevallig is hier net een aardige tutorial over geschreven
Ik zal die tut eens bestuderen, bedankt voor de tip.
Voor elk hoofdmenu dat er bestaat ga jij telkens het lijstje met alle mogelijke submenu's overlopen. Dat lijkt me nogal veel vertraging en nutteloos serverload te genereren.
Heb je een verbeterd voorstel ?
Ik ben maar een beginner, dus iedere hulp is welkom.
En de tutorial die Willem-Jan voorstelde kan je ook eens doornemen.