[smarty] Categorieën in een loop, hoe?
Hoe kan ik binnen een loop alle items groeperen op een bepaald categorie-veld?
Ik doel dus op een structuur zoals dit:
Op dit moment heb ik deze array in mijn console, met een categorienaam bij elk item.
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
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
Smarty_Variable Object (3)
->value = Array (9)
0 => Array (8)
nummer => "2101"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "2007-02-15"
status => "Gesloopt"
categorie => "Train A"
1 => Array (8)
nummer => "2102"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "0000-00-00"
status => "Gesloopt"
categorie => "Train A"
2 => Array (8)
nummer => "2103"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "0000-00-00"
status => "Gesloopt"
categorie => "Train B"
3 => Array (8)
nummer => "2104"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "2007-02-16"
status => "Gesloopt"
categorie => "Train C"
->nocache = false
->scope = "Smarty root"
->value = Array (9)
0 => Array (8)
nummer => "2101"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "2007-02-15"
status => "Gesloopt"
categorie => "Train A"
1 => Array (8)
nummer => "2102"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "0000-00-00"
status => "Gesloopt"
categorie => "Train A"
2 => Array (8)
nummer => "2103"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "0000-00-00"
status => "Gesloopt"
categorie => "Train B"
3 => Array (8)
nummer => "2104"
opmerkingen => ""
aflevering => "0000-00-00"
indienststelling => "0000-00-00"
gesloopt => "2007-02-16"
status => "Gesloopt"
categorie => "Train C"
->nocache = false
->scope = "Smarty root"
Mijn Smarty-code in mijn template is dit:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
{section name=nummers loop=$nummer_list}
<tr>
<td>
<a href="/spots/{$nummer_list[nummers].nummer}">{$nummer_list[nummers].nummer}</a>
</td>
{* Meer onrelevante informatie stond hier! etc... etc... *}
</tr>
{/section}
<tr>
<td>
<a href="/spots/{$nummer_list[nummers].nummer}">{$nummer_list[nummers].nummer}</a>
</td>
{* Meer onrelevante informatie stond hier! etc... etc... *}
</tr>
{/section}
Hoe kan dit dit toevoegen?
Ik weet wel dat dit in PHP met zoiets kan:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Maar hoe doe je dit in Smarty?
Kenners hier in this house?
Gewijzigd op 31/05/2017 22:13:07 door - Ariën -
Je zult ongeveer hetzelfde moeten doen als in PHP, dus iets met assign (om een waarde tijdens een loop te onthouden) en een if-statement.
Maar wat je dan doet is in Smarty nog eens dunnetjes overdoen wat je in PHP al kon doen. In dit geval lijkt het mij dat Smarty het verkeerde gereedschap is voor de klus.
Het meeste wat je in Smarty kunt doen kan ook prima in PHP zelf. Waarom zou je een alternatieve syntax voor dezelfde functionaliteit willen hebben? Los daarvan, je bent hier een hoop logica in een (pseudo) template-taal aan het proppen :/.
En als het de bedoeling is dat hier non-programmeurs aan kunnen freubelen... Maak in plaats hiervan een klasse waarmee je gecategoriseerde lijsten kunt configureren ofzo. Kan er ook niets gebroken worden.
Ben benieuwd waarom je bedacht hebt dat dit in Smarty zou moeten.
In mijn ogen is dit een meer een stukje logica wat prima in Smarty zou kunnen. Of het netjes is, is een tweede. Maar op welke manier zou jij het dan doen? En een hoop logica, dat is wel erg overdreven gezegd, Thomas.... Het zijn maar drie regeltjes met vergelijking en toewijzing.
Ikzelf heb inmiddels gevonden dat er een {assign} variabele in Smarty bestaat. Nu maar hopen dat deze overschreven kan worden. Dan zou het moeten werken, maar dat moet ik nog even uittesten.
Keep fingers crossed....
- Ariën - op 01/06/2017 08:29:39:
Mijn CMS gebruikt nu eenmaal Smarty, en dat pas je niet even zomaar aan ;-).
Dat betekent dan toch ook dat jij de architect bent? Dit was een bewuste ontwerpbeslissing dan? Wat is de redenatie hiervoor dan?
- Ariën - op 01/06/2017 08:29:39:
Maar op welke manier zou jij het dan doen?
Deze rommel simpelweg niet gebruiken.
- Ariën - op 01/06/2017 08:29:39:
Ikzelf heb inmiddels gevonden dat er een {assign} variabele in Smarty bestaat.
Dat gaf ik hierboven ook al aan. < 5 minuten googlen.
Gelieve je in het vervolg wat positiever op te stellen.
In ieder geval lijkt het probleem getackeld.
Gewijzigd op 01/06/2017 13:00:10 door - Ariën -
Als ik denk dat de aanpak onjuist is zal ik dat niet onder stoelen of banken steken. Smarty is een middel, geen doel. Blijkbaar is het voor jou toch belangrijk dat het op deze manier moet. Dit begrijp ik niet, en blijkbaar kun je dat ook niet echt motiveren.
Het ontwerp en de architectuur lijken mij juist belangrijk in dit vraagstuk. Immers, je had zelf al in PHP een oplossing klaarliggen, maar je probeert nu uit te zoeken hoe dit in Smarty zou moeten. Dit klinkt als het proberen een barricade te overkomen die je zelf hebt opgeworpen. Ik zou zeggen, neem de barricade weg dan heb je dit probleem in eerste instantie niet.
Daarbij gaf ik trouwens aan hoe het op te lossen zou moeten zijn (middels de assign constructie), misschien had ik duidelijker moeten zijn dat dit (ook) een Smarty-ding is.
Gewijzigd op 01/06/2017 13:16:30 door Thomas van den Heuvel
Planning, kosten, aanpassing aan de architectuur. Dat gaan niet altijd over één nacht ijs. En ik heb een vermoeden dat jij dat ook wel zou weten.
Probeer je meer op de vraag van de topicstarter te focussen i.p.v. vooral naar het geheel en de nadelen te kijken.
Hier de code voor de liefhebbers:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
{assign var="previousItem" value=""}
{section name=nummers loop=$data}
{if $previousItem != $data[nummers].Subcategory}
<tr>
<td colspan="6"><b>{$data[nummers].Subcategory}</b></td>
</tr>
{assign var="previousItem" value=$data[nummers].Subcategory}
{/if}
<tr>
<td>{! uitvoer van data hier *}</td>
</tr>
{section name=nummers loop=$data}
{if $previousItem != $data[nummers].Subcategory}
<tr>
<td colspan="6"><b>{$data[nummers].Subcategory}</b></td>
</tr>
{assign var="previousItem" value=$data[nummers].Subcategory}
{/if}
<tr>
<td>{! uitvoer van data hier *}</td>
</tr>
Gewijzigd op 01/06/2017 17:02:45 door - Ariën -
- Ariën - op 01/06/2017 13:18:26:
Planning, kosten, aanpassing aan de architectuur. Dat gaan niet altijd over één nacht ijs. En ik heb een vermoeden dat jij dat ook wel zou weten.
Zeker, en daarom denk ik ook altijd goed na voordat ik ergens aan begin.
Thomas van den Heuvel op 01/06/2017 13:22:13:
Zeker, en daarom denk ik ook altijd goed na voordat ik ergens aan begin.
- Ariën - op 01/06/2017 13:18:26:
Planning, kosten, aanpassing aan de architectuur. Dat gaan niet altijd over één nacht ijs. En ik heb een vermoeden dat jij dat ook wel zou weten.
Zeker, en daarom denk ik ook altijd goed na voordat ik ergens aan begin.
True, maar er bestaat ook vaak legacy-code, wat niet 1-2-3 om te bouwen is.
Smarty gebruik ik al 10 jaar met plezier, en ombouw kost mij voorlopig teveel tijd, hoewel ik het graag anders wil. Een template-set van honderden templates ombouwen is ook niet zo gedaan.
Lang leve roadmap's die je planning op pijl houden. Anders blijf je na 5 jaar bezig met hetzelfde project.
Gewijzigd op 01/06/2017 13:27:08 door - Ariën -
meer pijn het zal doen.
En hoe langer je wacht, hoe Thomas van den Heuvel op 01/06/2017 13:13:58:
Blijkbaar is het voor jou toch belangrijk dat het op deze manier moet. Dit begrijp ik niet, en blijkbaar kun je dat ook niet echt motiveren.
Misschien moet je dat toch maar eens gaan begrijpen. In mijn eerste reply gaf ik al aan dat het niet makkelijk anders kan. Waarom moet ik mij verantwoorden over mijn architectuur van mijn applicatie die jij misschien wel 'ruk' kan vinden, maar ik zelf niet?
Persoonlijk had ik het overigens prettiger gevonden als je minder op je eigen oplossing stond te hameren. Respecteer gewoon dat JOUW oplossing NIET ALTIJD even makkelijk kan worden uitgevoerd! Zie het als een berg zand die je wilt verplaatsen van de ene kant van de weg naar de andere kant. Je kan een shovel gebruiken en de boel in één keer verplaatsen. Maar dat kost een hoop werk om dat te huren en een hoop tijd om de weg af te laten zetten omdat je een vergunning moet hebben. Terwijl een kruiwagen op dit moment veel eenvoudiger is, maar wat meer tijd kost.
Een advies geven is prima. Maar geef dan ook twee wegen als je oplossing een basale aanpassing is: De beste weg en de snelste weg die een hobbelpad gaat.
Een beetje meedenken kan echt geen kwaad.
Anyway, voor nu is het opgelost!
Gewijzigd op 02/06/2017 18:24:09 door - Ariën -